ke_junjie
2025-06-04 bb6e2230bb8ded3c5546bc4e4c282ee343754475
修改
已添加288个文件
46306 ■■■■■ 文件已修改
qqjf-Web/.env.development 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/.env.production 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/.eslintrc.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/.gitignore 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/.prettierrc.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/babel.config.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/jsconfig.json 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/package-lock.json 15387 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/package.json 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/public/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/public/index.html 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/App.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/Layout/components/Appmain.vue 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/Layout/components/Sidebar/SidebarItem.vue 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/Layout/components/Sidebar/index.vue 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/Layout/components/Sidebar/item.vue 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/Layout/components/TagsView/ScrollPane.vue 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/Layout/components/TagsView/index.vue 294 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/Layout/components/index.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/Layout/components/navbar.vue 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/Layout/index.vue 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/Didproject.js 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/ProductionLine.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/avroRecord.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/cass-line.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/dept.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/enter.js 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/enterchoose.js 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/equipmenttask.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/forklift.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/forklifttasks.js 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/intype.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/inventory.js 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/maintask.js 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/manage.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/materials.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/outbound.js 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/output.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/palte.js 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/position.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/quotation.js 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/register.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/reportforms.js 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/role-auth.js 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/role.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/stacker.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/statistics.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/taskrecord.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/viewdata.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/api/warning.js 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/assets/css/TimesNewRomanPSMT24163565.ttf 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/assets/heard/heard.jpg 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/assets/heard/heard1.jpg 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/assets/heard/logbg.jpg 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/assets/heard/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/assets/login/bg.jpg 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/components/SvgIcon/index.vue 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/components/TreeTable/eval.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/components/TreeTable/index.vue 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/components/TreeTable/readme.md 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/components/autoscroll/eleResize.js 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/components/autoscroll/index.vue 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/components/choose/addchoose.vue 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/components/choose/choose.vue 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/components/chooseRelevanceFinishedPart/index.vue 358 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/components/chooseUser/index.vue 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/components/index.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/components/modal/index.vue 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/components/tableContainer/index.vue 654 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/components/tableContainer/tableHead.js 2084 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/components/title/index.vue 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/index.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/404.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/align-right.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/bug.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/chart.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/clipboard.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/component.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/dashboard.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/documentation.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/drag.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/edit.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/education.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/email.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/example.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/excel.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/exit-fullscreen.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/eye-open.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/eye.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/form.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/fullscreen.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/guide.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/him.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/homePage.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/icon.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/in-storage.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/inbound.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/international.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/language.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/link.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/list.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/lock.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/logo.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/message.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/money.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/nested.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/out-storage.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/outbound.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/password.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/pdf.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/people.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/peoples.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/qq.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/record-chart.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/search.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/shopping.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/size.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/skill.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/star.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/storage.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/sys.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/tab.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/table.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/theme.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/trade.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/tree-table.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/tree.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/user.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/wechat.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/icons/svg/zip.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/main.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/mixins/layout.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/mixins/resize.js 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/permission.js 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/plugins/cdn.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/plugins/mapServer.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/router/_import_development.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/router/_import_production.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/router/index.js 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/router/modules/base.js 379 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/settings.js 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/store/getters.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/store/index.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/store/modules/permission.js 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/store/modules/setting.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/store/modules/tagsView.js 195 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/store/modules/user.js 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/styles/elemen-ui.scss 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/styles/index.scss 705 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/styles/innner-circles.scss 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/styles/sidebar.scss 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/styles/transition.scss 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/styles/variables.scss 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/utils/auth.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/utils/axios.js 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/utils/date.js 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/utils/debounce.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/utils/excel.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/utils/getPageTitle.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/utils/index.js 357 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/utils/input.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/utils/request.js 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/utils/sessionStorage.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/utils/throttle.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/utils/vab.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/utils/validate.js 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/vendor/Blob.js 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/vendor/Export2Excel.js 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Didproject/components/classify.vue 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Didproject/components/didinquer.vue 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Didproject/components/didnav.vue 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Didproject/components/lineEcharts.vue 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Didproject/components/notice.vue 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Didproject/components/pieEcharts.vue 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Didproject/index.vue 263 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Home/components/lefttop.vue 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Home/components/meterEchart.vue 273 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Home/components/movablerateechart.vue 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Home/components/product.vue 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Home/components/rateequipment.vue 204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Home/components/sourceEchart.vue 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Home/components/tasktimeecharts.vue 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Home/components/turnoverEchart.vue 207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Home/components/warehouseechart.vue 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/Home/index.vue 296 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/basicInfo/base/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/basicInfo/base/stacker/index.vue 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/basicInfo/base/warning/index.vue 204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/basicInfo/components/baseinquer.vue 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/basicInfo/components/stackerEdit.vue 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/basicInfo/components/warningEdit.vue 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/basicInfo/equipmenttask/avroRecord/index.vue 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/basicInfo/equipmenttask/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/basicInfo/equipmenttask/piler/index.vue 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/basicInfo/equipmenttask/rgvtask/index.vue 217 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/basicInfo/index.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/dataview/classified.vue 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/dataview/components/lineEcharts.vue 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/dataview/movablerate.vue 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/dataview/output.vue 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/dataview/product.vue 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/dataview/rateequipment.vue 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/dataview/statelibrary.vue 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/dataview/taskbeat.vue 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/dataview/tasktime.vue 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/dataview/turnover.vue 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/dataview/warehouse.vue 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/dataview/workpiece.vue 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/inbound/components/enterEdit.vue 544 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/inbound/components/enterchoose.vue 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/inbound/components/inboundinuqer.vue 240 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/inbound/components/partschoose.vue 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/inbound/components/quotaionEdit.vue 345 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/inbound/components/quotaion_relevanceEdit.vue 381 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/inbound/index.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/inbound/purchase/confirm_welding/index.vue 734 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/inbound/purchase/enter/index.vue 290 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/inbound/purchase/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/inbound/purchase/input_finished_product/index.vue 736 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/inbound/purchase/intype/index.vue 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/inbound/purchase/quotation/index.vue 342 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/login/index.vue 360 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/outbound/components/outinquer.vue 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/outbound/components/plantEdit.vue 435 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/outbound/index.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/outbound/regulator/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/outbound/regulator/plant/index.vue 321 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/Taskbeat/index.vue 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/classified/index.vue 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/index.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/movablerate/index.vue 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/output/index.vue 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/product/index.vue 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/rateequipment/index.vue 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/statelibrary/index.vue 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/statistics/components/eltablecolumn.vue 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/statistics/components/statisticsinquer.vue 273 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/statistics/components/statisticstable.vue 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/statistics/index.vue 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/tasktime/index.vue 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/turnover/index.vue 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/warehouse/index.vue 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/reportforms/workpiece/index.vue 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/statistics/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/base/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/base/inventory/index.vue 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/base/materials/index.vue 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/base/viewdata/index.vue 233 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/components/casslineEdit.vue 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/components/chooseEdit.vue 262 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/components/forkliftEdit.vue 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/components/inventoryEdit.vue 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/components/palteEdit.vue 263 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/components/positionEdit.vue 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/components/storage-inquer.vue 424 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/components/storageEdit.vue 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/components/viewdataInquer.vue 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/components/viewdatainfo.vue 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/index.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/setting/cass-line/index.vue 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/setting/choose/components/limitModal.vue 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/setting/choose/index.vue 365 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/setting/forklift/index.vue 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/setting/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/setting/palte/index.vue 196 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/setting/position/index.vue 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/setting/storage-area/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/storage/setting/storage/index.vue 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/system/index.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/system/user/components/deptEdit.vue 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/system/user/components/manageEdit.vue 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/system/user/components/roleEdIt.vue 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/system/user/components/topinquer.vue 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/system/user/dept/index.vue 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/system/user/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/system/user/manage/index.vue 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/system/user/role/index.vue 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/system/user/roleAuth/index.vue 360 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/task/components/forklifttasksEdit.vue 254 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/task/components/maintask-inquer.vue 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/task/components/maintaskEdit.vue 283 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/task/forklifttasks/index.vue 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/task/index.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/task/maintask/index.vue 430 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/task/taskdocuments/index.vue 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/task/taskrecord/index.vue 345 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/src/views/test/index.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/vue.config.js 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
qqjf-Web/.env.development
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
# just a flag
ENV = 'development'
# base api
VUE_APP_BASE_API = '/'
qqjf-Web/.env.production
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
# just a flag
ENV = 'production'
# base api
#VUE_APP_BASE_API = 'http://10.103.11.236:8085'  #正式发布用这个 11网段
# VUE_APP_BASE_API = 'http://10.103.9.200:8085'  #正式发布用这个 9网段
#VUE_APP_BASE_API = 'http://192.168.137.200:8085'  #测试环境用这个
VUE_APP_BASE_API = 'http://localhost:6099'
# VUE_APP_BASE_API = '/'
qqjf-Web/.eslintrc.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
module.exports = {
  root: true,
  env: {
    node: true
  },
  extends: ['plugin:vue/essential', 'eslint:recommended', '@vue/prettier'],
  parserOptions: {
    parser: 'babel-eslint'
  },
  rules: {
    'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    semi: 'off',
    'no-unused-vars': [2, { vars: 'all', args: 'none' }],
    quotes: 'off',
    'no-dupe-keys': 'off'
  },
  overrides: [
    {
      files: ['**/__tests__/*.{j,t}s?(x)', '**/tests/unit/**/*.spec.{j,t}s?(x)'],
      env: {
        jest: true
      }
    }
  ]
};
qqjf-Web/.gitignore
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
.DS_Store
node_modules
/dist
.history
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
qqjf-Web/.prettierrc.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
module.exports = {
  trailingComma: 'none',
  tabWidth: 2,
  semi: true,
  singleQuote: true,
  printWidth: 120,
  arrowParens: 'avoid'
};
qqjf-Web/babel.config.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ]
}
qqjf-Web/jsconfig.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
        "@/*": ["src/*"]
    }
  },
  "exclude": ["node_modules", "dist"]
}
qqjf-Web/package-lock.json
¶Ô±ÈÐÂÎļþ
ÎļþÌ«´ó
qqjf-Web/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
{
  "name": "wbtoubiao",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint",
    "start": "npm run serve"
  },
  "dependencies": {
    "@microsoft/signalr": "^5.0.5",
    "axios": "^0.21.1",
    "compression-webpack-plugin": "^5.0.1",
    "core-js": "^3.6.5",
    "dayjs": "^1.11.1",
    "echarts": "^5.1.2",
    "el-table-infinite-scroll": "^1.0.10",
    "element-ui": "^2.15.8",
    "file-saver": "^2.0.5",
    "jquery": "^3.6.0",
    "js-cookie": "^2.2.1",
    "nprogress": "^0.2.0",
    "qs": "^6.5.2",
    "screenfull": "^5.1.0",
    "vue": "^2.6.11",
    "vue-count-to": "^1.0.13",
    "vue-router": "^3.2.0",
    "vuedraggable": "^2.24.3",
    "vuex": "^3.4.0",
    "xlsx": "^0.17.0"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "~4.5.0",
    "@vue/cli-plugin-eslint": "~4.5.0",
    "@vue/cli-plugin-router": "~4.5.0",
    "@vue/cli-plugin-vuex": "~4.5.0",
    "@vue/cli-service": "~4.5.0",
    "@vue/eslint-config-prettier": "^6.0.0",
    "babel-eslint": "^10.1.0",
    "eslint": "^6.7.2",
    "eslint-plugin-prettier": "^3.3.1",
    "eslint-plugin-vue": "^6.2.2",
    "node-sass": "^4.12.0",
    "prettier": "^2.2.1",
    "sass-loader": "^8.0.2",
    "script-loader": "^0.7.2",
    "svg-sprite-loader": "^6.0.5",
    "vue-template-compiler": "^2.6.11",
    "webpack": "^4.46.0"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "eslint:recommended",
      "@vue/prettier"
    ],
    "parserOptions": {
      "parser": "babel-eslint"
    },
    "rules": {}
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead"
  ]
}
qqjf-Web/public/favicon.ico
qqjf-Web/public/index.html
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <!-- <title><%= webpackConfig.name %></title> -->
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <div id="app"></div>
    <!-- <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
    <script type="text/javascript" src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
    <% } %> -->
    <!-- built files will be auto injected -->
  </body>
</html>
qqjf-Web/src/App.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
<template>
  <div id="app" @click="clicked">
    <router-view />
  </div>
</template>
<script>
import { getStorage, setStorage, clearStorage } from '@/utils/sessionStorage';
export default {
  name: 'App',
  data() {
    return {
      lTime: new Date().getTime(), // æœ€åŽä¸€æ¬¡ç‚¹å‡»çš„æ—¶é—´
      ctTime: new Date().getTime(), //当前时间
      tOut: 10 * 60 * 1000 //超时时间10min
    };
  },
  mounted() {
    // window.setInterval(this.tTime, 1000);
  },
  methods: {
    clicked() {
      // this.lTime = new Date().getTime(); //当界面被点击更新点击时间
    }
  }
};
</script>
<style lang="scss"></style>
qqjf-Web/src/Layout/components/Appmain.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
<!--  -->
<template>
<div id='appmain'>
</div>
</template>
<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import ã€Šç»„件名称》 from '《组件路径》';
export default {
//name放入模板名,方便在其他地方引用
name: '',
//import引入的组件需要注入到对象中才能使用
components: {},
data() {
//这里存放数据
return {
};
},
//监听属性 ç±»ä¼¼äºŽdata概念
computed: {
},
//生命周期 - åˆ›å»ºå®Œæˆï¼ˆå¯ä»¥è®¿é—®å½“前this实例)
created() {
},
//生命周期 - æŒ‚载完成(可以访问DOM元素)
mounted() {
},
//方法集合
methods: {
},
//监控data中的数据变化
watch: {
},
//如果页面有keep-alive缓存功能,这个函数会触发
activated() {
},
}
</script>
<style lang='scss' scoped>
/* @import url(); å¼•入公共cssç±» */
</style>
qqjf-Web/src/Layout/components/Sidebar/SidebarItem.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
<!--  -->
<template>
  <div class="sidebarItem">
    <template v-if="!itemRoute.children">
      <el-menu-item :index="itemRoute.path">
        <item :icon="itemRoute.meta.icon" :title="itemRoute.meta.title" />
      </el-menu-item>
    </template>
    <el-submenu v-else ref="subMenu" :index="itemRoute.path" popper-append-to-body>
      <template slot="title">
        <item :icon="itemRoute.meta.icon" :title="itemRoute.meta.title" />
      </template>
      <sidebar-item v-for="item in itemRoute.children" :key="item.path" :itemRoute="item" />
    </el-submenu>
  </div>
</template>
<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import ã€Šç»„件名称》 from '《组件路径》';
import item from './item';
export default {
  //name放入模板名,方便在其他地方引用
  name: 'SidebarItem',
  props: ['itemRoute'],
  //import引入的组件需要注入到对象中才能使用
  components: { item },
  data() {
    //这里存放数据
    return {};
  },
  //监听属性 ç±»ä¼¼äºŽdata概念
  computed: {},
  //生命周期 - åˆ›å»ºå®Œæˆï¼ˆå¯ä»¥è®¿é—®å½“前this实例)
  created() {},
  //生命周期 - æŒ‚载完成(可以访问DOM元素)
  mounted() {},
  //方法集合
  methods: {},
  //监控data中的数据变化
  watch: {},
  //如果页面有keep-alive缓存功能,这个函数会触发
  activated() {}
};
</script>
<style lang="scss" scoped>
/* @import url(); å¼•入公共cssç±» */
</style>
qqjf-Web/src/Layout/components/Sidebar/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
<!--  -->
<template>
  <div>
    <el-scrollbar wrap-class="scrollbar-wrapper">
      <div class="heard pointer" @click="homeclick">
        <img :class="{ isimg: isCollapse }" class="heard-img" src="../../../assets/heard/heard.jpg" alt="" />
      </div>
      <el-menu
        :default-active="activeMenu"
        :background-color="variables.menuBg"
        :text-color="variables.menuText"
        :unique-opened="true"
        :active-text-color="variables.menuActiveText"
        :collapse-transition="false"
        :collapse="isCollapse"
        mode="vertical"
        router
      >
        <sidebar-item v-for="route in routes" :key="route.path" :itemRoute="route" />
      </el-menu>
    </el-scrollbar>
  </div>
</template>
<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import ã€Šç»„件名称》 from '《组件路径》';
import { mapGetters } from 'vuex';
import variables from '@/styles/variables.scss';
import { getStorage, setStorage } from '@/utils/sessionStorage';
import SidebarItem from './SidebarItem';
export default {
  //name放入模板名,方便在其他地方引用
  name: '',
  //import引入的组件需要注入到对象中才能使用
  components: { SidebarItem },
  data() {
    //这里存放数据
    return {};
  },
  //监听属性 ç±»ä¼¼äºŽdata概念
  computed: {
    ...mapGetters(['sidebar']),
    variables() {
      return variables;
    },
    routes() {
      let baseRoute = this.$store.state.permission.routes;
      if (baseRoute.length > 13) {
        return baseRoute[13].children;
      }
    },
    activeMenu() {
      const route = this.$route;
      const { meta, path } = route;
      console.log(route);
      if (meta.activeMenu) {
        return meta.activeMenu;
      }
      return path;
    },
    // activeMenu() {
    //   return this.$route.matched[1].path;
    // },
    isCollapse() {
      return this.sidebar;
    }
  },
  //生命周期 - åˆ›å»ºå®Œæˆï¼ˆå¯ä»¥è®¿é—®å½“前this实例)
  created() {},
  //生命周期 - æŒ‚载完成(可以访问DOM元素)
  mounted() {},
  //方法集合
  methods: {
    //跳转首页
    homeclick() {
      // const { href } = this.$router.resolve({
      //   path: '/home'
      // });
      // window.open(href, '_blank');
    }
  },
  //监控data中的数据变化
  watch: {},
  //如果页面有keep-alive缓存功能,这个函数会触发
  activated() {}
};
</script>
<style lang="scss" scoped>
/* @import url(); å¼•入公共cssç±» */
.heard {
  text-align: center;
  padding: 20px 0px;
  background-color: #3a405a;
  border-bottom: 1px solid rgb(72, 94, 122);
  .heard-img {
    width: 60px;
    height: 60px;
    border-radius: 30px;
    transition: all 1s ease 0s;
  }
  .isimg {
    width: 24px;
    height: 24px;
    border-radius: 15px;
  }
}
</style>
qqjf-Web/src/Layout/components/Sidebar/item.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
<script>
export default {
  name: 'MenuItem',
  functional: true,
  props: {
    icon: {
      type: String,
      default: ''
    },
    title: {
      type: String,
      default: ''
    }
  },
  render(h, context) {
    const { icon, title } = context.props;
    const vnodes = [];
    if (icon) {
      if (icon.includes('el-icon')) {
        // vnodes.push(<i class={[icon, 'sub-el-icon']} />);
        vnodes.push(<i class={icon} />);
      } else {
        vnodes.push(<svg-icon icon-class={icon} />);
      }
    }
    if (title) {
      vnodes.push(<span slot="title">{title}</span>);
    }
    return vnodes;
  }
};
</script>
<style scoped>
.sub-el-icon {
  color: currentColor;
  width: 1em;
  height: 1em;
}
</style>
qqjf-Web/src/Layout/components/TagsView/ScrollPane.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,94 @@
<template>
  <el-scrollbar ref="scrollContainer" :vertical="false" class="scroll-container" @wheel.native.prevent="handleScroll">
    <slot />
  </el-scrollbar>
</template>
<script>
const tagAndTagSpacing = 4 // tagAndTagSpacing
export default {
  name: 'ScrollPane',
  data() {
    return {
      left: 0
    }
  },
  computed: {
    scrollWrapper() {
      return this.$refs.scrollContainer.$refs.wrap
    }
  },
  mounted() {
    this.scrollWrapper.addEventListener('scroll', this.emitScroll, true)
  },
  beforeDestroy() {
    this.scrollWrapper.removeEventListener('scroll', this.emitScroll)
  },
  methods: {
    handleScroll(e) {
      const eventDelta = e.wheelDelta || -e.deltaY * 40
      const $scrollWrapper = this.scrollWrapper
      $scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4
    },
    emitScroll() {
      this.$emit('scroll')
    },
    moveToTarget(currentTag) {
      const $container = this.$refs.scrollContainer.$el
      const $containerWidth = $container.offsetWidth
      const $scrollWrapper = this.scrollWrapper
      const tagList = this.$parent.$refs.tag
      let firstTag = null
      let lastTag = null
      // find first tag and last tag
      if (tagList.length > 0) {
        firstTag = tagList[0]
        lastTag = tagList[tagList.length - 1]
      }
      if (firstTag === currentTag) {
        $scrollWrapper.scrollLeft = 0
      } else if (lastTag === currentTag) {
        $scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth
      } else {
        // find preTag and nextTag
        const currentIndex = tagList.findIndex(item => item === currentTag)
        const prevTag = tagList[currentIndex - 1]
        const nextTag = tagList[currentIndex + 1]
        // the tag's offsetLeft after of nextTag
        const afterNextTagOffsetLeft = nextTag.$el.offsetLeft + nextTag.$el.offsetWidth + tagAndTagSpacing
        // the tag's offsetLeft before of prevTag
        const beforePrevTagOffsetLeft = prevTag.$el.offsetLeft - tagAndTagSpacing
        if (afterNextTagOffsetLeft > $scrollWrapper.scrollLeft + $containerWidth) {
          $scrollWrapper.scrollLeft = afterNextTagOffsetLeft - $containerWidth
        } else if (beforePrevTagOffsetLeft < $scrollWrapper.scrollLeft) {
          $scrollWrapper.scrollLeft = beforePrevTagOffsetLeft
        }
      }
    }
  }
}
</script>
<style lang="scss" scoped>
.scroll-container {
  white-space: nowrap;
  position: relative;
  overflow: hidden;
  width: 100%;
  ::v-deep {
    .el-scrollbar__bar {
      bottom: 0px;
    }
    .el-scrollbar__wrap {
      height: 49px;
    }
  }
}
</style>
qqjf-Web/src/Layout/components/TagsView/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,294 @@
<template>
  <div id="tags-view-container" class="tags-view-container">
    <scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll">
      <router-link
        v-for="tag in visitedViews"
        ref="tag"
        :key="tag.path"
        :class="isActive(tag) ? 'active' : ''"
        :to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
        tag="span"
        class="tags-view-item"
        @click.middle.native="!isAffix(tag) ? closeSelectedTag(tag) : ''"
        @contextmenu.prevent.native="openMenu(tag, $event)"
      >
        {{ tag.title }}
        <span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
      </router-link>
    </scroll-pane>
    <ul v-show="visible" :style="{ left: left + 'px', top: top + 'px' }" class="contextmenu">
      <li @click="refreshSelectedTag(selectedTag)">刷新</li>
      <li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)">关闭</li>
      <li @click="closeOthersTags">关闭其它</li>
      <li @click="closeAllTags(selectedTag)">全部关闭</li>
    </ul>
  </div>
</template>
<script>
import ScrollPane from './ScrollPane';
import path from 'path';
export default {
  components: { ScrollPane },
  data() {
    return {
      visible: false,
      top: 0,
      left: 0,
      selectedTag: {},
      affixTags: []
    };
  },
  computed: {
    visitedViews() {
      return this.$store.state.tagsView.visitedViews;
    },
    routes() {
      return this.$store.state.permission.routes;
    }
  },
  watch: {
    $route() {
      this.addTags();
      this.moveToCurrentTag();
    },
    visible(value) {
      if (value) {
        document.body.addEventListener('click', this.closeMenu);
      } else {
        document.body.removeEventListener('click', this.closeMenu);
      }
    }
  },
  mounted() {
    this.initTags();
    this.addTags();
  },
  methods: {
    isActive(route) {
      return route.path === this.$route.path;
    },
    isAffix(tag) {
      return tag.meta && tag.meta.affix;
    },
    filterAffixTags(routes, basePath = '/') {
      let tags = [];
      routes.forEach(route => {
        if (route.meta && route.meta.affix) {
          const tagPath = path.resolve(basePath, route.path);
          tags.push({
            fullPath: tagPath,
            path: tagPath,
            name: route.name,
            meta: { ...route.meta }
          });
        }
        if (route.children) {
          const tempTags = this.filterAffixTags(route.children, route.path);
          if (tempTags.length >= 1) {
            tags = [...tags, ...tempTags];
          }
        }
      });
      return tags;
    },
    initTags() {
      const affixTags = (this.affixTags = this.filterAffixTags(this.routes));
      for (const tag of affixTags) {
        // Must have tag name
        if (tag.name) {
          this.$store.dispatch('tagsView/addVisitedView', tag);
        }
      }
    },
    addTags() {
      const { name } = this.$route;
      if (name) {
        this.$store.dispatch('tagsView/addView', this.$route);
      }
      return false;
    },
    moveToCurrentTag() {
      const tags = this.$refs.tag;
      this.$nextTick(() => {
        for (const tag of tags) {
          if (tag.to.path === this.$route.path) {
            this.$refs.scrollPane.moveToTarget(tag);
            // when query is different then update
            if (tag.to.fullPath !== this.$route.fullPath) {
              this.$store.dispatch('tagsView/updateVisitedView', this.$route);
            }
            break;
          }
        }
      });
    },
    refreshSelectedTag(view) {
      this.$store.dispatch('tagsView/delCachedView', view).then(() => {
        const { fullPath } = view;
        this.$nextTick(() => {
          this.$router.replace({
            path: fullPath
          });
        });
      });
    },
    closeSelectedTag(view) {
      this.$store.dispatch('tagsView/delView', view).then(({ visitedViews }) => {
        if (this.isActive(view)) {
          this.toLastView(visitedViews, view);
        }
      });
    },
    closeOthersTags() {
      this.$router.push(this.selectedTag);
      this.$store.dispatch('tagsView/delOthersViews', this.selectedTag).then(() => {
        this.moveToCurrentTag();
      });
    },
    closeAllTags(view) {
      this.$store.dispatch('tagsView/delAllViews').then(({ visitedViews }) => {
        if (this.affixTags.some(tag => tag.path === view.path)) {
          return;
        }
        this.toLastView(visitedViews, view);
      });
    },
    toLastView(visitedViews, view) {
      const latestView = visitedViews.slice(-1)[0];
      if (latestView) {
        this.$router.push(latestView.fullPath);
      } else {
        // now the default is to redirect to the home page if there is no tags-view,
        // you can adjust it according to your needs.
        if (view.name === 'Didproject') {
          // to reload home page
          this.$router.replace({ path: '/Layout' });
          // this.$router.replace({ path: '/redirect' + view.fullPath });
        } else {
          this.$router.push('/');
        }
      }
    },
    openMenu(tag, e) {
      const menuMinWidth = 105;
      const offsetLeft = this.$el.getBoundingClientRect().left; // container margin left
      const offsetWidth = this.$el.offsetWidth; // container width
      const maxLeft = offsetWidth - menuMinWidth; // left boundary
      const left = e.clientX - offsetLeft + 15; // 15: margin right
      if (left > maxLeft) {
        this.left = maxLeft;
      } else {
        this.left = left;
      }
      this.top = e.clientY;
      this.visible = true;
      this.selectedTag = tag;
    },
    closeMenu() {
      this.visible = false;
    },
    handleScroll() {
      this.closeMenu();
    }
  }
};
</script>
<style lang="scss" scoped>
.tags-view-container {
  height: 34px;
  width: 100%;
  background: #fff;
  border-bottom: 1px solid #d8dce5;
  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 0 3px 0 rgba(0, 0, 0, 0.04);
  .tags-view-wrapper {
    .tags-view-item {
      display: inline-block;
      position: relative;
      cursor: pointer;
      height: 26px;
      line-height: 26px;
      border: 1px solid #d8dce5;
      color: #495060;
      background: #fff;
      padding: 0 8px;
      font-size: 12px;
      margin-left: 5px;
      margin-top: 4px;
      &:first-of-type {
        margin-left: 15px;
      }
      &:last-of-type {
        margin-right: 15px;
      }
      &.active {
        background-color: #42b983;
        color: #fff;
        border-color: #42b983;
        &::before {
          content: '';
          background: #fff;
          display: inline-block;
          width: 8px;
          height: 8px;
          border-radius: 50%;
          position: relative;
          margin-right: 2px;
        }
      }
    }
  }
  .contextmenu {
    margin: 0;
    background: #fff;
    z-index: 3000;
    position: absolute;
    list-style-type: none;
    padding: 5px 0;
    border-radius: 4px;
    font-size: 12px;
    font-weight: 400;
    color: #333;
    box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3);
    li {
      margin: 0;
      padding: 7px 16px;
      cursor: pointer;
      &:hover {
        background: #eee;
      }
    }
  }
}
</style>
<style lang="scss">
//reset element css of el-icon-close
.tags-view-wrapper {
  .tags-view-item {
    .el-icon-close {
      width: 16px;
      height: 16px;
      vertical-align: 2px;
      border-radius: 50%;
      text-align: center;
      transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
      transform-origin: 100% 50%;
      &:before {
        transform: scale(0.6);
        display: inline-block;
        vertical-align: -3px;
      }
      &:hover {
        background-color: #b4bccc;
        color: #fff;
      }
    }
  }
}
</style>
qqjf-Web/src/Layout/components/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
export { default as NavTab } from './navbar.vue'
export {default as sidebar} from './Sidebar/index.vue'
qqjf-Web/src/Layout/components/navbar.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,135 @@
<!--  -->
<template>
  <div class="navtab">
    <div class="flex heard-title align-center justify-between">
      <div class="flex align-end">
        <svg-icon
          style="font-size: 20px"
          class="svgicon margin-right pointer"
          @click="toggleSideBar"
          iconClass="align-right"
          classNames="alignSvg"
          :class="{ isActive: isCollapse }"
        />
        <p class="title">智能化立体库管理系统</p>
      </div>
      <div class="technical">
        <el-dropdown class="right-menu">
          <div class="avatar-wrapper flex align-center">
            <img src="../../assets/heard/heard.jpg" class="user-avatar" />
            <span class="margin-left pointer text-overflow">{{ userinfo.userName }}</span>
          </div>
          <el-dropdown-menu slot="dropdown">
            <el-dropdown-item> {{ userinfo.deptName }} </el-dropdown-item>
            <el-dropdown-item divided @click.native="logout">
              <p>退出登录</p>
            </el-dropdown-item>
          </el-dropdown-menu>
        </el-dropdown>
      </div>
    </div>
    <div class="Breadcrumb">
      <tags-view />
    </div>
  </div>
</template>
<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import ã€Šç»„件名称》 from '《组件路径》';
import { mapGetters } from 'vuex';
import TagsView from './TagsView/index';
import { getCache } from '@/utils/sessionStorage';
import ResizeMixin from '@/mixins/layout';
export default {
  //name放入模板名,方便在其他地方引用
  name: '',
  //import引入的组件需要注入到对象中才能使用
  components: { TagsView },
  mixins: [ResizeMixin],
  data() {
    //这里存放数据
    return {
      userinfo: getCache('userInfo')
    };
  },
  //监听属性 ç±»ä¼¼äºŽdata概念
  computed: {
    ...mapGetters(['sidebar']),
    isCollapse() {
      return this.sidebar;
    }
  },
  //生命周期 - åˆ›å»ºå®Œæˆï¼ˆå¯ä»¥è®¿é—®å½“前this实例)
  created() {},
  //生命周期 - æŒ‚载完成(可以访问DOM元素)
  mounted() {},
  //方法集合
  methods: {
    toggleSideBar() {
      this.$store.dispatch('setting/togglesidebar');
    },
    async logout() {
      await this.$store.dispatch('user/logout');
      this.$store.dispatch('permission/generateRoutes', []);
      this.$router.push({ path: '/login' });
    }
  },
  //监控data中的数据变化
  watch: {},
  //如果页面有keep-alive缓存功能,这个函数会触发
  activated() {}
};
</script>
<style lang="scss" scoped>
/* @import url(); å¼•入公共cssç±» */
.navtab {
  width: 100%;
  height: 80px;
  border-bottom: 1px solid #d6e2e9;
  box-shadow: 0 0 4px #345;
  .isActive {
    transform: rotate(180deg);
  }
  .Breadcrumb {
    display: flex;
    align-items: center;
    .svgicon {
      padding: 0 15px;
    }
  }
  .technical {
    display: flex;
    align-items: center;
    width: 11%;
    justify-content: flex-end;
    .right-menu {
      margin-right: 15px;
      .avatar-wrapper {
        margin: auto;
        display: flex;
        .user-avatar {
          cursor: pointer;
          width: 24px;
          height: 24px;
          border-radius: 10px;
        }
      }
    }
    .full {
      cursor: pointer;
    }
  }
  .heard-title {
    height: 50px;
    padding-left: 10px;
    background-color: rgb(255, 255, 255);
    border-radius: 0px !important;
    .title {
      // padding: 13px 10px 10px;
      font-size: 20px;
    }
  }
}
</style>
qqjf-Web/src/Layout/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
<!--  -->
<template>
  <div class="app-wrapper" :class="{ hidcontainer: isCollapse }">
    <sidebar class="sidebar-container" />
    <div class="main-container">
      <nav-tab />
      <!-- <right-panel v-if="showSettings">
        <settings />
      </right-panel> -->
      <div class="main">
        <transition name="fade-transform" mode="out-in">
          <router-view />
        </transition>
      </div>
    </div>
  </div>
</template>
<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import ã€Šç»„件名称》 from '《组件路径》';
import { NavTab, sidebar } from './components';
import { mapGetters } from 'vuex';
import { getStorage, setStorage } from '@/utils/sessionStorage';
// import sidebar from './components/Sidebar/index'
// import ResizeMixin from './mixin/ResizeHandler';
export default {
  //name放入模板名,方便在其他地方引用
  name: '',
  //import引入的组件需要注入到对象中才能使用
  components: { sidebar, NavTab },
  data() {
    //这里存放数据
    return {};
  },
  //监听属性 ç±»ä¼¼äºŽdata概念
  computed: {
    ...mapGetters(['sidebar']),
    isCollapse() {
      return this.sidebar;
    },
    visitedViews() {
      return this.$store.state.tagsView.visitedViews;
    }
  },
  //生命周期 - åˆ›å»ºå®Œæˆï¼ˆå¯ä»¥è®¿é—®å½“前this实例)
  created() {},
  //生命周期 - æŒ‚载完成(可以访问DOM元素)
  mounted() {},
  //方法集合
  methods: {},
  //监控data中的数据变化
  watch: {},
  //如果页面有keep-alive缓存功能,这个函数会触发
  activated() {},
  beforeRouteLeave: function (to, from, next) {
    console.log(this.$vnode);
    if (to.name == 'Login' || to.name == 'login') {
      if (this.$vnode && this.$vnode.data.keepAlive) {
        if (this.$vnode.parent && this.$vnode.parent.componentInstance && this.$vnode.parent.componentInstance.cache) {
          if (this.$vnode.componentOptions) {
            var key =
              this.$vnode.key == null
                ? this.$vnode.componentOptions.Ctor.cid +
                  (this.$vnode.componentOptions.tag ? `::${this.$vnode.componentOptions.tag}` : '')
                : this.$vnode.key;
            var cache = this.$vnode.parent.componentInstance.cache;
            var keys = this.$vnode.parent.componentInstance.keys;
            if (cache[key]) {
              if (keys.length) {
                var index = keys.indexOf(key);
                if (index > -1) {
                  keys.splice(index, 1);
                }
              }
              delete cache[key];
            }
          }
        }
      }
      this.$store.dispatch('tagsView/delAllViews').then(({ visitedViews }) => {});
    }
    next();
  }
};
</script>
<style lang="scss" scoped>
.app-wrapper {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
  .is-open {
    width: calc(100% - 45px);
  }
  .main {
    width: 98%;
    height: calc(100% - 100px);
    padding: 1%;
    overflow: hidden;
  }
}
</style>
qqjf-Web/src/api/Didproject.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
import axios from '../utils/axios';
import qs from 'qs';
/**
 * @description ä»Šæ—¥å‡ºå…¥åº“数据
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function GetHomeNumData(param) {
  return axios.post('/SummaryStatistics/GetHomeNumData', qs.stringify(param));
}
/**
 * @description å„类型库位使用统计
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function GetHomePieData(data) {
  return axios.post('/SummaryStatistics/GetHomePieData', qs.stringify(data));
}
/**
 * @description èŽ·å–é›¶ä»¶çš„å‡ºå…¥åº“æ•°é‡
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function GetHomeBarItemData(param) {
  return axios.post('/SummaryStatistics/GetHomeBarItemData', qs.stringify(param));
}
/**
 * @description èŽ·å–å™¨å…·çš„å‡ºå…¥åº“æ•°é‡
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function GetHomeBarContainerData(param) {
  return axios.post('/SummaryStatistics/GetHomeBarContainerData', qs.stringify(param));
}
/**
 * @description ç«‹åº“总览和制件总览
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function GetStorageOverviewData(param) {
  return axios.post('/SummaryStatistics/GetStorageOverviewData', qs.stringify(param));
}
/**
 * @description ä»Šæ—¥å’Œåº“位导出
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function GetHomeNumDataByDate(param) {
  return axios.post('/SummaryStatistics/GetHomeNumDataByDate', qs.stringify(param));
}
/**
 * @description è­¦ç¤ºä¿¡æ¯
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function GetWarnings() {
  return axios.post('/ItemStorage/SearchViewIndex');
}
qqjf-Web/src/api/ProductionLine.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description æœç´¢ç­çº¿ç®¡ç†
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
//  export function UserSearch(data) {
//   return axios.post('/User/Search',qs.stringify(data) );
// }
 export function ProductionLineSearch(data,param) {
  return axios.post('/ProductionLine/Search?page='+data,qs.stringify(param));
}
/**
 * @description åˆ é™¤ç­çº¿
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function ProductionLineDelete(data) {
  return axios.post('/ProductionLine/Delete',qs.stringify(data) );
}
/**
 * @description æ–°å¢žç¼–辑班线
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function ProductionLineAddOrUpdate(data) {
  return axios.post('/ProductionLine/AddOrUpdate',qs.stringify(data) );
}
qqjf-Web/src/api/avroRecord.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
import axios from '../utils/axios';
import qs from 'qs';
/**
 * @description æœç´¢å †åž›æœºä»»åŠ¡è®°å½•
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function SrmTaskSearch(data, param) {
  return axios.post('/SrmRecord/Search?page=' + data, qs.stringify(param));
}
/**
 * @description å¯¼å‡ºå †åž›æœºä»»åŠ¡è®°å½•
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function SearchAll(param) {
  return axios.post('/SrmRecord/SearchAll', qs.stringify(param));
}
qqjf-Web/src/api/cass-line.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description æœç´¢ç­çº¿ç®¡ç†
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function ProductionLineSearch(data,param) {
  return axios.post('/ProductionLine/Search?page='+data,qs.stringify(param));
}
/**
 * @description åˆ é™¤ç­çº¿
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function ProductionLineDelete(data) {
  return axios.post('/ProductionLine/Delete',qs.stringify(data) );
}
/**
 * @description æ–°å¢žç¼–辑班线
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function ProductionLineAddOrUpdate(data) {
  return axios.post('/ProductionLine/AddOrUpdate',qs.stringify(data) );
}
qqjf-Web/src/api/dept.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description æœç´¢ç”¨æˆ·
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
//  export function DeptSearch(data) {
//   return axios.post('/Dept/Search',qs.stringify(data) );
// }
 export function DeptSearch(data,param) {
  return axios.post('/Dept/Search?page='+data,qs.stringify(param));
}
/**
 * @description åˆ é™¤ç”¨æˆ·
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function DeptDelete(data) {
  return axios.post('/Dept/Delete',qs.stringify(data) );
}
/**
 * @description æ–°å¢žç¼–辑用户
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function DeptAddOrUpdate(data) {
  return axios.post('/Dept/AddOrUpdate',qs.stringify(data) );
}
qqjf-Web/src/api/enter.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description æœç´¢ç»„盘
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
//  export function UserSearch(data) {
//   return axios.post('/User/Search',qs.stringify(data) );
// }
 export function ContainerVsItemSearch(data,param) {
  return axios.post('/ContainerVsItem/Search?page='+data,qs.stringify(param));
}
/**
 * @description åˆ é™¤ç»„盘
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function ContainerVsItemDelete(data) {
  return axios.post('/ContainerVsItem/DeleteOne',qs.stringify(data) );
}
/**
 * @description æ–°å¢žç»„盘
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function ContainerVsItemAdd(data) {
  return axios.post('/ContainerVsItem/Add',qs.stringify(data) );
}
/**
 * @description å¤šæ¡è®°å½•新增组盘
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function ContainerVsItemAddAll(data) {
  return axios.post('/ContainerVsItem/AddOrUpdateAll',qs.stringify(data) );
}
/**
 * @description ä¿®æ”¹ç»„盘
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function ContainerVsItemUpdate(data) {
  return axios.post('/ContainerVsItem/Update',qs.stringify(data) );
}
/**
 * @description èŽ·å–ç»„ç›˜ç¼–å·
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function GetCode(data) {
  return axios.post('/ContainerVsItem/GetCode',qs.stringify(data) );
}
/**
 * @description å†²åŽ‹å…¥åº“è®¡åˆ’å…³è”
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function BindCviCode(data) {
  return axios.post('/ContainerVsItem/BindCviCode',qs.stringify(data) );
}
qqjf-Web/src/api/enterchoose.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
import axios from '../utils/axios';
import qs from 'qs';
/**
 * @description æœç´¢é›¶ä»¶
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
//  export function UserSearch(data) {
//   return axios.post('/User/Search',qs.stringify(data) );
// }
export function itemSearch(data, param) {
  return axios.post('/Item/Search?page=' + data, qs.stringify(param));
}
/**
 * @description  å¯¼å‡ºå…¨éƒ¨é›¶ä»¶
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
//  export function UserSearch(data) {
//   return axios.post('/User/Search',qs.stringify(data) );
// }
export function GetAllItem(data, param) {
  return axios.post('/Item/GetAllItem', qs.stringify(param));
}
/**
 * @description åˆ é™¤é›¶ä»¶
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function ItemDelete(data) {
  return axios.post('/Item/Delete', qs.stringify(data));
}
/**
 * @description æ–°å¢žé›¶ä»¶
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function ItemAddOrUpdate(data) {
  return axios.post('/Item/AddOrUpdate', qs.stringify(data));
}
/**
 * @description å¯¼å…¥é›¶ä»¶çš„基础单价和最大最小库存量、超期时间
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function ImportItemInfo(data) {
  return axios.post('/Item/ImportItemInfo', qs.stringify(data));
}
/**
 * @description æœç´¢ä¸Šä¸‹é™æ˜¯å¦å¼€å¯
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function SearchStorageEnable() {
  return axios.post('/Item/SearchStorageEnable');
}
/**
 * @description å¯ç”¨/关闭上下限判断
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function UpdateStorageEnable(data) {
  return axios.post('/Item/UpdateStorageEnable', qs.stringify(data));
}
/**
 * @description è®¾ç½®åº“容下线
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function UpdateMinStorage(data) {
  return axios.post('/Item/UpdateMinStorage', qs.stringify(data));
}
/**
 * @description è®¾ç½®åº“容上线
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function UpdateMaxStorage(data) {
  return axios.post('/Item/UpdateMaxStorage', qs.stringify(data));
}
qqjf-Web/src/api/equipmenttask.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
import axios from '../utils/axios';
import qs from 'qs';
/**
 * @description æœç´¢å †åž›æœºä»»åŠ¡
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function SrmTaskSearch(data, param) {
  return axios.post('/SrmTask/Search?page=' + data, qs.stringify(param));
}
/**
 * @description æœç´¢RGV任务
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function RgvTaskSearch(data, param) {
  return axios.post('/RgvTask/Search?page=' + data, qs.stringify(param));
}
qqjf-Web/src/api/forklift.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description æœç´¢å‰è½¦
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function CarSearch(data,param) {
  return axios.post('/Car/Search?page='+data,qs.stringify(param));
}
/**
 * @description åˆ é™¤å‰è½¦
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function CarDelete(data) {
  return axios.post('/Car/Delete',qs.stringify(data) );
}
/**
 * @description æ–°å¢žä¿®æ”¹å‰è½¦
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function CarAddOrUpdate(data) {
  return axios.post('/Car/AddOrUpdate',qs.stringify(data) );
}
qqjf-Web/src/api/forklifttasks.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
import axios from '../utils/axios';
import qs from 'qs';
/**
 * @description æœç´¢å‰è½¦ä»»åŠ¡
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function CarTaskSearch(data, param) {
  return axios.post('/CarTask/Search?page=' + data, qs.stringify(param));
}
/**
 * @description åˆ é™¤å‰è½¦ä»»åŠ¡
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function CarTaskDelete(data) {
  return axios.post('/CarTask/Delete', qs.stringify(data));
}
/**
 * @description æ–°å¢žä¿®æ”¹å‰è½¦ä»»åŠ¡
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function CarTaskAddOrUpdate(data) {
  return axios.post('/CarTask/AddOrUpdate', qs.stringify(data));
}
/**
 * @description èŽ·å–å‰è½¦ä»»åŠ¡å·
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function CarTaskGetCode(data) {
  return axios.post('/CarTask/GetCode', qs.stringify(data));
}
/**
 * @description èŽ·å–å‰è½¦å¸æœº
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function GetCarUser(data) {
  return axios.post('/CarTask/GetCarUser', qs.stringify(data));
}
qqjf-Web/src/api/intype.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description æœç´¢å…¥åº“类型
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function InTypeSearch(data,param) {
  return axios.post('/InType/Search?page='+data,qs.stringify(param));
}
qqjf-Web/src/api/inventory.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description èŽ·å–ç¼–å·
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function PlaceVsContainerGetCode(data,param) {
  return axios.post('/PlaceVsContainer/GetCode',qs.stringify(param));
}
/**
 * @description æœç´¢åº“存管理
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function PlaceVsContainer(data,param) {
  return axios.post('/PlaceVsContainer/Search?page='+data,qs.stringify(param));
}
/**
 * @description åˆ é™¤åº“å­˜
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function PlaceVsContainerDelete(data) {
  return axios.post('/PlaceVsContainer/Delete',qs.stringify(data) );
}
/**
 * @description æ–°å¢žç¼–辑库存
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function PlaceAddOrUpdate(data) {
  return axios.post('/PlaceVsContainer/AddOrUpdate',qs.stringify(data) );
}
/**
 * @description æŸ¥æ‰¾åº“位类型
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function ContainerTypeSearch(data) {
  return axios.post('/Container/GetContainerType',qs.stringify(data) );
}
qqjf-Web/src/api/maintask.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
import axios from '../utils/axios';
import qs from 'qs';
/**
 * @description æœç´¢ä¸»ä»»åŠ¡
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function TaskSearch(data, param) {
  return axios.post('/Task/Search?page=' + data, qs.stringify(param));
}
/**
 * @description å…¨éƒ¨å¯¼å‡º
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function GetAllMainTask(data) {
  return axios.post('/Task/GetAllMainTask', qs.stringify(data));
}
/**
 * @description å¤„理主任务
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function TaskDeleteErrorTask(data) {
  return axios.post('/Task/DeleteErrorTask', qs.stringify(data));
}
/**
 * @description åˆ é™¤ä¸»ä»»åŠ¡
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function TaskDelete(data) {
  return axios.post('/Task/Delete', qs.stringify(data));
}
/**
 * @description æ–°å¢žä¿®æ”¹ä¸»ä»»åŠ¡
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function TaskAddOrUpdate(data) {
  return axios.post('/Task/AddOrUpdate', qs.stringify(data));
}
/**
 * @description æé«˜ä¼˜å…ˆçº§
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function UpTaskLevel(data) {
  return axios.post('/Task/UpTaskLevel', qs.stringify(data));
}
/**
 * @description å¼ºåˆ¶ä¼˜å…ˆ
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function MustTask(data) {
  return axios.post('/Task/MustTask', qs.stringify(data));
}
qqjf-Web/src/api/manage.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description æœç´¢ç”¨æˆ·
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
//  export function UserSearch(data) {
//   return axios.post('/User/Search',qs.stringify(data) );
// }
 export function UserSearch(data,param) {
  return axios.post('/User/Search?page='+data,qs.stringify(param) );
}
/**
 * @description åˆ é™¤ç”¨æˆ·
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function UserDelete(data) {
  return axios.post('/User/Delete',qs.stringify(data) );
}
/**
 * @description æ–°å¢žç¼–辑用户
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function AddOrUpdate(data) {
  return axios.post('/User/AddOrUpdate',qs.stringify(data) );
}
qqjf-Web/src/api/materials.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description æœç´¢ç‰©æ–™åº“å­˜
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function ItemStorage(data,param) {
  return axios.post('/ItemStorage/Search?page='+data,qs.stringify(param));
}
qqjf-Web/src/api/outbound.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description æœç´¢å‡ºåº“管理计划
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
//  export function UserSearch(data) {
//   return axios.post('/User/Search',qs.stringify(data) );
// }
 export function OutOrderSearch(data,param) {
  return axios.post('/OutOrder/Search?page='+data,qs.stringify(param));
}
/**
 * @description èŽ·å–å…¥åº“ç¼–å·
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function OutOrderGetCode(data) {
  return axios.post('/OutOrder/GetCode',qs.stringify(data) );
}
/**
 * @description åˆ é™¤å…¥åº“计划
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function OutOrderDelete(data) {
  return axios.post('/OutOrder/Delete',qs.stringify(data) );
}
/**
 * @description æ–°å¢žä¿®æ”¹å…¥åº“
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function OutOrderAddOrUpdate(data) {
  return axios.post('/OutOrder/AddOrUpdate',qs.stringify(data) );
}
/**
 * @description å‡ºåº“单下发
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function CheckOutOrder(data) {
  return axios.post('OutOrder/CheckOutOrder',qs.stringify(data) );
}
 export function GetForkliftWorkers(data) {
  return axios.post('User/Search?page=1', data);
}
qqjf-Web/src/api/output.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
import axios from '../utils/axios';
import qs from 'qs';
/**
 * @description æœç´¢ç‰©æ–™åº“å­˜
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function GetInOutCountByHour(param) {
  return axios.post('/SummaryStatistics/GetInOutCountByHour', qs.stringify(param));
}
qqjf-Web/src/api/palte.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
import axios from '../utils/axios';
import qs from 'qs';
/**
 * @description æœç´¢å™¨å…·ç®¡ç†
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
//  export function UserSearch(data) {
//   return axios.post('/User/Search',qs.stringify(data) );
// }
export function ContainerSearch(data, param) {
  return axios.post('/Container/Search?page=' + data, qs.stringify(param));
}
/**
 * @description æœç´¢å™¨å…·ç®¡ç†
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
//  export function UserSearch(data) {
//   return axios.post('/User/Search',qs.stringify(data) );
// }
export function GetAllContainer(data, param) {
  return axios.post('/Container/GetAllContainer', qs.stringify(param));
}
/**
 * @description æŸ¥æ‰¾å™¨å…·è§„æ ¼
 * @param {string}
 * @param {string}
 * @returns {string}
 */
export function PalletSearch(data, param) {
  return axios.post('/Pallet/Search?page=' + data, qs.stringify(param));
}
/**
 * @description åˆ é™¤å™¨å…·
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function ContainerDelete(data) {
  return axios.post('/Container/Delete', qs.stringify(data));
}
/**
 * @description æ–°å¢žç¼–辑器具
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function ContainerAddOrUpdate(data) {
  return axios.post('/Container/AddOrUpdate', qs.stringify(data));
}
qqjf-Web/src/api/position.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description æœç´¢è´§ä½ç®¡ç†
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function PlaceSearch(data,param) {
  return axios.post('/Place/Search?page='+data,qs.stringify(param));
}
/**
 * @description æ ¹æ®ä»»åŠ¡ç±»åž‹èŽ·å–å¯ç”¨çš„åº“ä½
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function PlaceGetPlace(param) {
  return axios.post('/Place/GetPlace',qs.stringify(param));
}
/**
 * @description åˆ é™¤è´§ä½
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function ContainerDelete(data) {
  return axios.post('/Container/Delete',qs.stringify(data) );
}
/**
 * @description æ–°å¢žç¼–辑货位
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function PlaceAddOrUpdate(data) {
  return axios.post('/Place/AddOrUpdate',qs.stringify(data) );
}
qqjf-Web/src/api/quotation.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description æœç´¢å…¥åº“管理计划
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
//  export function UserSearch(data) {
//   return axios.post('/User/Search',qs.stringify(data) );
// }
 export function InOrderSearch(data,param) {
  return axios.post('/InOrder/Search?page='+data,qs.stringify(param));
}
/**
 * @description èŽ·å–å…¥åº“ç¼–å·
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function InOrderGetCode(data) {
  return axios.post('/InOrder/GetCode',qs.stringify(data) );
}
/**
 * @description åˆ é™¤å…¥åº“计划
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function InOrderDelete(data) {
  return axios.post('/InOrder/Delete',qs.stringify(data) );
}
/**
 * @description æ–°å¢žä¿®æ”¹å…¥åº“
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function InOrderAddOrUpdate(data) {
  return axios.post('/InOrder/AddOrUpdate',qs.stringify(data) );
}
/**
 * @description å†²åŽ‹å…¥åº“è®¡åˆ’å¯¼å…¥
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function ImportInOrder(data) {
  return axios.post('/InOrder/ImportInOrder',qs.stringify(data) );
}
/**
 * @description ä¿®æ”¹çº¿ä¸‹äº¤ä»˜æ•°é‡
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function UpdateUnlineNum(data) {
  return axios.post('/InOrder/UpdateUnlineNum',qs.stringify(data) );
}
/**
 * @description æäº¤å®¡æ ¸
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function InOrderSend(data) {
  return axios.post('/InOrder/Send',qs.stringify(data) );
}
/**
 * @description å®¡æ ¸é€šè¿‡
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function InOrderCheck(data) {
  return axios.post('/InOrder/Check',qs.stringify(data) );
}
/**
 * @description å®¡æ ¸é©³å›ž
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function InOrderReject(data) {
  return axios.post('/InOrder/Reject',qs.stringify(data) );
}
qqjf-Web/src/api/register.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description ç”¨æˆ·ç™»å½•
 * @param {string}  username
 * @param {string}  password
 * @returns {string} token
 * qs.
 * */
//  export function login(data) {
//   return axios.post('user/login?userName='+data.userName+'&password='+data.password );
// }
 export function login(data) {
  return axios.post('user/login',qs.stringify(data) );
}
qqjf-Web/src/api/reportforms.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description ä»»åŠ¡èŠ‚æ‹åˆ†æž
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function GetTaskBeatAnalysis(data) {
  return axios.post('/SummaryStatistics/GetTaskBeatAnalysis',qs.stringify(data) );
}
/**
 * @description å‡ºå…¥åº“任务平均时长
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function GetInOutAverageTime(data) {
  return axios.post('/SummaryStatistics/GetInOutAverageTime',qs.stringify(data) );
}
/**
 * @description åº“存分类统计
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function GetStockClassificationData(data) {
  return axios.post('/SummaryStatistics/GetStockClassificationData',qs.stringify(data) );
}
/**
 * @description è´§æ ¼åˆ©ç”¨çއ
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function GetStorageVailability(data) {
  return axios.post('/SummaryStatistics/GetStorageVailability',qs.stringify(data) );
}
/**
 * @description åˆ¶ä»¶å‘¨è½¬æ—¶é—´
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function GetPartTurnover(data) {
  return axios.post('/SummaryStatistics/GetPartTurnover',qs.stringify(data) );
}
/**
 * @description è®¾å¤‡å¯åŠ¨çŽ‡
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function GetDevMovable(data) {
  return axios.post('/SummaryStatistics/GetDevMovable',qs.stringify(data) );
}
/**
 * @description è®¾å¤‡åˆ©ç”¨çއ
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function GetDevAvailability(data) {
  return axios.post('/SummaryStatistics/GetDevAvailability',qs.stringify(data) );
}
/**
 * @description åœ¨åˆ¶å“èµ„金分析
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function GetStorageCapitalAnalysis(data) {
  return axios.post('/SummaryStatistics/GetStorageCapitalAnalysis',qs.stringify(data) );
}
qqjf-Web/src/api/role-auth.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description æœç´¢æ‰€æœ‰èœå•
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
//  export function DeptSearch(data) {
//   return axios.post('/Dept/Search',qs.stringify(data) );
// }
export function GetUserRoleAllPermission(param) {
  return axios.post('/Permission/GetUserRoleAllPermission',qs.stringify(param));
}
/**
 * @description æœç´¢æƒé™
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
//  export function DeptSearch(data) {
//   return axios.post('/Dept/Search',qs.stringify(data) );
// }
 export function SearchPermission(param) {
  return axios.post('/Permission/SearchPermission',qs.stringify(param));
}
/**
 * @description æœç´¢è§’色拥有权限
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function SearchRoleVsPermission(data) {
  return axios.post('/Permission/SearchRoleVsPermission',qs.stringify(data) );
}
/**
 * @description ä¿®æ”¹è§’色权限
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function AddOrUpdateRoleVsPermission(data) {
  return axios.post('/Permission/AddOrUpdateRoleVsPermission',qs.stringify(data) );
}
qqjf-Web/src/api/role.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description æœç´¢ç”¨æˆ·
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
//  export function UserSearch(data) {
//   return axios.post('/User/Search',qs.stringify(data) );
// }
 export function RoleSearch(data,param) {
  return axios.post('/Role/Search?page='+data,qs.stringify(param));
}
/**
 * @description åˆ é™¤ç”¨æˆ·
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function RoleDelete(data) {
  return axios.post('/Role/Delete',qs.stringify(data) );
}
/**
 * @description æ–°å¢žç¼–辑用户
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function RoleAddOrUpdate(data) {
  return axios.post('/Role/AddOrUpdate',qs.stringify(data) );
}
qqjf-Web/src/api/stacker.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description æœç´¢è´§ä½ç®¡ç†
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
//  export function UserSearch(data) {
//   return axios.post('/User/Search',qs.stringify(data) );
// }
 export function DeviceSearch(data,param) {
  return axios.post('/Device/Search?page='+data,qs.stringify(param));
}
/**
 * @description åˆ é™¤è´§ä½
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
//  export function ContainerDelete(data) {
//   return axios.post('/Container/Delete',qs.stringify(data) );
// }
/**
 * @description æ–°å¢žç¼–辑货位
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function DeviceAddOrUpdate(data) {
  return axios.post('/Device/AddOrUpdate',qs.stringify(data) );
}
qqjf-Web/src/api/statistics.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
import axios from '../utils/axios';
import qs from 'qs';
/**
 * @description å‡ºå…¥åº“统计
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function GetEnterNum(param) {
  return axios.post('/Task/GetEnterNum', qs.stringify(param));
}
qqjf-Web/src/api/taskrecord.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description æœç´¢ä»»åŠ¡è®°å½•
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function TaskRecodeSearch(data,param) {
  return axios.post('/TaskRecode/Search?page='+data,qs.stringify(param));
}
/**
 * @description åˆ é™¤ä»»åŠ¡
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function TaskRecodeDelete(data) {
  return axios.post('/TaskRecode/Delete',qs.stringify(data) );
}
qqjf-Web/src/api/viewdata.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
import axios from '../utils/axios'
import qs from 'qs';
/**
 * @description èŽ·å–å„ç§çŠ¶æ€çš„åº“ä½æ•°é‡
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function GetAllStatusPlaceCount(param) {
  return axios.post('/Place/GetAllStatusPlaceCount',qs.stringify(param));
}
/**
 * @description èŽ·å–æŒ‡å®šå··é“åº“çš„æ‰€æœ‰åº“ä½ä¿¡æ¯
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function GetAllPlaceInfo(data) {
  return axios.post('/Place/GetAllPlaceInfo',qs.stringify(data) );
}
/**
 * @description èŽ·å–åº“ä½é‡Œçš„æ‰˜ç›˜æˆ–è€…ç‰©æ–™ä¿¡æ¯
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
 export function GetPVCVIInfo(data) {
    return axios.post('/Place/GetPVCVIInfo',qs.stringify(data) );
  }
qqjf-Web/src/api/warning.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
import axios from '../utils/axios';
import qs from 'qs';
/**
 * @description æœç´¢æŠ¥è­¦ä¿¡æ¯
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function AlertSearch(data, param) {
  return axios.post('/Alert/Search?page=' + data, qs.stringify(param));
}
/**
 * @description èŽ·å–ç¼–å·
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function AlertGetCode(data) {
  return axios.post('/Alert/GetCode', qs.stringify(data));
}
/**
 * @description åˆ é™¤æŠ¥è­¦ä¿¡æ¯
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function AlertDelete(data) {
  return axios.post('/Alert/Delete', qs.stringify(data));
}
/**
 * @description æ–°å¢žä¿®æ”¹æŠ¥è­¦ä¿¡æ¯
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function CarAddOrUpdate(data) {
  return axios.post('/Alert/AddOrUpdate', qs.stringify(data));
}
/**
 * @description å¯¼å‡ºå…¨éƒ¨æ•°æ®
 * @param {string}
 * @param {string}
 * @returns {string}
 * qs.
 * */
export function GetAllAlarmInfo(data) {
  return axios.post('/Alert/GetAllAlarmInfo', qs.stringify(data));
}
qqjf-Web/src/assets/css/TimesNewRomanPSMT24163565.ttf
Binary files differ
qqjf-Web/src/assets/heard/heard.jpg
qqjf-Web/src/assets/heard/heard1.jpg
qqjf-Web/src/assets/heard/logbg.jpg
qqjf-Web/src/assets/heard/logo.png
qqjf-Web/src/assets/login/bg.jpg
qqjf-Web/src/components/SvgIcon/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
<template>
  <svg :class="svgClass" aria-hidden="true" v-on="$listeners">
    <use :xlink:href="iconName" />
  </svg>
</template>
<script>
export default {
  name: 'SvgIcon',
  props: {
    iconClass: {
      type: String,
      required: true
    },
    className: {
      type: String,
      default: ''
    }
  },
  computed: {
    iconName() {
      return `#icon-${this.iconClass}`
    },
    svgClass() {
      if (this.className) {
        return 'svg-icon ' + this.className
      } else {
        return 'svg-icon'
      }
    }
  }
}
</script>
<style scoped>
.svg-icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}
.svg-external-icon {
  background-color: currentColor;
  mask-size: cover!important;
  display: inline-block;
}
</style>
qqjf-Web/src/components/TreeTable/eval.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
/* eslint-disable */
/* *
 * @Author: jianglei
 * @Date:   2017-10-12 12:06:49
 */
"use strict";
import Vue from "vue";
export default function treeToArray(data, expandAll, parent = null, level = null) {
  let tmp = [];
  Array.from(data).forEach(function(record) {
    if (record._expanded === undefined) {
      Vue.set(record, "_expanded", expandAll);
    }
    let _level = 1;
    if (level !== undefined && level !== null) {
      _level = level + 1;
    }
    Vue.set(record, "_level", _level);
    //  å¦‚果有父元素
    if (parent) {
      Vue.set(record, "parent", parent);
    }
    tmp.push(record);
    if (record.children && record.children.length > 0 && record._expanded) {
      const children = treeToArray(record.children, expandAll, record, _level);
      tmp = tmp.concat(children);
    }
  });
  return tmp;
}
qqjf-Web/src/components/TreeTable/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,159 @@
<template>
  <el-table
    :data="formatData"
    :row-style="showRow"
    v-bind="$attrs"
    :class="'abc-' + columns.length"
    highlight-current-row
    size="mini"
  >
    <el-table-column v-if="columns.length === 0" :label="treeColumnLabel" width="280">
      <template slot-scope="scope">
        <el-checkbox
          v-model="scope.row.isSelected"
          @change="
            isSelected => {
              rowSelected(isSelected, scope.row);
            }
          "
        ></el-checkbox>
        <span v-for="space in scope.row._level" :key="space" class="ms-tree-space" />
        <span v-if="iconShow(0, scope.row)" class="tree-ctrl" @click="toggleExpanded(scope.$index)">
          <i v-if="!scope.row._expanded" class="el-icon-plus" />
          <i v-else class="el-icon-minus" />
        </span>
        {{ scope.row.menuName }}
      </template>
    </el-table-column>
    <el-table-column
      v-for="(column, index) in columns"
      v-else
      :key="column.value"
      :label="column.text"
      :width="column.width"
    >
      <template slot-scope="scope">
        <span v-for="space in scope.row._level" v-if="index === 0" :key="space" class="ms-tree-space" />
        <span v-if="iconShow(index, scope.row)" class="tree-ctrl" @click="toggleExpanded(scope.$index)">
          <i v-if="!scope.row._expanded" class="el-icon-plus" />
          <i v-else class="el-icon-minus" />
        </span>
        {{ scope.row[column.value] }}
      </template>
    </el-table-column>
    <slot />
  </el-table>
</template>
<script>
import treeToArray from './eval';
export default {
  name: 'TreeTable',
  props: {
    /* eslint-disable */
    data: {
      type: [Array, Object],
      required: true
    },
    // æ ‘导航列头名称
    treeColumnLabel: {
      type: String,
      default: '导航类别'
    },
    columns: {
      type: Array,
      default: () => []
    },
    evalFunc: Function,
    evalArgs: Array,
    expandAll: {
      type: Boolean,
      default: false
    }
  },
  computed: {
    //  æ ¼å¼åŒ–数据源
    formatData: function () {
      let tmp;
      if (!Array.isArray(this.data)) {
        tmp = [this.data];
      } else {
        tmp = this.data;
      }
      const func = this.evalFunc || treeToArray;
      const args = this.evalArgs ? Array.concat([tmp, this.expandAll], this.evalArgs) : [tmp, this.expandAll];
      return func.apply(null, args);
    }
  },
  methods: {
    showRow: function (row) {
      const show = row.row.parent ? row.row.parent._expanded && row.row.parent._show : true;
      row.row._show = show;
      return show ? 'animation:treeTableShow 1s;-webkit-animation:treeTableShow 1s;' : 'display:none;';
    },
    // åˆ‡æ¢ä¸‹çº§æ˜¯å¦å±•å¼€
    toggleExpanded: function (trIndex) {
      const record = this.formatData[trIndex];
      record._expanded = !record._expanded;
    },
    // å›¾æ ‡æ˜¾ç¤º
    iconShow(index, record) {
      return index === 0 && record.children && record.children.length > 0;
    },
    // è¡Œå‰é¢å¤é€‰æ¡†é€‰ä¸­äº‹ä»¶
    rowSelected(isSelected, row) {
      this.$emit('row-selected', isSelected, row);
    }
  }
};
</script>
<style rel="stylesheet/css">
@keyframes treeTableShow {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
@-webkit-keyframes treeTableShow {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
</style>
<style lang="scss" rel="stylesheet/scss" scoped>
$color-blue: #2196f3;
$space-width: 18px;
.ms-tree-space {
  position: relative;
  top: 1px;
  display: inline-block;
  font-style: normal;
  font-weight: 400;
  line-height: 1;
  width: $space-width;
  height: 14px;
  &::before {
    content: '';
  }
}
.processContainer {
  width: 100%;
  height: 100%;
}
table td {
  line-height: 26px;
}
.tree-ctrl {
  position: relative;
  cursor: pointer;
  color: $color-blue;
  margin-left: -$space-width;
}
</style>
qqjf-Web/src/components/TreeTable/readme.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
## å†™åœ¨å‰é¢
此组件仅提供一个创建TreeTable的解决思路
## prop说明
#### *data*
  **必填**
  åŽŸå§‹æ•°æ®,要求是一个数组或者对象
  ```javascript
    [{
      key1: value1,
      key2: value2,
      children: [{
        key1: value1
      },
      {
        key1: value1
      }]
    },
    {
      key1: value1
    }]
  ```
  æˆ–者
 ```javascript
    {
      key1: value1,
      key2: value2,
      children: [{
        key1: value1
      },
      {
        key1: value1
      }]
    }
  ```
#### columns
  åˆ—属性,要求是一个数组
  1. text: æ˜¾ç¤ºåœ¨è¡¨å¤´çš„æ–‡å­—
  2. value: å¯¹åº”data的key。treeTable将显示相应的value
  3. width: æ¯åˆ—的宽度,为一个数字(可选)
  å¦‚果你想要每个字段都有自定义的样式或者嵌套其他组件,columns可不提供,直接像在el-table一样写即可,如果没有自定义内容,提供columns将更加的便捷方便
  å¦‚果你有几个字段是需要自定义的,几个不需要,那么可以将不需要自定义的字段放入columns,将需要自定义的内容放入到slot中,详情见后文
  ```javascript
  [{
    value:string,
    text:string,
    width:number
  },{
    value:string,
    text:string,
    width:number
  }]
  ```
#### expandAll
  æ˜¯å¦é»˜è®¤å…¨éƒ¨å±•开,boolean值,默认为false
#### evalFunc
  è§£æžå‡½æ•°ï¼Œfunction,非必须
  å¦‚果不提供,将使用默认的[evalFunc](./eval.js)
  å¦‚果提供了evalFunc,那么会用提供的evalFunc去解析data,并返回treeTable渲染所需要的值。如何编写一个evalFunc,请参考[*eval.js*](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/components/TreeTable/eval.js)或[*customEval.js*](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/example/table/treeTable/customEval.js)
#### evalArgs
  è§£æžå‡½æ•°çš„参数,是一个数组
  **请注意,自定义的解析函数参数第一个为this.data,第二个参数为, this.expandAll,你不需要在evalArgs填写。一定记住,这两个参数是强制性的,并且位置不可颠倒** *this.data为需要解析的数据,this.expandAll为是否默认展开*
  å¦‚你的解析函数需要的参数为`(this.data, this.expandAll,1,2,3,4)`,那么你只需要将`[1,2,3,4]`赋值给`evalArgs`就可以了
  å¦‚果你的解析函数参数只有`(this.data, this.expandAll)`,那么就可以不用填写evalArgs了
  å…·ä½“可参考[*customEval.js*](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/example/table/treeTable/customEval.js)的函数参数和[customTreeTable](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/example/table/treeTable/customTreeTable.vue)的`evalArgs`属性值
 ## slot
 è¿™æ˜¯ä¸€ä¸ªè‡ªå®šä¹‰åˆ—的插槽。
 é»˜è®¤æƒ…况下,treeTable只有一行行展示数据的功能。但是一般情况下,我们会要给行加上一个操作按钮或者根据当行数据展示不同的样式,这时我们就需要自定义列了。请参考[customTreeTable](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/example/table/treeTable/customTreeTable.vue),[实例效果](http://panjiachen.github.io/vue-element-admin/#/example/table/custom-tree-table)
 `slot`和`columns属性`可同时存在,columns里面的数据列会在slot自定义列的左边展示
 ## å…¶ä»–
  å¦‚果有其他的需求,请参考[el-table](http://element-cn.eleme.io/#/en-US/component/table)的api自行修改index.vue
qqjf-Web/src/components/autoscroll/eleResize.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
/**
 * Created by taozh on 2017/5/6.
 * taozh1982@gmail.com
 */
var EleResize = {
    _handleResize: function (e) {
        var ele = e.target || e.srcElement;
        var trigger = ele.__resizeTrigger__;
        if (trigger) {
            var handlers = trigger.__z_resizeListeners;
            if (handlers) {
                var size = handlers.length;
                for (var i = 0; i < size; i++) {
                    var h = handlers[i];
                    var handler = h.handler;
                    var context = h.context;
                    handler.apply(context, [e]);
                }
            }
        }
    },
    _removeHandler: function (ele, handler, context) {
        var handlers = ele.__z_resizeListeners;
        if (handlers) {
            var size = handlers.length;
            for (var i = 0; i < size; i++) {
                var h = handlers[i];
                if (h.handler === handler && h.context === context) {
                    handlers.splice(i, 1);
                    return;
                }
            }
        }
    },
    _createResizeTrigger: function (ele) {
        var obj = document.createElement('object');
        obj.setAttribute('style',
            'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden;opacity: 0; pointer-events: none; z-index: -1;');
        obj.onload = EleResize._handleObjectLoad;
        obj.type = 'text/html';
        ele.appendChild(obj);
        obj.data = 'about:blank';
        return obj;
    },
    _handleObjectLoad: function (evt) {
        this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__;
        this.contentDocument.defaultView.addEventListener('resize', EleResize._handleResize);
    }
};
if (document.attachEvent) {//ie9-10
    EleResize.on = function (ele, handler, context) {
        var handlers = ele.__z_resizeListeners;
        if (!handlers) {
            handlers = [];
            ele.__z_resizeListeners = handlers;
            ele.__resizeTrigger__ = ele;
            ele.attachEvent('onresize', EleResize._handleResize);
        }
        handlers.push({
            handler: handler,
            context: context
        });
    };
    EleResize.off = function (ele, handler, context) {
        var handlers = ele.__z_resizeListeners;
        if (handlers) {
            EleResize._removeHandler(ele, handler, context);
            if (handlers.length === 0) {
                ele.detachEvent('onresize', EleResize._handleResize);
                delete  ele.__z_resizeListeners;
            }
        }
    }
} else {
    EleResize.on = function (ele, handler, context) {
        var handlers = ele.__z_resizeListeners;
        if (!handlers) {
            handlers = [];
            ele.__z_resizeListeners = handlers;
            if (getComputedStyle(ele, null).position === 'static') {
                ele.style.position = 'relative';
            }
            var obj = EleResize._createResizeTrigger(ele);
            ele.__resizeTrigger__ = obj;
            obj.__resizeElement__ = ele;
        }
        handlers.push({
            handler: handler,
            context: context
        });
    };
    EleResize.off = function (ele, handler, context) {
        var handlers = ele.__z_resizeListeners;
        if (handlers) {
            EleResize._removeHandler(ele, handler, context);
            if (handlers.length === 0) {
                var trigger = ele.__resizeTrigger__;
                if (trigger) {
                    trigger.contentDocument.defaultView.removeEventListener('resize', EleResize._handleResize);
                    ele.removeChild(trigger);
                    delete ele.__resizeTrigger__;
                }
                delete  ele.__z_resizeListeners;
            }
        }
    }
}
export default EleResize
qqjf-Web/src/components/autoscroll/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,197 @@
<template>
  <div class="auto-scroll-compontent" :style="{ width, height }">
    <div class="auto-scroll-outer" ref="frame" :class="[dir === 'vertical' ? 'vertical-outer' : 'horizontal-outer']">
      <div
        class="auto-scroll-wrapper"
        ref="wrapper"
        :key="refreshKey"
        :class="[dir === 'vertical' ? 'vertical-wrapper' : 'horizontal-wrapper']"
        :style="{
          top: moveTop + 'px',
          marginLeft: moveLeft + 'px',
          transition: transition
        }"
      >
        <slot></slot>
      </div>
    </div>
  </div>
</template>
<script>
import eleResize from './eleResize.js';
export default {
  name: 'autoScrollCompontent',
  props: {
    dir: {
      type: String,
      default: 'vertical' /* æ–¹å‘值:水平-horizontal ç«–-vertical */
    },
    width: {
      type: String,
      default: '100%'
    },
    height: {
      type: String,
      default: '100%'
    },
    stepSpeed: {
      type: Number,
      default: 500 /* ç§»åŠ¨é€Ÿåº¦ï¼Œå•ä½ ms/100px */
    },
    wait: {
      type: Number,
      default: 3000 /* å•次动画结束后的等待时间,单位 ms */
    }
  },
  data() {
    return {
      $frame: null,
      refreshKey: 0,
      outerWidth: 0,
      outerHeight: 0,
      wrapperWidth: 0,
      wrapperHeight: 0,
      moveDistance: 0,
      moveTop: 0,
      moveLeft: 0,
      transition: 'all 0',
      interval: null,
      roundTime: 0 /* ä¸€ä¸ªæ»šåŠ¨å‘¨æœŸéœ€è¦çš„æ—¶é—´ */
    };
  },
  mounted() {
    this.init();
  },
  beforeDestroy() {
    this.clearInterval();
    this.destroyEleResize();
  },
  methods: {
    init() {
      this.moveTop = 0;
      this.moveLeft = 0;
      this.callSize();
      this.createAnimation();
      this.createEleResize();
    },
    /* åˆ›å»ºdiv宽高变化监听器 */
    createEleResize() {
      this.$frame = this.$refs.frame;
      eleResize.on(this.$frame, this.eleListener);
    },
    /* div宽高监听器监听事件 */
    eleListener() {
      this.moveTop = 0;
      this.moveLeft = 0;
      this.callSize();
      this.clearInterval();
      this.createAnimation();
    },
    /* å®½é«˜è®¡ç®— */
    callSize() {
      if (this.dir === 'vertical') {
        this.outerHeight = this.$refs.frame.offsetHeight;
        this.wrapperHeight = this.$refs.wrapper.offsetHeight;
        if (this.wrapperHeight > this.outerHeight) {
          this.moveDistance = this.wrapperHeight - this.outerHeight;
          this.roundTime = Math.floor((this.moveDistance / 100) * this.stepSpeed);
          this.transition = 'top ' + this.roundTime + 'ms linear';
        }
      } else {
        this.outerWidth = this.$refs.frame.offsetWidth;
        this.wrapperWidth = this.$refs.wrapper.scrollWidth;
        if (this.wrapperWidth > this.outerWidth) {
          this.moveDistance = this.wrapperWidth - this.outerWidth;
          this.roundTime = Math.floor((this.moveDistance / 100) * this.stepSpeed);
          this.transition = 'margin-left ' + this.roundTime + 'ms linear';
        }
      }
    },
    /* åˆ›å»ºåŠ¨ç”»è®¡æ—¶å™¨ */
    createAnimation() {
      if (this.roundTime) {
        if (this.dir === 'vertical') {
          this.animationVer();
          this.interval = window.setInterval(this.animationVer, this.roundTime + this.wait);
        } else {
          this.animationHor();
          this.interval = window.setInterval(this.animationHor, this.roundTime + this.wait);
        }
      }
    },
    /* çºµå‘滚动值变化 */
    animationVer() {
      if (this.moveTop === 0) {
        this.moveTop = -this.moveDistance;
      } else {
        this.moveTop = 0;
      }
    },
    /* æ¨ªå‘滚动值变化 */
    animationHor() {
      if (this.moveLeft === 0) {
        this.moveLeft = -this.moveDistance;
      } else {
        this.moveLeft = 0;
      }
    },
    /* è®¡æ—¶å™¨æ¸…楚 */
    clearInterval() {
      try {
        window.clearInterval(this.interval);
        this.interval = null;
      } catch (e) {
        //TODO handle the exception
      }
    },
    /* div宽高变化事件移除 */
    destroyEleResize() {
      try {
        eleResize.off(this.$frame, this.eleListener);
      } catch (e) {
        //TODO handle the exception
      }
    }
  }
};
</script>
<style scoped lang="scss">
.auto-scroll-compontent {
  .auto-scroll-outer {
    overflow: hidden;
    width: 100%;
    height: 100%;
    &.vertical-outer {
      position: relative;
    }
    &.horizontal-outer {
    }
  }
  .auto-scroll-wrapper {
    &.vertical-wrapper {
      position: absolute;
      width: 100%;
      height: auto;
      left: 0;
    }
    &.horizontal-wrapper {
      display: flex;
      width: 100%;
      height: 100%;
    }
  }
}
</style>
<style lang="scss">
.auto-scroll-compontent {
  .auto-scroll-wrapper {
    &.horizontal-wrapper {
      & > * {
        flex-shrink: 0;
      }
    }
  }
}
</style>
qqjf-Web/src/components/choose/addchoose.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,183 @@
<template>
  <div class="addchoose height overflow">
    <div class="centent-form overflowy-auto">
      <el-form
        class="margin-auto width90"
        ref="registerForm"
        :model="registerForm"
        size="mini"
        :rules="rules"
        label-position="left"
        label-width="100px"
      >
        <el-form-item label="零件编号:" prop="itemName">
          <el-input v-model="registerForm.itemName" clearable></el-input>
        </el-form-item>
        <el-form-item label="零件名称:" prop="enable">
          <el-input v-model="registerForm.itemDes" clearable></el-input>
        </el-form-item>
        <el-form-item label="重:" prop="creatorid">
          <el-input type="number" v-model="registerForm.weight" clearable></el-input>
        </el-form-item>
        <el-form-item label="类型:" prop="creatorid">
          <el-input v-model="registerForm.palletType" clearable></el-input>
        </el-form-item>
        <el-form-item label="单个公差:" prop="creatorid">
          <el-input v-model="registerForm.weightDifference" clearable></el-input>
        </el-form-item>
        <el-form-item label="启用:" prop="creatorid">
          <el-select v-model="registerForm.enable" clearable placeholder="请选择">
            <el-option v-for="item in enableList" :key="item.value" :label="item.label" :value="item.value">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="生产班线:" prop="creatorid">
          <!-- <el-input v-model="registerForm.createLine" clearable></el-input> -->
          <el-select v-model="registerForm.createLine" clearable placeholder="请选择">
            <el-option
              v-for="(item, index) in createLineList"
              :key="'productionLineName' + index"
              :label="item.productionLineName"
              :value="item.productionLineName"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="装箱数量:" prop="creatorid">
          <el-input v-model="registerForm.maxNum" type="number" clearable></el-input>
        </el-form-item>
        <el-form-item label="单价:" prop="creatorid">
          <el-input v-model="registerForm.price" clearable></el-input>
        </el-form-item>
        <el-form-item label="单位:" prop="creatorid">
          <el-input v-model="registerForm.unit" clearable></el-input>
        </el-form-item>
      </el-form>
    </div>
    <div class="addchoose-button text-right margin-right15 margin-top2">
      <el-button type="primary" size="mini" class="form-buttom" @click="submitForm('registerForm')">提交</el-button>
      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">取消</el-button>
    </div>
  </div>
</template>
<script>
import { ItemAddOrUpdate } from '@/api/enterchoose';
import { ProductionLineSearch } from '@/api/ProductionLine';
export default {
  data() {
    return {
      registerForm: {},
      containerTypeList: [
        {
          label: 'P71-2222',
          value: 'P71-2222'
        },
        {
          label: 'P71-3333',
          value: 'P71-3333'
        }
      ],
      statusList: [
        {
          label: 0,
          value: 0
        },
        {
          label: 1,
          value: 1
        }
      ],
      enableList: [
        {
          label: '启用',
          value: 1
        },
        {
          label: '禁用',
          value: 0
        }
      ],
      createLineList: [],
      rules: {
        itemName: { required: true, message: '请输零件编号', trigger: 'change' }
      }
    };
  },
  props: {
    //     rowitem: {
    //       type: Object,
    //       default: {}
    //     }
  },
  mounted() {
    // if (JSON.stringify(this.rowitem) != '{}') {
    //   this.registerForm = this.rowitem;
    // }
    this.ProductionLineSearch();
  },
  methods: {
    //班线
    ProductionLineSearch() {
      ProductionLineSearch('1&onePageNum=999').then(res => {
        if (res.code == 0) {
          let data = res.data || [];
          this.createLineList = data;
        }
      });
    },
    submitForm(registerForm) {
      this.$refs[registerForm].validate(valid => {
        if (valid) {
          ItemAddOrUpdate(this.registerForm).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '提交成功'
              });
              this.$emit('addsubmit');
            } else {
              this.$message({
                type: 'warning',
                message: '提交失败'
              });
            }
          });
        } else {
        }
      });
    }
  },
  watch: {}
};
</script>
<style lang="scss" scoped>
.addchoose {
  width: 98%;
  padding: 1%;
  .show-pwd {
    position: absolute;
    right: 10px;
    top: 3px;
    font-size: 16px;
    color: #889aa4;
    cursor: pointer;
    user-select: none;
  }
  .centent-form {
    height: 92%;
    width: 100%;
    margin: auto;
  }
  .addchoose-button {
  }
  ::v-deep .el-form-item__content {
    width: 60%;
  }
  ::v-deep .el-select {
    width: 100%;
  }
}
</style>
qqjf-Web/src/components/choose/choose.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,211 @@
<template>
  <div class="choose height overflow">
    <div class="width overflow height92">
      <div class="chose-height">
        <div class="flex margintopbot justify-between">
          <div class="width50 flex align-center">
            <label class="width40 textalign">零件编号:</label>
            <el-input size="mini"
                      clearable
                      v-model="iqnuer.itemName"
                      class="width60"> </el-input>
          </div>
          <div class="width50 flex align-center">
            <label class="width40 textalign">零件名称:</label>
            <el-input size="mini"
                      clearable
                      v-model="iqnuer.itemDes"
                      class="width60"> </el-input>
          </div>
          <el-button type="primary"
                     size="mini"
                     @click="itemSearch">查询</el-button>
        </div>
        <div class="flex width justify-between"></div>
      </div>
      <div class="width chose-tebleheight margin-top2 overflow">
        <table-container height="91%"
                         :wipelist="wipelist"
                         :tableHead="tableHead"
                         :tableData="tableData"
                         :operation="false"
                         :currentPage="page"
                         :pageSize="pageSize"
                         :totle="totle"
                         :setshow="false"
                         :delShow="true"
                         :selectionShow="true"
                         @del="del"
                         @handleSelectionChange="handleSelectionChange"
                         @CurrentChange="CurrentChange" />
      </div>
    </div>
    <div class="choose-button text-right margin-right15 margin-top2">
      <el-button type="primary"
                 size="mini"
                 class="form-buttom"
                 @click="submitForm">确认选择</el-button>
      <el-button type="primary"
                 size="mini"
                 class="form-buttom"
                 @click="$emit('cancel')">取消</el-button>
    </div>
  </div>
</template>
<script>
import { TableContainer, Modal } from '@/components/index';
import { itemSearch, ItemDelete } from '@/api/enterchoose';
const { edterchoose } = require('@/components/tableContainer/tableHead');
export default {
  data () {
    return {
      iqnuer: {},
      inOrderCodelist: [
        {
          label: '无',
          value: ''
        }
      ],
      tableData: [],
      handlelist: [], //勾选数据
      totle: 0,
      page: 1,
      pageSize: 20
    };
  },
  props: {
    wipelist: {
      type: Array,
      default: () => []
    },
    inOrderCodeShow: {
      type: Boolean,
      default: true
    },
    choice: {
      type: Boolean,
      default: true
    }
  },
  components: { TableContainer },
  computed: {
    tableHead () {
      return edterchoose;
    }
  },
  mounted () {
    this.itemSearch();
  },
  methods: {
    //查询
    itemSearch () {
      itemSearch(this.page + '&onePageNum=' + this.pageSize, this.iqnuer).then(res => {
        if (res.code == 0) {
          let data = res.data;
          data.forEach(item => {
            item.image = process.env.IMAGE_URL + item.image;
          });
          this.tableData = data;
          this.totle = res.num;
        }
      });
    },
    CurrentChange (e) {
      this.page = e;
      this.itemSearch();
    },
    //勾选
    handleSelectionChange (e) {
      console.log(e);
      this.handlelist = e;
    },
    submitForm () {
      if (this.choice) {
        if (this.handlelist.length == 1) {
          this.$emit('chooseClick', this.handlelist, this.iqnuer.inOrderCode);
        } else if (this.handlelist.length == 0) {
          this.$message({
            type: 'warning',
            message: '请勾选一条数据'
          });
        } else if (this.handlelist.length > 1) {
          this.$message({
            type: 'warning',
            message: '只能勾选一条数据'
          });
        }
      } else {
        this.$emit('chooseClick', this.handlelist, this.iqnuer.inOrderCode);
      }
    },
    //删除
    del (row) {
      this.$confirm('此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          const { itemName } = { ...row };
          ItemDelete({ itemName }).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '删除成功'
              });
              this.itemSearch();
            } else {
              this.$message({
                type: 'warning',
                message: '删除失败'
              });
            }
          });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
    }
  },
  watch: {}
};
</script>
<style lang="scss" scoped>
.choose {
  width: 98%;
  padding: 1%;
  .chose-height {
    height: 40px;
  }
  .chose-tebleheight {
    height: calc(100% - 60px);
  }
  .show-pwd {
    position: absolute;
    right: 10px;
    top: 3px;
    font-size: 16px;
    color: #889aa4;
    cursor: pointer;
    user-select: none;
  }
  .centent-form {
    height: 92%;
    width: 100%;
    margin: auto;
  }
  .choose-button {
  }
  ::v-deep .el-form-item__content {
    width: 60%;
  }
  ::v-deep .el-select {
    // width: 100%;
  }
}
</style>
qqjf-Web/src/components/chooseRelevanceFinishedPart/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,358 @@
<!-- é€‰æ‹©å…³è”完工入库零件任务 -->
<template>
  <div class="chooseRelevanceFinishedPart height overflow">
    <div class="width overflow height92">
      <div class="chose-height">
        <div class="flex margintopbot justify-between">
          <div class="width50 flex align-center">
            <label class="width40 textalign">零件编号:</label>
            <el-input size="mini"
                      disabled
                      clearable
                      v-model="iqnuer.itemName"
                      class="width60"> </el-input>
          </div>
          <div class="width50 flex align-center">
            <label class="width40 textalign">零件名称:</label>
            <el-input size="mini"
                      clearable
                      disabled
                      v-model="iqnuer.itemDes"
                      class="width60"> </el-input>
          </div>
          <el-button type="primary"
                     size="mini"
                     @click="itemSearch">查询</el-button>
        </div>
        <div class="flex width justify-between"></div>
      </div>
      <div class="width chose-tebleheight margin-top2 overflow">
        <table-container height="91%"
                         :wipelist="wipelist"
                         :tableHead="tableHead"
                         :tableData="tableData"
                         :operation="false"
                         :currentPage="page"
                         :pageSize="pageSize"
                         :totle="totle"
                         :setshow="false"
                         :delShow="true"
                         :selectionShow="true"
                         @del="del"
                         @handleSelectionChange="handleSelectionChange"
                         @CurrentChange="CurrentChange" />
      </div>
    </div>
    <div class="chooseRelevanceFinishedPart-button text-right margin-right15 margin-top2">
      <el-button type="primary"
                 size="mini"
                 class="form-buttom"
                 @click="submitForm">确认选择</el-button>
      <el-button type="primary"
                 size="mini"
                 class="form-buttom"
                 @click="$emit('cancel')">取消</el-button>
    </div>
  </div>
</template>
<script>
import { TableContainer, Modal } from '@/components/index';
import { ItemDelete } from '@/api/enterchoose';
import { ContainerVsItemSearch } from '@/api/enter';
//const { edterchoose } = require('@/components/tableContainer/tableHead');
//显示表头
const chooseRelevanceFinishedPartHeader = [{
  columnDescription: '零件编号',
  columnName: 'itemName',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '零件名称',
  columnName: 'itemDes',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '零件数',
  columnName: 'itemNum',
  sortable: true,
  wipe: true,
  width: 90
},
{
  columnDescription: '零件重量',
  columnName: 'itemWeight',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '零件类型',
  columnName: 'itemType',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '零件公差',
  columnName: 'itemWeightDifference',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '器具编号',
  columnName: 'containerName',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '器具类型',
  columnName: 'containerType',
  sortable: true,
  wipe: true,
  width: 100
},
// {
//   columnDescription: '托盘状态',
//   columnName: 'containerStatus',
//   sortable: true,
//   wipe:true,
// },
{
  columnDescription: '器具重量',
  columnName: 'containerWeight',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '器具公差',
  columnName: 'containerWeightDifference',
  sortable: true,
  wipe: true,
  width: 100
},
// {
//   columnDescription: '入库计划',
//   columnName: 'inOrderCode',
//   sortable: true,
//   wipe: true,
//   width: 130
// },
{
  columnDescription: '出库计划',
  columnName: 'outOrderCode',
  sortable: true,
  wipe: true,
  width: 130
},
{
  columnDescription: '更新时间',
  columnName: 'updateTime',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '需返修',
  columnName: 'isBad',
  sortable: true,
  wipe: true,
  width: 90
},
{
  columnDescription: '返修车间',
  columnName: 'badByFactory',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '生产班线',
  columnName: 'createLine',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '创建人',
  columnName: 'createUser',
  sortable: true,
  wipe: true
}
  // {
  //   columnDescription: '启用',
  //   columnName: 'enable',
  //   sortable: true,
  //   wipe:true,
  // },
];
export default {
  data () {
    return {
      iqnuer: {
        isSearchNoRelevanceInOrder: true, //表示是查询未关联冲压生产计划的任务
        itemName: this.pItemName,
        itemDes: this.pItemDes
      },
      inOrderCodelist: [
        {
          label: '无',
          value: ''
        }
      ],
      tableData: [],
      handlelist: [], //勾选数据
      totle: 0,
      page: 1,
      pageSize: 20
    };
  },
  props: {
    wipelist: {
      type: Array,
      default: () => []
    },
    inOrderCodeShow: {
      type: Boolean,
      default: true
    },
    choice: {
      type: Boolean,
      default: true
    },
    pItemName: {
      type: String
    },
    pItemDes: {
      type: String
    }
  },
  components: { TableContainer },
  computed: {
    tableHead () {
      return chooseRelevanceFinishedPartHeader;
    }
  },
  mounted () {
    this.itemSearch();
  },
  methods: {
    //查询-已经完工入库的任务
    itemSearch () {
      ContainerVsItemSearch(this.page + '&onePageNum=' + this.pageSize, this.iqnuer).then(res => {
        if (res.code == 0) {
          let data = res.data;
          data.forEach(item => {
            item.image = process.env.IMAGE_URL + item.image;
          });
          this.tableData = data;
          this.totle = res.num;
        }
      });
    },
    CurrentChange (e) {
      this.page = e;
      this.itemSearch();
    },
    //勾选
    handleSelectionChange (e) {
      console.log(e);
      this.handlelist = e;
    },
    submitForm () {
      if (this.choice) {
        if (this.handlelist.length > 0) {
          this.$emit('submitForm', this.handlelist, this.iqnuer.inOrderCode);
        } else if (this.handlelist.length == 0) {
          this.$message({
            type: 'warning',
            message: '请勾选至少一条数据'
          });
        }
        // else if (this.handlelist.length > 1) {
        //   this.$message({
        //     type: 'warning',
        //     message: '只能勾选一条数据'
        //   });
        // }
      } else {
        this.$emit('submitForm', this.handlelist, this.iqnuer.inOrderCode);
      }
    },
    //删除
    del (row) {
      this.$confirm('此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          const { itemName } = { ...row };
          ItemDelete({ itemName }).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '删除成功'
              });
              this.itemSearch();
            } else {
              this.$message({
                type: 'warning',
                message: '删除失败'
              });
            }
          });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
    }
  },
  watch: {}
};
</script>
<style lang="scss" scoped>
.chooseRelevanceFinishedPart {
  width: 98%;
  padding: 1%;
  .chose-height {
    height: 40px;
  }
  .chose-tebleheight {
    height: calc(100% - 60px);
  }
  .show-pwd {
    position: absolute;
    right: 10px;
    top: 3px;
    font-size: 16px;
    color: #889aa4;
    cursor: pointer;
    user-select: none;
  }
  .centent-form {
    height: 92%;
    width: 100%;
    margin: auto;
  }
  .chooseRelevanceFinishedPart-button {
  }
  ::v-deep .el-form-item__content {
    width: 60%;
  }
  ::v-deep .el-select {
    // width: 100%;
  }
}
</style>
qqjf-Web/src/components/chooseUser/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,212 @@
<!--选择用户-->
<template>
  <div class="choose height overflow">
    <div class="width overflow height92">
      <div class="chose-height">
        <div class="flex margintopbot justify-between">
          <div class="width50 flex align-center">
            <label class="width40 textalign">登录名:</label>
            <el-input size="mini"
                      clearable
                      v-model="iqnuer.itemName"
                      class="width60"> </el-input>
          </div>
          <div class="width50 flex align-center">
            <label class="width40 textalign">真实姓名:</label>
            <el-input size="mini"
                      clearable
                      v-model="iqnuer.itemDes"
                      class="width60"> </el-input>
          </div>
          <el-button type="primary"
                     size="mini"
                     @click="itemSearch">查询</el-button>
        </div>
        <div class="flex width justify-between"></div>
      </div>
      <div class="width chose-tebleheight margin-top2 overflow">
        <table-container height="91%"
                         :wipelist="wipelist"
                         :tableHead="tableHead"
                         :tableData="tableData"
                         :operation="false"
                         :currentPage="page"
                         :pageSize="pageSize"
                         :totle="totle"
                         :setshow="false"
                         :delShow="true"
                         :selectionShow="true"
                         @del="del"
                         @handleSelectionChange="handleSelectionChange"
                         @CurrentChange="CurrentChange" />
      </div>
    </div>
    <div class="choose-button text-right margin-right15 margin-top2">
      <el-button type="primary"
                 size="mini"
                 class="form-buttom"
                 @click="submitForm">确认选择</el-button>
      <el-button type="primary"
                 size="mini"
                 class="form-buttom"
                 @click="$emit('cancel')">取消</el-button>
    </div>
  </div>
</template>
<script>
import { TableContainer, Modal } from '@/components/index';
import { itemSearch, ItemDelete } from '@/api/enterchoose';
import { UserSearch, UserDelete } from '@/api/manage';
const { manage } = require('@/components/tableContainer/tableHead');
export default {
  data () {
    return {
      iqnuer: {
        IsWeldingAuditGroup: true
      },
      inOrderCodelist: [
        {
          label: '无',
          value: ''
        }
      ],
      tableData: [],
      handlelist: [], //勾选数据
      totle: 0,
      page: 1,
      pageSize: 20
    };
  },
  props: {
    wipelist: {
      type: Array,
      default: () => []
    },
    inOrderCodeShow: {
      type: Boolean,
      default: true
    },
    choice: {
      type: Boolean,
      default: true
    }
  },
  components: { TableContainer },
  computed: {
    tableHead () {
      return manage;
    }
  },
  mounted () {
    this.itemSearch();
  },
  methods: {
    //查询
    itemSearch () {
      UserSearch(this.page + '&onePageNum=' + this.pageSize, this.iqnuer).then(res => {
        if (res.code == 0) {
          let data = res.data;
          this.tableData = data;
          this.totle = res.num;
        }
      });
    },
    CurrentChange (e) {
      this.page = e;
      this.itemSearch();
    },
    //勾选
    handleSelectionChange (e) {
      console.log(e);
      this.handlelist = e;
    },
    submitForm () {
      if (this.choice) {
        if (this.handlelist.length == 1) {
          this.$emit('submitForm', this.handlelist, this.iqnuer.inOrderCode);
        } else if (this.handlelist.length == 0) {
          this.$message({
            type: 'warning',
            message: '请勾选一条数据'
          });
        } else if (this.handlelist.length > 1) {
          this.$message({
            type: 'warning',
            message: '只能勾选一条数据'
          });
        }
      } else {
        this.$emit('submitForm', this.handlelist, this.iqnuer.inOrderCode);
      }
    },
    //删除
    del (row) {
      this.$confirm('此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          const { itemName } = { ...row };
          ItemDelete({ itemName }).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '删除成功'
              });
              this.itemSearch();
            } else {
              this.$message({
                type: 'warning',
                message: '删除失败'
              });
            }
          });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
    }
  },
  watch: {}
};
</script>
<style lang="scss" scoped>
.choose {
  width: 98%;
  padding: 1%;
  .chose-height {
    height: 40px;
  }
  .chose-tebleheight {
    height: calc(100% - 60px);
  }
  .show-pwd {
    position: absolute;
    right: 10px;
    top: 3px;
    font-size: 16px;
    color: #889aa4;
    cursor: pointer;
    user-select: none;
  }
  .centent-form {
    height: 92%;
    width: 100%;
    margin: auto;
  }
  .choose-button {
  }
  ::v-deep .el-form-item__content {
    width: 60%;
  }
  ::v-deep .el-select {
    // width: 100%;
  }
}
</style>
qqjf-Web/src/components/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
export { default as TableContainer } from './tableContainer/index.vue'
export { default as Modal } from './modal/index.vue'
export { default as Choose } from './choose/choose.vue'
export { default as AddChoose } from './choose/addchoose.vue'
export { default as chooseRelevanceFinishedPart } from './chooseRelevanceFinishedPart/index.vue'
export { default as chooseUser } from './chooseUser/index.vue'
qqjf-Web/src/components/modal/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
<!--  :style="modabg ? 'background:unset; position: absolute;' : ''"-->
<template>
  <div id="deta-modal">
    <!-- <draggable element="ul" v-model="list"> -->
    <div class="box-modal borderR8"
         :style="modalStyle">
      <div class="title-modal">
        <p class="p-title">
          <slot name="title"></slot>
        </p>
        <i class="el-icon-close pointer fontSize1_2"
           @click="$emit('cancel')"></i>
      </div>
      <div class="centent-modal">
        <!-- <el-scrollbar wrap-class="scrollbar-wrapper" style="height:100%"> -->
        <slot name="centent"></slot>
        <!-- </el-scrollbar> -->
      </div>
    </div>
    <!-- </draggable> -->
  </div>
</template>
<script>
import { number } from 'echarts';
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import ã€Šç»„件名称》 from '《组件路径》';
import draggable from 'vuedraggable';
export default {
  data () {
    //这里存放数据
    return {
      ismodal: false,
      list: [{ name: '1' }]
    };
  },
  props: {
    modabg: {
      type: Boolean,
      default: false
    },
    modalStyle: {
      type: Object,
      default: {
        width: '45%' //设置默认的宽度,原先是 40% ã€EditBy shaocx,2022-11-10】
      }
    }
  },
  components: { draggable },
  //方法集合
  methods: {
    cancel () {
      this.$emit('cancel');
    }
  },
  //监控data中的数据变化
  watch: {},
  //如果页面有keep-alive缓存功能,这个函数会触发
  activated () { }
};
</script>
<style lang="scss" scoped>
#deta-modal {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.3);
  // transition: all 0.3s;
  z-index: 999;
  .box-modal {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 40%;
    height: 85%;
    border-radius: 6px;
    transform: translate(-50%, -50%);
    background: #fff;
    box-shadow: 0 0 4px #345;
    // transition: all 0.5s;
    overflow: hidden;
    .title-modal {
      padding: 10px;
      display: flex;
      align-items: center;
      justify-content: space-between;
      border-bottom: 1px solid #e6eaf1;
      background: #f5f7fa;
      .p-title {
        font-size: 20px;
        padding-left: 5px;
      }
      .fontSize1_2 {
        font-size: 20px;
        margin-right: 15px;
        &:hover {
          transition: all 0.3s;
          transform: rotate(360deg);
        }
      }
    }
    .centent-modal {
      width: 98%;
      height: calc(100% - 62px);
      padding: 1%;
      overflow: hidden;
    }
  }
  // .el-scrollbar__view {
  //     height: 100%;
  // }
}
</style>
qqjf-Web/src/components/tableContainer/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,654 @@
<template>
  <div id="tableContainer"
       class="scrollCss"
       :key="number">
    <!-- @row-click="handleRowClick"   v-el-table-infinite-scroll="load"
      :infinite-scroll-disabled="infintedisabled"   :style="{ height: $slots.default ? '91%' : '95%' }" -->
    <el-table class="borderR8"
              :data="tablelist"
              v-loading="loading"
              element-loading-text="拼命加载中"
              element-loading-spinner="el-icon-loading"
              highlight-current-row
              :border="bordershow"
              :show-summary="showSummary"
              stripe
              :cell-style="cellStyle"
              height="100%"
              style="height: calc(100% - 35px) !important"
              :key="number"
              @selection-change="handleSelectionChange"
              @row-dblclick="rowdblclick"
              @row-click="rowclick"
              ref="tableCommon">
      <el-table-column v-if="selectionShow"
                       type="selection"
                       header-align="center"
                       align="center"
                       width="55">
      </el-table-column>
      <el-table-column header-align="center"
                       type="index"
                       label="序号"
                       width="60"
                       v-if="containHead.length > 0"></el-table-column>
      <template v-for="item in containHead">
        <el-table-column header-align="left"
                         align="left"
                         :label="item.columnDescription"
                         :prop="item.columnName"
                         :key="item.columnName"
                         :sortable="item.sortable"
                         v-if="item.wipe && wipelist.indexOf(item.columnName) == -1"
                         :min-width="fixWidth(item.columnDescription)"
                         :width="item.width ? item.width : ''">
          <template slot-scope="{ row }">
            <!-- v-if="item.columnName != 'maxNum' && item.coucolumnName != 'image'" -->
            <p :style="
                item.columnName == 'stStatus' && row[item.columnName] == '预警'
                  ? 'color: #f8b360'
                  : item.columnName == 'stStatus' && row[item.columnName] == '超期'
                  ? 'color:#E36168'
                  : ''
              "
               v-if="plist.indexOf(item.columnName) == -1">
              {{ row[item.columnName] }}
            </p>
            <el-image v-if="item.columnName == 'image'"
                      style="width: 35px; height: 35px"
                      :src="row[item.columnName]"
                      :preview-src-list="[row[item.columnName]]">
            </el-image>
            <p class=""
               v-if="item.columnName == 'inOrderCode' && !row.edit">
              {{ row[item.columnName] }}
            </p>
            <p class=""
               v-if="item.columnName == 'maxNum' && !row.edit">
              {{ row[item.columnName] }}
            </p>
            <p class=""
               v-if="item.columnName == 'doTime' && !row.edit">{{ row[item.columnName] }}</p>
            <el-input oninput="value=value.replace(/[^\d.]/g,'')"
                      size="mini"
                      v-if="row.edit && item.columnName == 'maxNum'"
                      v-model="row.maxNum"></el-input>
            <el-select v-if="row.edit && item.columnName == 'inOrderCode'"
                       v-model="row.inOrderCode"
                       placeholder="请选择"
                       size="mini">
              <el-option v-for="(item, index) in inOrderCodeList"
                         :key="index + 'inOrderCode'"
                         :label="item.inOrderCode"
                         :value="item.inOrderCode">
                <span style="float: left">{{ item.inOrderCode }}</span>
                <span style="float: right; color: #ff0000;font-weight:bold; font-size: 17px">{{ item.totalNum }}</span>
              </el-option>
            </el-select>
            <el-date-picker style="width: 100%"
                            v-if="row.edit && item.columnName == 'doTime'"
                            v-model="row.doTime"
                            size="mini"
                            value-format="yyyy-MM-dd HH:mm:ss"
                            type="datetime"
                            placeholder="选择日期时间">
            </el-date-picker>
          </template>
        </el-table-column>
      </template>
      <el-table-column v-if="operation"
                       :width="operationwidth"
                       fixed="right"
                       align="center">
        <template slot="header"
                  slot-scope="scope">
          <span>操作</span>
          <span v-if="setshow"
                class="set"
                @click="modalShow = true">设置</span>
        </template>
        <template v-if="buttonshow"
                  slot-scope="scope">
          <el-button class="elbuttonsize"
                     v-if="mustFirstShow"
                     :disabled="scope.row.taskStatus == '完成' || scope.row.taskStatus == '异常/取消'"
                     :style="
              scope.row.taskStatus == '完成' || scope.row.taskStatus == '异常/取消'
                ? 'color: #909399'
                : 'color: #f8b360'
            "
                     @click.native.prevent="$emit('mustFirst', scope.row)"
                     type="text">
            å¼ºåˆ¶ä¼˜å…ˆ
          </el-button>
          <el-button class="elbuttonsize"
                     v-if="issuShow"
                     :disabled="scope.row.orderStatus != '未下发' && scope.row.orderStatus != '新建'"
                     :style="
              scope.row.orderStatus == '未下发' || scope.row.orderStatus == '新建' ? 'color: #f8b360' : 'color: #909399'
            "
                     @click.native.prevent="$emit('issu', scope.row)"
                     type="text">
            ä¸‹å‘
          </el-button>
          <!-- å®Œå·¥å“è¾“入页面 -->
          <el-button class="elbuttonsize"
                     v-if="relevanceShow"
                     :style="
             'color: #426ab3'
            "
                     @click.native.prevent="$emit('relevance', scope.row)"
                     type="text">
            å…³è”
          </el-button>
          <el-button class="elbuttonsize"
                     v-if="weldingAuditShow"
                     :style="
             'color: #426ab3'
            "
                     @click.native.prevent="$emit('weldingAudit', scope.row)"
                     type="text">
            æäº¤å®¡æ ¸
          </el-button>
          <el-button class="elbuttonsize"
                     v-if="unlineCommitShow"
                     :style="
             'color: #426ab3'
            "
                     @click.native.prevent="$emit('unlineCommit', scope.row)"
                     type="text">
            çº¿ä¸‹äº¤ä»˜
          </el-button>
          <el-button class="elbuttonsize"
                     v-if="editShow"
                     style="color: #f8b360"
                     @click.native.prevent="edit(scope.row)"
                     type="text">
            {{ scope.row.edit == true ? '保存' : scope.row.edit == false ? '编辑' : '编辑' }}
          </el-button>
          <el-button class="elbuttonsize"
                     v-if="maintask"
                     :disabled="scope.row.taskStatus == '完成' || scope.row.taskStatus == '异常/取消'"
                     :style="
              scope.row.taskStatus == '完成' || scope.row.taskStatus == '异常/取消'
                ? 'color: #909399'
                : 'color: #f8b360'
            "
                     @click.native.prevent="$emit('abnormal', scope.row)"
                     type="text">
            å¼‚常处理
          </el-button>
          <el-button class="elbuttonsize"
                     v-if="delShow"
                     style="color: #f8b360"
                     @click.native.prevent="del(scope.row)"
                     type="text">
            åˆ é™¤
          </el-button>
          <el-button class="elbuttonsize"
                     v-if="viewShow"
                     style="color: #7fb80e"
                     @click.native.prevent="view(scope.row)"
                     type="text">
            æŸ¥çœ‹
          </el-button>
          <el-button v-if="passShow"
                     size="mini"
                     type="text"
                     :style="
             'color:#1d953f'
            "
                     @click.native.prevent="$emit('passCommit', scope.row)">
            é€šè¿‡
          </el-button>
          <el-button v-if="rejectShow"
                     type="text"
                     size="mini"
                     :style="
             'color: #d71345'
            "
                     @click.native.prevent="$emit('rejectCommit', scope.row)">
            é©³å›ž
          </el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-pagination v-if="paginationshow"
                   class="elpagin"
                   background
                   small
                   @size-change="handleSizeChange"
                   @current-change="handleCurrentChange"
                   :current-page="currentPage"
                   :page-sizes="[5, 15, , 20, , 50, 100, 200, 300, 400, 1000]"
                   :page-size="pageSize"
                   layout="total, sizes, prev, pager, next, jumper"
                   :total="totle">
    </el-pagination>
    <transition name="modal">
      <modal v-if="modalShow"
             :modabg="true"
             @cancel="modalShow = false">
        <p slot="title">参数设置</p>
        <div class="height"
             slot="centent">
          <div class="width height overflow">
            <p class="width modal-title">点击右侧开关可以设置字段是否显示</p>
            <div class="modal-item margintopbot flex align-center justify-between">
              <p>字段名</p>
              <p>
                <span>显示排序</span>
                <span class="margin-left">字段显示</span>
              </p>
            </div>
            <div class="applyheight overflowy-auto">
              <draggable v-model="containHead"
                         :move="fielSetMove"
                         class="draggable-main"
                         tag="ul"
                         ghost-class="ghost"
                         chosen-class="chosen"
                         filter=".forbid"
                         animation="300"
                         @start="startDrag"
                         @end="endDrag">
                <template v-for="item in containHead">
                  <div :key="item.columnName"
                       class="modal-item margintopbot flex align-center justify-between">
                    <p>{{ item.columnDescription }}</p>
                    <p>
                      <span>
                        <el-switch v-model="item.sortable"
                                   :active-value="true"
                                   :inactive-value="false"> </el-switch>
                      </span>
                      <span class="margin-left">
                        <el-switch v-model="item.wipe"
                                   :active-value="true"
                                   :inactive-value="false"> </el-switch>
                      </span>
                    </p>
                  </div>
                </template>
              </draggable>
            </div>
            <div class="text-right margin-top2">
              <el-button type="primary"
                         size="mini">确定</el-button>
              <el-button size="mini">取消</el-button>
            </div>
          </div>
        </div>
      </modal>
    </transition>
  </div>
</template>
<script>
import elTableInfiniteScroll from 'el-table-infinite-scroll';
import draggable from 'vuedraggable';
import Modal from '../modal/index';
import { getimestampDate } from '@/utils/date';
export default {
  directives: {
    'el-table-infinite-scroll': elTableInfiniteScroll
  },
  name: 'tableCommon',
  props: {
    //行样式
    cellStyle: {
      type: Function
    },
    tableHead: Array,
    height: String,
    tableData: {
      type: Array,
      default: () => []
    },
    totle: {
      type: [String, Number],
      default: '0'
    },
    loading: {
      type: Boolean,
      default: false
    },
    paginationshow: {
      type: Boolean,
      default: true
    },
    //查看
    viewShow: {
      type: Boolean,
      default: false
    },
    bordershow: {
      type: Boolean,
      default: false
    },
    passShow: {
      type: Boolean,
      default: false
    },
    rejectShow: {
      type: Boolean,
      default: false
    },
    showSummary: {
      type: Boolean,
      default: false
    },
    selectionShow: {
      type: Boolean,
      default: false
    },
    operation: {
      type: Boolean,
      default: true
    },
    buttonshow: {
      type: Boolean,
      default: true
    },
    weldingAuditShow: {
      type: Boolean,
      default: false
    },
    unlineCommitShow: {
      type: Boolean,
      default: false
    },
    mustFirstShow: {
      type: Boolean,
      default: false
    },
    editShow: {
      type: Boolean,
      default: false
    },
    delShow: {
      type: Boolean,
      default: false
    },
    issuShow: {
      type: Boolean,
      default: false
    },
    inputshow: {
      type: Boolean,
      default: false
    },
    relevanceShow: {
      type: Boolean,
      default: false
    },
    wipelist: {
      type: Array,
      default: () => []
    },
    maintask: {
      type: Boolean,
      default: false
    },
    setshow: {
      type: Boolean,
      default: true
    },
    operationwidth: {
      type: [Number, String],
      default: 120
    },
    currentPage: {
      type: [Number, String],
      defaults: 1
    },
    pageSize: {
      type: [Number, String],
      defaults: 20
    },
    naxnumShow: {
      type: Boolean,
      default: false
    },
    inOrderCodeList: {
      type: Array,
      default: () => []
    }
  },
  components: { Modal, draggable },
  data () {
    const that = this;
    return {
      number: Math.random() * 100,
      tablelist: [],
      containHead: [],
      // currentPage: 1,
      modalShow: false,
      plist: ['doTime', 'maxNum', 'image', 'inOrderCode'],
      rowedit: false
    };
  },
  mounted () {
    this.containHead = this.tableHead;
    this.conversion(JSON.stringify(this.tableData));
  },
  methods: {
    //下拉加载
    load () { },
    fixWidth (val) {
      let length = 0;
      if (val.indexOf('(') != -1) {
        length = val.length * 16 + 10;
      } else {
        length = val.length * 25 + 10;
      }
      length = val == '生产计划单号' || val == '出库计划单号' ? 130 : length;
      if (length < 100) {
        length = 90;
      }
      return length;
    },
    //分页
    handleCurrentChange (e) {
      this.$emit('CurrentChange', e);
    },
    handleSizeChange (e) {
      this.$emit('SizeChange', e);
    },
    //筛选
    conversion (nl) {
      this.tablelist = JSON.parse(nl);
      this.tablelist.filter(item => {
        item.enable = item.enable == 1 ? '是' : item.enable == 0 ? '否' : item.enable;
        item.isLock = item.isLock == 1 ? '是' : item.isLock == 0 ? '否' : item.isLock;
        item.isBad = item.isBad == 1 ? '是' : item.isBad == 0 ? '否' : item.isBad;
        item.isWork = item.isWork == 1 ? '是' : item.isWork == 0 ? '否' : item.isWork;
        item.isErp = item.isErp == 1 ? '是' : item.isErp == 0 ? '否' : item.isErp;
        item.isFull = item.isFull == 1 ? '是' : item.isFull == 0 ? '否' : item.isFull;
        item.isDestination = item.isDestination == 1 ? '是' : item.isDestination == 0 ? '否' : item.isDestination;
        item.isError = item.isError == 1 ? '是' : item.isError == 0 ? '否' : item.isError;
        item.isMainOut = item.isMainOut == 1 ? '是' : item.isMainOut == 0 ? '否' : item.isMainOut;
        item.taskType == 1 ? '入库' : item.taskType == 2 ? '出库' : item.taskType == 3 ? '移库' : item.taskType;
        item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
        item.updateTime = item.updateTime ? getimestampDate(item.updateTime) : '';
        item.createTime = item.createTime ? getimestampDate(item.createTime) : '';
        item.taskCreateTime = item.taskCreateTime ? getimestampDate(item.taskCreateTime) : '';
        item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
        item.CheckTime = item.CheckTime ? getimestampDate(item.CheckTime) : '';//审核时间
        item.SendTime = item.SendTime ? getimestampDate(item.SendTime) : '';//提交审核时间
        if (item.IsWeldingAuditGroup != undefined) {
          item.IsWeldingAuditGroupText = item.IsWeldingAuditGroup ? '是' : item.IsWeldingAuditGroup == false ? '否' : item.IsWeldingAuditGroup;
        }
        //
      });
    },
    //拖拽开始
    startDrag (e) { },
    //拖拽结束
    endDrag (e) {
      this.number = Math.random() * 100;
    },
    //编辑
    edit (row) {
      let rowobj = { ...row };
      rowobj.enable = rowobj.enable == '是' ? 1 : rowobj.enable == '否' ? 0 : rowobj.enable;
      rowobj.isLock = rowobj.isLock == '是' ? 1 : rowobj.isLock == '否' ? 0 : rowobj.isLock;
      rowobj.isBad = rowobj.isBad == '是' ? 1 : rowobj.isBad == '否' ? 0 : rowobj.isBad;
      rowobj.isWork = rowobj.isWork == 1 ? '是' : rowobj.isWork == 0 ? '否' : rowobj.isWork;
      rowobj.isErp = rowobj.isErp == 1 ? '是' : rowobj.isErp == 0 ? '否' : rowobj.isErp;
      rowobj.isFull = rowobj.isFull == '是' ? 1 : rowobj.isFull == '否' ? 0 : rowobj.isFull;
      rowobj.isDestination = rowobj.isDestination == 1 ? '是' : rowobj.isDestination == 0 ? '否' : rowobj.isDestination;
      rowobj.isError = rowobj.isError == '是' ? 1 : rowobj.isError == '否' ? 0 : rowobj.isError;
      rowobj.taskType =
        rowobj.taskType == '入库' ? 1 : rowobj.taskType == '出库' ? 2 : rowobj.taskType == '移库' ? 3 : rowobj.taskType;
      rowobj.isMainOut = rowobj.isMainOut == 1 ? '是' : rowobj.isMainOut == 0 ? '否' : rowobj.isMainOut;
      console.log(this.inputshow);
      if (this.inputshow) {
        this.rowdblclick(row);
      } else {
        this.$emit('edit', rowobj);
      }
    },
    //查看
    view (row) {
      let rowobj = { ...row };
      rowobj.enable = rowobj.enable == '是' ? 1 : rowobj.enable == '否' ? 0 : rowobj.enable;
      rowobj.isLock = rowobj.isLock == '是' ? 1 : rowobj.isLock == '否' ? 0 : rowobj.isLock;
      rowobj.isBad = rowobj.isBad == '是' ? 1 : rowobj.isBad == '否' ? 0 : rowobj.isBad;
      rowobj.isWork = rowobj.isWork == 1 ? '是' : rowobj.isWork == 0 ? '否' : rowobj.isWork;
      rowobj.isErp = rowobj.isErp == 1 ? '是' : rowobj.isErp == 0 ? '否' : rowobj.isErp;
      rowobj.isFull = rowobj.isFull == '是' ? 1 : rowobj.isFull == '否' ? 0 : rowobj.isFull;
      rowobj.isDestination = rowobj.isDestination == 1 ? '是' : rowobj.isDestination == 0 ? '否' : rowobj.isDestination;
      rowobj.isError = rowobj.isError == '是' ? 1 : rowobj.isError == '否' ? 0 : rowobj.isError;
      rowobj.taskType =
        rowobj.taskType == '入库' ? 1 : rowobj.taskType == '出库' ? 2 : rowobj.taskType == '移库' ? 3 : rowobj.taskType;
      rowobj.isMainOut = rowobj.isMainOut == 1 ? '是' : rowobj.isMainOut == 0 ? '否' : rowobj.isMainOut;
      console.log(this.inputshow);
      if (this.inputshow) {
        this.rowdblclick(row);
      } else {
        this.$emit('view', rowobj);
      }
    },
    //删除
    del (row) {
      let rowobj = { ...row };
      rowobj.enable = rowobj.enable == '是' ? 1 : rowobj.enable == '否' ? 0 : rowobj.enable;
      rowobj.isLock = rowobj.isLock == '是' ? 1 : rowobj.isLock == '否' ? 0 : rowobj.isLock;
      rowobj.isBad = rowobj.isBad == '是' ? 1 : rowobj.isBad == '否' ? 0 : rowobj.isBad;
      this.$emit('del', rowobj);
    },
    //勾选
    handleSelectionChange (e) {
      this.$emit('handleSelectionChange', e);
    },
    //双击行
    rowdblclick (item) {
      item.edit = !item.edit;
      this.$emit('itemchange', this.tablelist, item);
    },
    //单机行
    rowclick (row) {
      this.$emit('rowchange', row);
    },
    tableRowClassName ({ row, rowIndex }) {
      this.$emit('tableRowClassName', row, rowIndex);
    },
    fielSetMove () { }
  },
  watch: {
    tableData: {
      handler (nl, ol) {
        this.number = Math.random() * 1000;
        this.conversion(JSON.stringify(nl));
      },
      deep: true
    }
  }
};
</script>
<style lang="scss" scoped>
#tableContainer {
  position: relative;
  z-index: 6;
  height: 100%;
  .widthscope {
    width: 200px;
  }
  .elbuttonsize {
    font-size: 0.8rem;
  }
  .set {
    color: #0465a8;
    cursor: pointer;
    display: inline-block;
    margin-left: 20px;
  }
  .modal-title {
    background-color: #f0f9eb;
    color: #67c23a;
    font-size: 14px;
    padding: 4px 10px;
    border-radius: 4px;
  }
  .modal-item {
    border: 1px solid #f8f8f8;
    padding: 4px 10px;
    background-color: #f3f3f3;
    font-size: 14px;
  }
  .draggable-main {
    margin: 0;
    padding: 0;
    cursor: pointer;
    .drag {
      border: 1px dotted rgb(44, 104, 163);
      background-color: #409eff;
    }
    .chosen {
      background-color: #409eff;
      color: #fff;
    }
    .ghost {
      background-color: #409eff;
    }
  }
  ::v-deep {
    .el-table__fixed-right {
      right: 1px !important;
    }
    .el-table--border td {
      // border-right: none !important;
    }
  }
  ::v-deep .el-table {
    height: calc(100% - 35px) !important;
  }
  ::v-deep .el-button + .el-button {
    margin-left: 5px;
  }
  ::v-deep .el-table__empty-text {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }
  ::v-deep .el-table td,
  .el-table th {
    padding: 4px 0;
  }
}
</style>
qqjf-Web/src/components/tableContainer/tableHead.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2084 @@
const manage = [{
  columnDescription: '登录名',
  columnName: 'userName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '真实姓名',
  columnName: 'userTrueName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '部门',
  columnName: 'deptName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '所属角色',
  columnName: 'roleName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '启用状态',
  columnName: 'enable',
  sortable: true,
  wipe: true
},
{
  columnDescription: '是否焊装审核组',
  columnName: 'IsWeldingAuditGroupText',
  sortable: true,
  wipe: true
},
{
  columnDescription: '创建人',
  columnName: 'creatorId',
  sortable: true,
  wipe: true
},
{
  columnDescription: '修改时间',
  columnName: 'updateTime',
  sortable: true,
  wipe: true
}
];
const dept = [{
  columnDescription: '部门名称',
  columnName: 'deptName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '部门描述',
  columnName: 'deptDes',
  sortable: true,
  wipe: true
},
{
  columnDescription: '是否启用',
  columnName: 'enable',
  sortable: true,
  wipe: true
},
{
  columnDescription: '更新时间',
  columnName: 'updateTime',
  sortable: true,
  wipe: true
}
];
const role = [{
  columnDescription: '角色名称',
  columnName: 'roleName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '是否启用',
  columnName: 'enable',
  sortable: true,
  wipe: true
},
{
  columnDescription: '创建人',
  columnName: 'userName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '修改时间',
  columnName: 'updateTime',
  sortable: true,
  wipe: true
}
];
const storage = [{
  columnDescription: '仓库编码',
  columnName: 'storageCode',
  sortable: true,
  wipe: true
},
{
  columnDescription: '仓库名称',
  columnName: 'storageName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '是否可用',
  columnName: 'enable',
  sortable: true,
  wipe: true
},
{
  columnDescription: '公司名称',
  columnName: 'shipperCompanyName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '仓库地址',
  columnName: 'shipperAddress',
  sortable: true,
  wipe: true
},
{
  columnDescription: '创建时间',
  columnName: 'createDate',
  sortable: true,
  wipe: true
}
];
const position = [{
  columnDescription: '库位名称',
  columnName: 'place',
  sortable: true,
  wipe: true
},
{
  columnDescription: '库位类型',
  columnName: 'placeType',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '库位规格',
  columnName: 'specification',
  sortable: true,
  wipe: true,
  width: 200
},
// {
//   columnDescription: '有货',
//   columnName: 'isFull',
//   sortable: true,
//   wipe:true,
// },
{
  columnDescription: '锁定',
  columnName: 'isLock',
  sortable: true,
  wipe: true
},
{
  columnDescription: '排数',
  columnName: 'row',
  sortable: true,
  wipe: true
},
{
  columnDescription: '列数',
  columnName: 'col',
  sortable: true,
  wipe: true
},
{
  columnDescription: '层数',
  columnName: 'layer',
  sortable: true,
  wipe: true
},
{
  columnDescription: '巷道(堆垛机)号',
  columnName: 'srmId',
  sortable: true,
  wipe: true
},
{
  columnDescription: '长',
  columnName: 'length',
  sortable: true,
  wipe: true
},
{
  columnDescription: '宽',
  columnName: 'width',
  sortable: true,
  wipe: true
},
{
  columnDescription: '高',
  columnName: 'height',
  sortable: true,
  wipe: true
}
];
const palte = [{
  columnDescription: '器具编号',
  columnName: 'containerName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '器具规格',
  columnName: 'containerType',
  sortable: true,
  wipe: true
},
// {
//   columnDescription: '状态',
//   columnName: 'status',
//   sortable: true,
//   wipe:true,
// },
{
  columnDescription: '重',
  columnName: 'weight',
  sortable: true,
  wipe: true
},
{
  columnDescription: '长',
  columnName: 'length',
  sortable: true,
  wipe: true
},
{
  columnDescription: '宽',
  columnName: 'width',
  sortable: true,
  wipe: true
},
{
  columnDescription: '高',
  columnName: 'height',
  sortable: true,
  wipe: true
},
{
  columnDescription: '公差',
  columnName: 'weightDifference',
  sortable: true,
  wipe: true
},
{
  columnDescription: '规格编号',
  columnName: 'palletCode',
  sortable: true,
  wipe: true
},
{
  columnDescription: '规格描述',
  columnName: 'palletType',
  sortable: true,
  wipe: true,
  width: 180
},
{
  columnDescription: '是否锁定',
  columnName: 'isLock',
  sortable: true,
  wipe: true
}
  // {
  //   columnDescription: '是否启用',
  //   columnName: 'enable',
  //   sortable: true,
  //   wipe: true
  // }
];
const stacker = [{
  columnDescription: '设备名',
  columnName: 'deviceName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '设备类型',
  columnName: 'deviceType',
  sortable: true,
  wipe: true
},
{
  columnDescription: '设备编号',
  columnName: 'deviceId',
  sortable: true,
  wipe: true
},
{
  columnDescription: '是否锁定',
  columnName: 'isLock',
  sortable: true,
  wipe: true
}
];
//冲压生产计划表头
const quotation = [{
  columnDescription: '生产计划单号',
  columnName: 'inOrderCode',
  sortable: true,
  wipe: true,
  width: 200
},
{
  columnDescription: '生产类型',
  columnName: 'orderType',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '订单状态',
  columnName: 'orderStatus',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '零件编号',
  columnName: 'itemName',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '零件名称',
  columnName: 'itemDes',
  sortable: true,
  wipe: true,
  width: 200
},
{
  columnDescription: '计划数量',
  columnName: 'totalNum',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '已完成数量',
  columnName: 'doneNum',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '提交人',
  columnName: 'senderName',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '提交时间',
  columnName: 'SendTime',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '审核人',
  columnName: 'checkerName',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '审核结果',
  columnName: 'CheckResult',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '审核时间',
  columnName: 'CheckTime',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '审核说明',
  columnName: 'CheckRemark',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '备注',
  columnName: 'deviceName5',
  sortable: true,
  wipe: true
},
{
  columnDescription: '创建人',
  columnName: 'createName',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '创建时间',
  columnName: 'createTime',
  sortable: true,
  wipe: true,
  width: 150
}, {
  columnDescription: '修改人',
  columnName: 'updateName',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '修改时间',
  columnName: 'updateTime',
  sortable: true,
  wipe: true,
  width: 150
}
];
const quotationedit = [{
  columnDescription: '零件编号',
  columnName: 'itemName',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '零件名称',
  columnName: 'itemDes',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '计划数量',
  columnName: 'maxNum',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '生产班线',
  columnName: 'createLine',
  sortable: true,
  wipe: true
},
{
  columnDescription: '计划日期',
  columnName: 'doTime',
  sortable: true,
  wipe: true
},
{
  columnDescription: '图片',
  columnName: 'image',
  sortable: true,
  wipe: true
}
];
//送签单关联完工数表单
const quotaion_relevanceEdit = [{
  columnDescription: '零件编号',
  columnName: 'itemName',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '零件名称',
  columnName: 'itemDes',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '入库数量',
  columnName: 'itemNum',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '生产班线',
  columnName: 'createLine',
  sortable: true,
  wipe: true
},
{
  columnDescription: '入库日期',
  columnName: 'updateTime',
  sortable: true,
  wipe: true
}
];
const enter = [{
  columnDescription: '零件编号',
  columnName: 'itemName',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '零件名称',
  columnName: 'itemDes',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '零件重量',
  columnName: 'itemWeight',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '零件类型',
  columnName: 'itemType',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '零件公差',
  columnName: 'itemWeightDifference',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '器具编号',
  columnName: 'containerName',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '器具类型',
  columnName: 'containerType',
  sortable: true,
  wipe: true,
  width: 100
},
// {
//   columnDescription: '托盘状态',
//   columnName: 'containerStatus',
//   sortable: true,
//   wipe:true,
// },
{
  columnDescription: '器具重量',
  columnName: 'containerWeight',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '器具公差',
  columnName: 'containerWeightDifference',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '入库计划',
  columnName: 'inOrderCode',
  sortable: true,
  wipe: true,
  width: 130
},
{
  columnDescription: '出库计划',
  columnName: 'outOrderCode',
  sortable: true,
  wipe: true,
  width: 130
},
{
  columnDescription: '更新时间',
  columnName: 'updateTime',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '零件数',
  columnName: 'itemNum',
  sortable: true,
  wipe: true,
  width: 90
},
{
  columnDescription: '需返修',
  columnName: 'isBad',
  sortable: true,
  wipe: true,
  width: 90
},
{
  columnDescription: '返修车间',
  columnName: 'badByFactory',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '生产班线',
  columnName: 'createLine',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '创建人',
  columnName: 'createUser',
  sortable: true,
  wipe: true
}
  // {
  //   columnDescription: '启用',
  //   columnName: 'enable',
  //   sortable: true,
  //   wipe:true,
  // },
];
const enterEdit = [{
  columnDescription: '生产计划单号',
  columnName: 'inOrderCode',
  width: 180,
  sortable: true,
  wipe: true
},
{
  columnDescription: '零件编号',
  columnName: 'itemName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '零件名称',
  columnName: 'itemDes',
  sortable: true,
  wipe: true
},
{
  columnDescription: '下线数量',
  columnName: 'maxNum',
  sortable: true,
  wipe: true,
  edit: false
},
{
  columnDescription: '单位重量',
  columnName: 'weight',
  sortable: true,
  wipe: true
}
  // {
  //   columnDescription: '图片',
  //   columnName: 'image',
  //   sortable: true,
  //   wipe:true,
  // },
  // {
  //   columnDescription: '生产日期',
  //   columnName: 'deviceName6',
  //   sortable: true,
  //   wipe:true,
  // },
];
const edterchoose = [
  // {
  //   columnDescription: '生产计划单号',
  //   columnName: 'inOrderCode',
  //   sortable: true,
  //   wipe:true,
  // },
  {
    columnDescription: '零件编号',
    columnName: 'itemName',
    sortable: true,
    wipe: true,
    width: 120
  },
  {
    columnDescription: '零件描述',
    columnName: 'itemDes',
    sortable: true,
    wipe: true,
    width: 180
  },
  {
    columnDescription: '单位',
    columnName: 'unit',
    sortable: true,
    wipe: true,
    width: 80
  },
  {
    columnDescription: '单价',
    columnName: 'price',
    sortable: true,
    wipe: true,
    width: 80
  },
  {
    columnDescription: '重量',
    columnName: 'weight',
    sortable: true,
    wipe: true,
    width: 80
  },
  {
    columnDescription: '单个公差',
    columnName: 'weightDifference',
    sortable: true,
    wipe: true,
    width: 100
  },
  {
    columnDescription: '照片',
    columnName: 'image',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '生产班线',
    columnName: 'createLine',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '装箱数量',
    columnName: 'maxNum',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '库容最大量',
    columnName: 'maxStorage',
    sortable: true,
    wipe: true,
    width: 120
  },
  {
    columnDescription: '库容最小量',
    columnName: 'minStorage',
    sortable: true,
    wipe: true,
    width: 120
  },
  {
    columnDescription: '超期时间',
    columnName: 'overDueTime',
    sortable: true,
    wipe: true,
    width: 100
  },
  {
    columnDescription: '是否锁定',
    columnName: 'isLock',
    sortable: true,
    wipe: true,
    width: 100
  },
  {
    columnDescription: '所需器具规格',
    columnName: 'useContainerType',
    sortable: true,
    wipe: true,
    width: 130
  }
];
const plant = [{
  columnDescription: '出库计划单号',
  columnName: 'outOrderCode',
  sortable: true,
  wipe: true,
  width: 200
},
{
  columnDescription: '零件编号',
  columnName: 'itemName',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '零件名称',
  columnName: 'itemDes',
  sortable: true,
  wipe: true,
  width: 200
},
{
  columnDescription: '出库类型',
  columnName: 'orderType',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '订单状态',
  columnName: 'orderStatus',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '合计数量',
  columnName: 'totalOutNum',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '出库口',
  columnName: 'tranLine',
  sortable: true,
  wipe: true,
  width: 90
},
{
  columnDescription: '目标班线',
  columnName: 'productionLineName',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '已出库数量',
  columnName: 'checkOutNum',
  sortable: true,
  wipe: true,
  width: 115
},
{
  columnDescription: '是否来自ERP',
  columnName: 'isErp',
  sortable: true,
  wipe: true,
  width: 130
},
{
  columnDescription: '创建时间',
  columnName: 'doTime',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '创建人',
  columnName: 'userName',
  sortable: true,
  wipe: true
}
];
const plantEdit = [
  // {
  //   columnDescription: '出库计划单号',
  //   columnName: 'outOrderCode',
  //   sortable: true,
  //   wipe:true,
  // },
  {
    columnDescription: '零件编号',
    columnName: 'itemName',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '零件名称',
    columnName: 'itemDes',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '计划数量',
    columnName: 'maxNum',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '计划日期',
    columnName: 'doTime',
    sortable: true,
    wipe: true
  }
];
const cassline = [{
  columnDescription: '班线编号',
  columnName: 'productionCode',
  sortable: true,
  wipe: true
},
{
  columnDescription: '班线名称',
  columnName: 'productionName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '能否作为目的地    ',
  columnName: 'isDestination',
  sortable: true,
  wipe: true
}
];
const inventory = [{
  columnDescription: '库位号',
  columnName: 'place',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '器具编号',
  columnName: 'containerName',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '器具规格',
  columnName: 'palletType',
  sortable: true,
  wipe: true,
  width: 220
},
{
  columnDescription: '零件号',
  columnName: 'itemName',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '零件名称',
  columnName: 'itemDes',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '零件数',
  columnName: 'itemNum',
  sortable: true,
  wipe: true,
  width: 90
},
{
  columnDescription: '入库类型',
  columnName: 'taskType',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: 'ä»·æ ¼',
  columnName: 'price',
  sortable: true,
  wipe: true,
  width: 80
},
{
  columnDescription: '单位',
  columnName: 'unit',
  sortable: true,
  wipe: true,
  width: 80
},
{
  columnDescription: '更新时间',
  columnName: 'updateTime',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '状态',
  columnName: 'status',
  sortable: true,
  wipe: true,
  width: 80
},
{
  columnDescription: '超期日期',
  columnName: 'dueTime',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '是否返修',
  columnName: 'isBad',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '返修类型',
  columnName: 'badByFactory',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '是否空盘',
  columnName: 'isEmptyContainer',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '库龄',
  columnName: 'stAge',
  sortable: true,
  wipe: true,
  width: 80
},
{
  columnDescription: '库龄状态',
  columnName: 'stStatus',
  sortable: true,
  wipe: true,
  width: 100
}
  // {
  //   columnDescription: '启用',
  //   columnName: 'enable',
  //   sortable: true,
  //   wipe:true,
  // },
];
const intype = [{
  columnDescription: '入库类型名',
  columnName: 'inType',
  sortable: true,
  wipe: true
},
{
  columnDescription: '入库目标仓库',
  columnName: 'storeName',
  sortable: true,
  wipe: true
}
];
const forklift = [{
  columnDescription: '叉车名',
  columnName: 'carName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '叉车号',
  columnName: 'carCode',
  sortable: true,
  wipe: true
},
{
  columnDescription: '驾驶员/维护员',
  columnName: 'userName',
  sortable: true,
  wipe: true
},
// {
//   columnDescription: '执行任务名',
//   columnName: 'carTaskName',
//   sortable: true,
//   wipe:true,
// },
// {
//   columnDescription: '状态',
//   columnName: 'status',
//   sortable: true,
//   wipe:true,
// },
{
  columnDescription: '是否工作',
  columnName: 'isWork',
  sortable: true,
  wipe: true
}
];
const forklifttasks = [{
  columnDescription: '任务编号',
  columnName: 'carTaskName',
  sortable: true,
  wipe: true,
  width: 180
},
{
  columnDescription: '目的地',
  columnName: 'toDestination',
  sortable: true,
  wipe: true
},
{
  columnDescription: '取货地',
  columnName: 'fromDestination',
  sortable: true,
  wipe: true
},
{
  columnDescription: '器具编号',
  columnName: 'containerName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '订单状态',
  columnName: 'taskStatus',
  sortable: true,
  wipe: true
},
{
  columnDescription: '领用人',
  columnName: 'userName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '创建时间',
  columnName: 'createTime',
  sortable: true,
  wipe: true
},
{
  columnDescription: '更新时间',
  columnName: 'updateTime',
  sortable: true,
  wipe: true
}
];
const taskrecord = [{
  columnDescription: '任务ID',
  columnName: 'taskId',
  sortable: true,
  wipe: true,
  width: 90
},
{
  columnDescription: '零件编号',
  columnName: 'itemName',
  sortable: true,
  wipe: true,
  width: 115
},
{
  columnDescription: '零件名称',
  columnName: 'itemDes',
  sortable: true,
  wipe: true,
  width: 135
},
{
  columnDescription: '起始位',
  columnName: 'sourcePlace',
  sortable: true,
  wipe: true,
  width: 90
},
{
  columnDescription: '目标位',
  columnName: 'toPlace',
  sortable: true,
  wipe: true,
  width: 90
},
{
  columnDescription: '任务类型',
  columnName: 'taskType',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '任务状态',
  columnName: 'taskStatus',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '任务创建时间',
  columnName: 'taskCreateTime',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '器具编号',
  columnName: 'containerName',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '是否主要零件',
  columnName: 'isMainOut',
  sortable: true,
  wipe: true,
  width: 130
},
{
  columnDescription: '零件数量',
  columnName: 'itemCount',
  sortable: true,
  wipe: true,
  width: 100
},
// {
//   columnDescription: '启用',
//   columnName: 'enable',
//   sortable: true,
//   wipe:true,
// },
{
  columnDescription: '计划单号',
  columnName: 'outOrderCode',
  sortable: true,
  wipe: true,
  width: 140
},
{
  columnDescription: '创建人',
  columnName: 'createUser',
  sortable: true,
  wipe: true,
  width: 90
},
{
  columnDescription: '开始时间',
  columnName: 'doTime',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '结束时间',
  columnName: 'finishTime',
  sortable: true,
  wipe: true,
  width: 150
}
];
const warning = [{
  columnDescription: '故障名称',
  columnName: 'alertName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '故障描述',
  columnName: 'alertDes',
  sortable: true,
  wipe: true
},
{
  columnDescription: '故障设备',
  columnName: 'deviceName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '故障编号',
  columnName: 'alertCode',
  sortable: true,
  wipe: true
},
{
  columnDescription: '创建时间',
  columnName: 'createTime',
  sortable: true,
  wipe: true
},
{
  columnDescription: '结束时间',
  columnName: 'finishTime',
  sortable: true,
  wipe: true
}
];
const maintask = [{
  columnDescription: '任务号',
  columnName: 'id',
  sortable: true,
  wipe: true,
  width: 90
},
{
  columnDescription: '器具编号',
  columnName: 'containerName',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '器具规格',
  columnName: 'palletType',
  sortable: true,
  wipe: true,
  width: 180
},
{
  columnDescription: '起始位',
  columnName: 'sourcePlace',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '目标位',
  columnName: 'toPlace',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '任务类型',
  columnName: 'taskType',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '任务状态',
  columnName: 'taskStatus',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '出库单号',
  columnName: 'outOrderCode',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '创建人名称',
  columnName: 'userName',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '任务优先级',
  columnName: 'taskLevel',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '是否故障',
  columnName: 'isError',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '是否中转',
  columnName: 'isExchange',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '所在位置',
  columnName: 'localDevice',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '称重数据',
  columnName: 'lastWeight',
  sortable: true,
  wipe: true,
  width: 100
},
{
  // columnDescription: '故障设备id',
  // columnName: 'errorDeviceId',
  // sortable: true,
  // wipe:true,
},
{
  columnDescription: '无法下发原因',
  columnName: 'canNotDo',
  sortable: true,
  wipe: true,
  width: 200
},
{
  columnDescription: '创建时间',
  columnName: 'createTime',
  sortable: true,
  wipe: true,
  width: 160
},
{
  columnDescription: '开始时间',
  columnName: 'doTime',
  sortable: true,
  wipe: true,
  width: 160
},
{
  columnDescription: '结束时间',
  columnName: 'finishTime',
  sortable: true,
  wipe: true,
  width: 160
},
{
  columnDescription: '剩余时间',
  columnName: 'needTime',
  sortable: true,
  wipe: true,
  width: 100
}
];
const viewdata = [{
  columnDescription: '库位号',
  columnName: 'place',
  sortable: true,
  wipe: true
},
{
  columnDescription: '零件编号',
  columnName: 'itemName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '零件名称',
  columnName: 'itemDes',
  sortable: true,
  wipe: true
},
{
  columnDescription: '器具编号',
  columnName: 'containerName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '零件数',
  columnName: 'itemNum',
  sortable: true,
  wipe: true
},
{
  columnDescription: '是否返修',
  columnName: 'isBad',
  sortable: true,
  wipe: true
},
{
  columnDescription: '返修类型',
  columnName: 'badByFactory',
  sortable: true,
  wipe: true
},
{
  columnDescription: 'ä»·æ ¼',
  columnName: 'price',
  sortable: true,
  wipe: true
},
{
  columnDescription: '单位',
  columnName: 'unit',
  sortable: true,
  wipe: true
},
{
  columnDescription: '更新时间',
  columnName: 'updateTime',
  sortable: true,
  wipe: true
},
{
  columnDescription: '状态',
  columnName: 'status',
  sortable: true,
  wipe: true
},
{
  columnDescription: '是否有器具',
  columnName: 'isFull',
  sortable: true,
  wipe: true
},
{
  columnDescription: '编号',
  columnName: 'pvcCode',
  sortable: true,
  wipe: true
},
{
  columnDescription: '零件名称',
  columnName: 'itemDes',
  sortable: true,
  wipe: true
},
{
  columnDescription: '产线',
  columnName: 'createLine',
  sortable: true,
  wipe: true
},
{
  columnDescription: '入库类型',
  columnName: 'inType',
  sortable: true,
  wipe: true
},
{
  columnDescription: '器具规格',
  columnName: 'palletType',
  sortable: true,
  wipe: true
}
];
const materials = [{
  columnDescription: '零件编号',
  columnName: 'itemName',
  sortable: true,
  wipe: true,
  width: 140
},
{
  columnDescription: '零件名称',
  columnName: 'itemDes',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '库存数量',
  columnName: 'itemNum',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '最小库容',
  columnName: 'minStorage',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '最大库容',
  columnName: 'maxStorage',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '占用库位数',
  columnName: 'placeCount',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '产线',
  columnName: 'createLine',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '单价',
  columnName: 'price',
  sortable: true,
  wipe: true,
  width: 80
},
{
  columnDescription: '单位',
  columnName: 'unit',
  sortable: true,
  wipe: true,
  width: 80
},
{
  columnDescription: '重量',
  columnName: 'weight',
  sortable: true,
  wipe: true,
  width: 80
},
{
  columnDescription: '装箱数量',
  columnName: 'maxNum',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '所用器具规格',
  columnName: 'useContainerType',
  sortable: true,
  wipe: true,
  width: 130
},
{
  columnDescription: '公差',
  columnName: 'weightDifference',
  sortable: true,
  wipe: true,
  width: 80
},
{
  columnDescription: '库名',
  columnName: 'storageName',
  sortable: true,
  wipe: true,
  width: 80
},
{
  columnDescription: '总价',
  columnName: 'totalCost',
  sortable: true,
  wipe: true,
  width: 80
},
{
  columnDescription: '是否超库存',
  columnName: 'isOverDay',
  sortable: true,
  wipe: true,
  width: 120
}
];
const rgvtask = [{
  columnDescription: '主任务',
  columnName: 'mainTask',
  sortable: true,
  wipe: true
},
{
  columnDescription: '目标位置',
  columnName: 'toPlace',
  sortable: true,
  wipe: true
},
{
  columnDescription: '起始位置',
  columnName: 'sourcePlace',
  sortable: true,
  wipe: true
},
{
  columnDescription: '任务类型',
  columnName: 'taskType',
  sortable: true,
  wipe: true
},
{
  columnDescription: 'RGV编号',
  columnName: 'useRgvId',
  sortable: true,
  wipe: true
},
{
  columnDescription: '是否完成',
  columnName: 'hasFinished',
  sortable: true,
  wipe: true
},
{
  columnDescription: '设备名称',
  columnName: 'devName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '分任务号',
  columnName: 'preTask',
  sortable: true,
  wipe: true
},
{
  columnDescription: '是否已开始执行',
  columnName: 'isReleased',
  sortable: true,
  wipe: true
},
{
  columnDescription: '起始时间',
  columnName: 'doTime',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '完成时间',
  columnName: 'finishTime',
  sortable: true,
  wipe: true,
  width: 150
}
];
const piler = [{
  columnDescription: '主任务',
  columnName: 'mainTask',
  sortable: true,
  wipe: true
},
{
  columnDescription: '目标位置',
  columnName: 'toPlace',
  sortable: true,
  wipe: true
},
{
  columnDescription: '起始位置',
  columnName: 'sourcePlace',
  sortable: true,
  wipe: true
},
{
  columnDescription: '是否完成',
  columnName: 'hasFinished',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '设备名称',
  columnName: 'devName',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '是否开始执行',
  columnName: 'isReleased',
  sortable: true,
  wipe: true,
  width: 130
},
{
  columnDescription: '任务类型',
  columnName: 'taskType',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '器具规格类型',
  columnName: 'palletType',
  sortable: true,
  wipe: true,
  width: 130
},
{
  columnDescription: '堆垛机号',
  columnName: 'useSrmId',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '起始时间',
  columnName: 'doTime',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '截止时间',
  columnName: 'finishTime',
  sortable: true,
  wipe: true,
  width: 150
}
];
const avroRecord = [{
  columnDescription: '起始库位',
  columnName: 'sourcePlace',
  sortable: true,
  wipe: true
},
{
  columnDescription: '目标库位',
  columnName: 'toPlace',
  sortable: true,
  wipe: true
},
{
  columnDescription: '巷道号',
  columnName: 'useSrmId',
  sortable: true,
  wipe: true
},
{
  columnDescription: '主任务号',
  columnName: 'fastherTaskId',
  sortable: true,
  wipe: true
},
{
  columnDescription: '器具号',
  columnName: 'containerName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '零件号',
  columnName: 'itemName',
  sortable: true,
  wipe: true
},
{
  columnDescription: '零件名称',
  columnName: 'itemDes',
  sortable: true,
  wipe: true
},
{
  columnDescription: '零件数量',
  columnName: 'itemCount',
  sortable: true,
  wipe: true
},
{
  columnDescription: '已完成',
  columnName: 'hasFinished',
  sortable: true,
  wipe: true
},
{
  columnDescription: '创建时间',
  columnName: 'createTime',
  sortable: true,
  wipe: true
}
];
const statistics = [{
  columnDescription: '合计',
  columnName: 'allNum',
  sortable: true,
  wipe: true
},
{
  columnDescription: '时间',
  columnName: 'time',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '出库任务统计',
  sortable: true,
  wipe: true,
  children: [{
    columnDescription: '出库总数',
    columnName: 'outNum',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '1号口',
    columnName: 'out_one_mark',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '2号口',
    columnName: 'out_two_mark',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '3号口',
    columnName: 'out_three_mark',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '4号口',
    columnName: 'out_four_mark',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '5号口',
    columnName: 'out_five_mark',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '6号口',
    columnName: 'out_six_mark',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '7号口',
    columnName: 'out_seven_mark',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '8号口',
    columnName: 'out_eight_mark',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '出库经过中转台',
    columnName: 'outExchange',
    sortable: true,
    wipe: true,
    width: 150
  }
  ]
},
{
  columnDescription: '入库任务统计',
  sortable: true,
  wipe: true,
  children: [{
    columnDescription: '入库总数',
    columnName: 'inNum',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '1号口',
    columnName: 'in_one_mark',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '2号口',
    columnName: 'in_two_mark',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '3号口',
    columnName: 'in_three_mark',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '4号口',
    columnName: 'in_four_mark',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '5号口',
    columnName: 'in_five_mark',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '7号口',
    columnName: 'in_seven_mark',
    sortable: true,
    wipe: true
  },
  {
    columnDescription: '入库经过中转台',
    columnName: 'inExchange',
    sortable: true,
    wipe: true,
    width: 150
  }
  ]
}
];
const Didproject = [{
  columnDescription: '时间',
  columnName: 'time'
},
{
  columnDescription: '入库零件数',
  columnName: 'in_part'
},
{
  columnDescription: '出库零件数',
  columnName: 'out_part'
},
{
  columnDescription: '入库器具数',
  columnName: 'in_appliance'
},
{
  columnDescription: '出库器具数',
  columnName: 'out_appliance'
},
{
  columnDescription: '超期零件数量',
  columnName: 'exceed_part'
},
{
  columnDescription: '库位总数',
  columnName: 'stortage_num'
},
{
  columnDescription: '有货库位',
  columnName: 'available_stortage'
},
{
  columnDescription: '带件器具',
  columnName: 'take_appliance'
},
{
  columnDescription: '空器具数',
  columnName: 'empty_appliance'
},
{
  columnDescription: '制件总数',
  columnName: 'workpiece_num'
}
];
module.exports = {
  quotaion_relevanceEdit,
  manage,
  dept,
  role,
  storage,
  position,
  palte,
  stacker,
  quotation,
  quotationedit,
  enter,
  enterEdit,
  edterchoose,
  plant,
  plantEdit,
  cassline,
  inventory,
  intype,
  forklift,
  forklifttasks,
  taskrecord,
  warning,
  maintask,
  viewdata,
  materials,
  rgvtask,
  piler,
  avroRecord,
  statistics,
  Didproject
};
qqjf-Web/src/components/title/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
<template>
  <div id="gloal-title">{{ title }}</div>
</template>
<script>
export default {
  props: {
    title: {
      type: String,
      default: "",
    },
  },
};
</script>
<style lang="scss" scoped>
#gloal-title {
  // position: absolute;
  // left: 10px;
  // top: 0;
  margin-left: 10px;
  padding-left: 10px;
  font-size: 20px;
  border-left: 4px solid #409eff;
}
</style>
qqjf-Web/src/icons/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg component
// register globally
Vue.component('svg-icon', SvgIcon)
const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
qqjf-Web/src/icons/svg/404.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M121.718 73.272v9.953c3.957-7.584 6.199-16.05 6.199-24.995C127.917 26.079 99.273 0 63.958 0 28.644 0 0 26.079 0 58.23c0 .403.028.806.028 1.21l22.97-25.953h13.34l-19.76 27.187h6.42V53.77l13.728-19.477v49.361H22.998V73.272H2.158c5.951 20.284 23.608 36.208 45.998 41.399-1.44 3.3-5.618 11.263-12.565 12.674-8.607 1.764 23.358.428 46.163-13.178 17.519-4.611 31.938-15.849 39.77-30.513h-13.506V73.272H85.02V59.464l22.998-25.977h13.008l-19.429 27.187h6.421v-7.433l13.727-19.402v39.433h-.027zm-78.24 2.822a10.516 10.516 0 0 1-.996-4.535V44.548c0-1.613.332-3.124.996-4.535a11.66 11.66 0 0 1 2.713-3.68c1.134-1.032 2.49-1.864 4.04-2.468 1.55-.605 3.21-.908 4.982-.908h11.292c1.77 0 3.431.303 4.981.908 1.522.604 2.85 1.41 3.986 2.418l-12.26 16.303v-2.898a1.96 1.96 0 0 0-.665-1.512c-.443-.403-.996-.604-1.66-.604-.665 0-1.218.201-1.661.604a1.96 1.96 0 0 0-.664 1.512v9.071L44.364 77.606a10.556 10.556 0 0 1-.886-1.512zm35.73-4.535c0 1.613-.332 3.124-.997 4.535a11.66 11.66 0 0 1-2.712 3.68c-1.134 1.032-2.49 1.864-4.04 2.469-1.55.604-3.21.907-4.982.907H55.185c-1.77 0-3.431-.303-4.981-.907-1.55-.605-2.906-1.437-4.041-2.47a12.49 12.49 0 0 1-1.384-1.512l13.727-18.217v6.375c0 .605.222 1.109.665 1.512.442.403.996.604 1.66.604.664 0 1.218-.201 1.66-.604a1.96 1.96 0 0 0 .665-1.512V53.87L75.97 36.838c.913.932 1.66 1.99 2.214 3.175.664 1.41.996 2.922.996 4.535v27.011h.028z"/></svg>
qqjf-Web/src/icons/svg/align-right.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg t="1595485877113" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="28328" width="32" height="32"><path d="M278.935873 315.505767L66.741054 503.436974l212.194819 187.931206zM78.371952 122.398678h878.886994v111.315248H78.371952zM356.659049 345.028151h600.599897v111.314225H356.659049zM356.659049 567.657624h600.599897v111.315248H356.659049zM78.371952 790.287097h878.886994v111.314225H78.371952z" fill="#345" p-id="28329"></path></svg>
qqjf-Web/src/icons/svg/bug.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M127.88 73.143c0 1.412-.506 2.635-1.518 3.669-1.011 1.033-2.209 1.55-3.592 1.55h-17.887c0 9.296-1.783 17.178-5.35 23.645l16.609 17.044c1.011 1.034 1.517 2.257 1.517 3.67 0 1.412-.506 2.635-1.517 3.668-.958 1.033-2.155 1.55-3.593 1.55-1.438 0-2.635-.517-3.593-1.55l-15.811-16.063a15.49 15.49 0 0 1-1.196 1.06c-.532.434-1.65 1.208-3.353 2.322a50.104 50.104 0 0 1-5.192 2.974c-1.758.87-3.94 1.658-6.546 2.364-2.607.706-5.189 1.06-7.748 1.06V47.044H58.89v73.062c-2.716 0-5.417-.367-8.106-1.102-2.688-.734-5.003-1.631-6.945-2.692a66.769 66.769 0 0 1-5.268-3.179c-1.571-1.057-2.73-1.94-3.476-2.65L33.9 109.34l-14.611 16.877c-1.066 1.14-2.344 1.711-3.833 1.711-1.277 0-2.422-.434-3.434-1.304-1.012-.978-1.557-2.187-1.635-3.627-.079-1.44.333-2.705 1.236-3.794l16.129-18.51c-3.087-6.197-4.63-13.644-4.63-22.342H5.235c-1.383 0-2.58-.517-3.592-1.55S.125 74.545.125 73.132c0-1.412.506-2.635 1.518-3.668 1.012-1.034 2.21-1.55 3.592-1.55h17.887V43.939L9.308 29.833c-1.012-1.033-1.517-2.256-1.517-3.669 0-1.412.505-2.635 1.517-3.668 1.012-1.034 2.21-1.55 3.593-1.55s2.58.516 3.593 1.55l13.813 14.106h67.396l13.814-14.106c1.012-1.034 2.21-1.55 3.592-1.55 1.384 0 2.581.516 3.593 1.55 1.012 1.033 1.518 2.256 1.518 3.668 0 1.413-.506 2.636-1.518 3.67l-13.814 14.105v23.975h17.887c1.383 0 2.58.516 3.593 1.55 1.011 1.033 1.517 2.256 1.517 3.668l-.005.01zM89.552 26.175H38.448c0-7.23 2.489-13.386 7.466-18.469C50.892 2.623 56.92.082 64 .082c7.08 0 13.108 2.541 18.086 7.624 4.977 5.083 7.466 11.24 7.466 18.469z"/></svg>
qqjf-Web/src/icons/svg/chart.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h36.571V128H0V54.857zM91.429 27.43H128V128H91.429V27.429zM45.714 0h36.572v128H45.714V0z"/></svg>
qqjf-Web/src/icons/svg/clipboard.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.857 118.857h64V73.143H89.143c-1.902 0-3.52-.668-4.855-2.002-1.335-1.335-2.002-2.954-2.002-4.855V36.57H54.857v82.286zM73.143 16v-4.571a2.2 2.2 0 0 0-.677-1.61 2.198 2.198 0 0 0-1.609-.676H20.571c-.621 0-1.158.225-1.609.676a2.198 2.198 0 0 0-.676 1.61V16a2.2 2.2 0 0 0 .676 1.61c.451.45.988.676 1.61.676h50.285c.622 0 1.158-.226 1.61-.677.45-.45.676-.987.676-1.609zm18.286 48h21.357L91.43 42.642V64zM128 73.143v48c0 1.902-.667 3.52-2.002 4.855-1.335 1.335-2.953 2.002-4.855 2.002H52.57c-1.901 0-3.52-.667-4.854-2.002-1.335-1.335-2.003-2.953-2.003-4.855v-11.429H6.857c-1.902 0-3.52-.667-4.855-2.002C.667 106.377 0 104.759 0 102.857v-96c0-1.902.667-3.52 2.002-4.855C3.337.667 4.955 0 6.857 0h77.714c1.902 0 3.52.667 4.855 2.002 1.335 1.335 2.003 2.953 2.003 4.855V30.29c1 .622 1.856 1.29 2.569 2.003l29.147 29.147c1.335 1.335 2.478 3.145 3.429 5.43.95 2.287 1.426 4.383 1.426 6.291v-.018z"/></svg>
qqjf-Web/src/icons/svg/component.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h54.857v54.857H0V0zm0 73.143h54.857V128H0V73.143zm73.143 0H128V128H73.143V73.143zm27.428-18.286C115.72 54.857 128 42.577 128 27.43 128 12.28 115.72 0 100.571 0 85.423 0 73.143 12.28 73.143 27.429c0 15.148 12.28 27.428 27.428 27.428z"/></svg>
qqjf-Web/src/icons/svg/dashboard.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M27.429 63.638c0-2.508-.893-4.65-2.679-6.424-1.786-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.465 2.662-1.785 1.774-2.678 3.916-2.678 6.424 0 2.508.893 4.65 2.678 6.424 1.786 1.775 3.94 2.662 6.465 2.662 2.524 0 4.678-.887 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm13.714-31.801c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM71.714 65.98l7.215-27.116c.285-1.23.107-2.378-.536-3.443-.643-1.064-1.56-1.762-2.75-2.094-1.19-.33-2.333-.177-3.429.462-1.095.639-1.81 1.573-2.143 2.804l-7.214 27.116c-2.857.237-5.405 1.266-7.643 3.088-2.238 1.822-3.738 4.152-4.5 6.992-.952 3.644-.476 7.098 1.429 10.364 1.905 3.265 4.69 5.37 8.357 6.317 3.667.947 7.143.474 10.429-1.42 3.285-1.892 5.404-4.66 6.357-8.305.762-2.84.619-5.607-.429-8.305-1.047-2.697-2.762-4.85-5.143-6.46zm47.143-2.342c0-2.508-.893-4.65-2.678-6.424-1.786-1.775-3.94-2.662-6.465-2.662-2.524 0-4.678.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.786 1.775 3.94 2.662 6.464 2.662 2.524 0 4.679-.887 6.465-2.662 1.785-1.775 2.678-3.916 2.678-6.424zm-45.714-45.43c0-2.509-.893-4.65-2.679-6.425C68.68 10.01 66.524 9.122 64 9.122c-2.524 0-4.679.887-6.464 2.661-1.786 1.775-2.679 3.916-2.679 6.425 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm32 13.629c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM128 63.638c0 12.351-3.357 23.78-10.071 34.286-.905 1.372-2.19 2.058-3.858 2.058H13.93c-1.667 0-2.953-.686-3.858-2.058C3.357 87.465 0 76.037 0 63.638c0-8.613 1.69-16.847 5.071-24.703C8.452 31.08 13 24.312 18.714 18.634c5.715-5.68 12.524-10.199 20.429-13.559C47.048 1.715 55.333.035 64 .035c8.667 0 16.952 1.68 24.857 5.04 7.905 3.36 14.714 7.88 20.429 13.559 5.714 5.678 10.262 12.446 13.643 20.301 3.38 7.856 5.071 16.09 5.071 24.703z"/></svg>
qqjf-Web/src/icons/svg/documentation.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M71.984 44.815H115.9L71.984 9.642v35.173zM16.094.05h63.875l47.906 38.37v76.74c0 3.392-1.682 6.645-4.677 9.044-2.995 2.399-7.056 3.746-11.292 3.746H16.094c-4.236 0-8.297-1.347-11.292-3.746-2.995-2.399-4.677-5.652-4.677-9.044V12.84C.125 5.742 7.23.05 16.094.05zm71.86 102.32V89.58h-71.86v12.79h71.86zm23.952-25.58V64H16.094v12.79h95.812z"/></svg>
qqjf-Web/src/icons/svg/drag.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M73.137 29.08h-9.209 29.7L63.886.093 34.373 29.08h20.49v27.035H27.238v17.948h27.625v27.133h18.274V74.063h27.41V56.115h-27.41V29.08zm-9.245 98.827l27.518-26.711H36.59l27.302 26.71zM.042 64.982l27.196 27.029V38.167L.042 64.982zm100.505-26.815V92.01l27.41-27.029-27.41-26.815z"/></svg>
qqjf-Web/src/icons/svg/edit.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M106.133 67.2a4.797 4.797 0 0 0-4.8 4.8c0 .187.014.36.027.533h-.027V118.4H9.6V26.667h50.133c2.654 0 4.8-2.147 4.8-4.8 0-2.654-2.146-4.8-4.8-4.8H9.6a9.594 9.594 0 0 0-9.6 9.6V118.4c0 5.307 4.293 9.6 9.6 9.6h91.733c5.307 0 9.6-4.293 9.6-9.6V72.533h-.026c.013-.173.026-.346.026-.533 0-2.653-2.146-4.8-4.8-4.8z"/><path d="M125.16 13.373L114.587 2.8c-3.747-3.747-9.854-3.72-13.6.027l-52.96 52.96a4.264 4.264 0 0 0-.907 1.36L33.813 88.533c-.746 1.76-.226 3.534.907 4.68 1.133 1.147 2.92 1.667 4.693.92l31.4-13.293c.507-.213.96-.52 1.36-.907l52.96-52.96c3.747-3.746 3.774-9.853.027-13.6zM66.107 72.4l-18.32 7.76 7.76-18.32L92.72 24.667l10.56 10.56L66.107 72.4zm52.226-52.227l-8.266 8.267-10.56-10.56 8.266-8.267.027-.026 10.56 10.56-.027.026z"/></svg>
qqjf-Web/src/icons/svg/education.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M88.883 119.565c-7.284 0-19.434 2.495-21.333 8.25v.127c-4.232.13-5.222 0-7.108 0-1.895-5.76-14.045-8.256-21.333-8.256H0V0h42.523c9.179 0 17.109 5.47 21.47 13.551C68.352 5.475 76.295 0 85.478 0H128v119.57l-39.113-.005h-.004zM60.442 24.763c0-9.651-8.978-16.507-17.777-16.507H7.108V111.43H39.11c7.054-.14 18.177.082 21.333 6.12v-4.628c-.134-5.722-.004-13.522 0-13.832V27.413l.004-2.655-.004.005zm60.442-16.517h-35.55c-8.802 0-17.78 6.856-17.78 16.493v74.259c.004.32.138 8.115 0 13.813v4.627c3.155-6.022 14.279-6.26 21.333-6.114h32V8.25l-.003-.005z"/></svg>
qqjf-Web/src/icons/svg/email.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="96" xmlns="http://www.w3.org/2000/svg"><path d="M64.125 56.975L120.188.912A12.476 12.476 0 0 0 115.5 0h-103c-1.588 0-3.113.3-4.513.838l56.138 56.137z"/><path d="M64.125 68.287l-62.3-62.3A12.42 12.42 0 0 0 0 12.5v71C0 90.4 5.6 96 12.5 96h103c6.9 0 12.5-5.6 12.5-12.5v-71a12.47 12.47 0 0 0-1.737-6.35L64.125 68.287z"/></svg>
qqjf-Web/src/icons/svg/example.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M96.258 57.462h31.421C124.794 27.323 100.426 2.956 70.287.07v31.422a32.856 32.856 0 0 1 25.971 25.97zm-38.796-25.97V.07C27.323 2.956 2.956 27.323.07 57.462h31.422a32.856 32.856 0 0 1 25.97-25.97zm12.825 64.766v31.421c30.46-2.885 54.507-27.253 57.713-57.712H96.579c-2.886 13.466-13.146 23.726-26.292 26.291zM31.492 70.287H.07c2.886 30.46 27.253 54.507 57.713 57.713V96.579c-13.466-2.886-23.726-13.146-26.291-26.292z"/></svg>
qqjf-Web/src/icons/svg/excel.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.208 16.576v8.384h38.72v5.376h-38.72v8.704h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.512h38.72v5.376h-38.72v11.136H128v-94.72H78.208zM0 114.368L72.128 128V0L0 13.632v100.736z"/><path d="M28.672 82.56h-11.2l14.784-23.488-14.08-22.592h11.52l8.192 14.976 8.448-14.976h11.136l-14.08 22.208L58.368 82.56H46.656l-8.768-15.68z"/></svg>
qqjf-Web/src/icons/svg/exit-fullscreen.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M49.217 41.329l-.136-35.24c-.06-2.715-2.302-4.345-5.022-4.405h-3.65c-2.712-.06-4.866 2.303-4.806 5.016l.152 19.164-24.151-23.79a6.698 6.698 0 0 0-9.499 0 6.76 6.76 0 0 0 0 9.526l23.93 23.713-18.345.074c-2.712-.069-5.228 1.813-5.64 5.02v3.462c.069 2.721 2.31 4.97 5.022 5.03l35.028-.207c.052.005.087.025.133.025l2.457.054a4.626 4.626 0 0 0 3.436-1.38c.88-.874 1.205-2.096 1.169-3.462l-.262-2.465c0-.048.182-.081.182-.136h.002zm52.523 51.212l18.32-.073c2.713.06 5.224-1.609 5.64-4.815v-3.462c-.068-2.722-2.317-4.97-5.021-5.04l-34.58.21c-.053 0-.086-.021-.138-.021l-2.451-.06a4.64 4.64 0 0 0-3.445 1.381c-.885.868-1.201 2.094-1.174 3.46l.27 2.46c.005.06-.177.095-.177.141l.141 34.697c.069 2.713 2.31 4.338 5.022 4.397l3.45.006c2.705.062 4.867-2.31 4.8-5.026l-.153-18.752 24.151 23.946a6.69 6.69 0 0 0 9.494 0 6.747 6.747 0 0 0 0-9.523L101.74 92.54v.001zM48.125 80.662a4.636 4.636 0 0 0-3.437-1.382l-2.457.06c-.05 0-.082.022-.137.022l-35.025-.21c-2.712.07-4.957 2.318-5.022 5.04v3.462c.409 3.206 2.925 4.874 5.633 4.814l18.554.06-24.132 23.928c-2.62 2.626-2.62 6.89 0 9.524a6.694 6.694 0 0 0 9.496 0l24.155-23.79-.155 18.866c-.06 2.722 2.094 5.093 4.801 5.025h3.65c2.72-.069 4.962-1.685 5.022-4.406l.141-34.956c0-.05-.182-.082-.182-.136l.262-2.46c.03-1.366-.286-2.592-1.166-3.46h-.001zM80.08 47.397a4.62 4.62 0 0 0 3.443 1.374l2.45-.054c.055 0 .088-.02.143-.028l35.08.21c2.712-.062 4.953-2.312 5.021-5.033l.009-3.463c-.417-3.211-2.937-5.084-5.64-5.025l-18.615-.073 23.917-23.715c2.63-2.623 2.63-6.879.008-9.513a6.691 6.691 0 0 0-9.494 0L92.251 26.016l.155-19.312c.065-2.713-2.097-5.085-4.802-5.025h-3.45c-2.713.069-4.954 1.693-5.022 4.406l-.139 35.247c0 .054.18.088.18.136l-.267 2.465c-.028 1.366.288 2.588 1.174 3.463v.001z"/></svg>
qqjf-Web/src/icons/svg/eye-open.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><style/></defs><path d="M512 128q69.675 0 135.51 21.163t115.498 54.997 93.483 74.837 73.685 82.006 51.67 74.837 32.17 54.827L1024 512q-2.347 4.992-6.315 13.483T998.87 560.17t-31.658 51.669-44.331 59.99-56.832 64.34-69.504 60.16-82.347 51.5-94.848 34.687T512 896q-69.675 0-135.51-21.163t-115.498-54.826-93.483-74.326-73.685-81.493-51.67-74.496-32.17-54.997L0 513.707q2.347-4.992 6.315-13.483t18.816-34.816 31.658-51.84 44.331-60.33 56.832-64.683 69.504-60.331 82.347-51.84 94.848-34.816T512 128.085zm0 85.333q-46.677 0-91.648 12.331t-81.152 31.83-70.656 47.146-59.648 54.485-48.853 57.686-37.675 52.821-26.325 43.99q12.33 21.674 26.325 43.52t37.675 52.351 48.853 57.003 59.648 53.845T339.2 767.02t81.152 31.488T512 810.667t91.648-12.331 81.152-31.659 70.656-46.848 59.648-54.186 48.853-57.344 37.675-52.651T927.957 512q-12.33-21.675-26.325-43.648t-37.675-52.65-48.853-57.345-59.648-54.186-70.656-46.848-81.152-31.659T512 213.334zm0 128q70.656 0 120.661 50.006T682.667 512 632.66 632.661 512 682.667 391.339 632.66 341.333 512t50.006-120.661T512 341.333zm0 85.334q-35.328 0-60.33 25.002T426.666 512t25.002 60.33T512 597.334t60.33-25.002T597.334 512t-25.002-60.33T512 426.666z"/></svg>
qqjf-Web/src/icons/svg/eye.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M127.072 7.994c1.37-2.208.914-5.152-.914-6.87-2.056-1.717-4.797-1.226-6.396.982-.229.245-25.586 32.382-55.74 32.382-29.24 0-55.74-32.382-55.968-32.627-1.6-1.963-4.57-2.208-6.397-.49C-.17 3.086-.399 6.275 1.2 8.238c.457.736 5.94 7.36 14.62 14.72L4.17 35.96c-1.828 1.963-1.6 5.152.228 6.87.457.98 1.6 1.471 2.742 1.471s2.284-.49 3.198-1.472l12.564-13.983c5.94 4.416 13.021 8.587 20.788 11.53l-4.797 17.418c-.685 2.699.686 5.397 3.198 6.133h1.37c2.057 0 3.884-1.472 4.341-3.68L52.6 42.83c3.655.736 7.538 1.227 11.422 1.227 3.883 0 7.767-.49 11.422-1.227l4.797 17.173c.457 2.208 2.513 3.68 4.34 3.68.457 0 .914 0 1.143-.246 2.513-.736 3.883-3.434 3.198-6.133l-4.797-17.172c7.767-2.944 14.848-7.114 20.788-11.53l12.336 13.738c.913.981 2.056 1.472 3.198 1.472s2.284-.49 3.198-1.472c1.828-1.963 1.828-4.906.228-6.87l-11.65-13.001c9.366-7.36 14.849-14.474 14.849-14.474z"/></svg>
qqjf-Web/src/icons/svg/form.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.068 23.784c-1.02 0-1.877-.32-2.572-.96a8.588 8.588 0 0 1-1.738-2.237 11.524 11.524 0 0 1-1.042-2.621c-.232-.895-.348-1.641-.348-2.238V0h.278c.834 0 1.622.085 2.363.256.742.17 1.645.575 2.711 1.214 1.066.64 2.363 1.535 3.892 2.686 1.53 1.15 3.453 2.664 5.77 4.54 2.502 2.045 4.494 3.771 5.977 5.178 1.483 1.406 2.618 2.6 3.406 3.58.787.98 1.274 1.812 1.46 2.494.185.682.277 1.278.277 1.79v2.046H84.068zM127.3 84.01c.278.682.464 1.535.556 2.558.093 1.023-.37 2.003-1.39 2.94-.463.427-.88.832-1.25 1.215-.372.384-.696.704-.974.96a6.69 6.69 0 0 1-.973.767l-11.816-10.741a44.331 44.331 0 0 0 1.877-1.535 31.028 31.028 0 0 1 1.737-1.406c1.112-.938 2.317-1.343 3.615-1.215 1.297.128 2.363.405 3.197.83.927.427 1.923 1.173 2.989 2.239 1.065 1.065 1.876 2.195 2.432 3.388zM78.23 95.902c2.038 0 3.752-.511 5.143-1.534l-26.969 25.83H18.037c-1.761 0-3.684-.47-5.77-1.407a24.549 24.549 0 0 1-5.838-3.709 21.373 21.373 0 0 1-4.518-5.306c-1.204-2.003-1.807-4.07-1.807-6.202V16.495c0-1.79.44-3.665 1.32-5.626A18.41 18.41 0 0 1 5.04 5.562a21.798 21.798 0 0 1 5.213-3.964C12.198.533 14.237 0 16.37 0h53.24v15.984c0 1.62.278 3.367.834 5.242a16.704 16.704 0 0 0 2.572 5.179c1.159 1.577 2.665 2.898 4.518 3.964 1.853 1.066 4.078 1.598 6.673 1.598h20.295v42.325L85.458 92.45c1.02-1.364 1.529-2.856 1.529-4.476 0-2.216-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1c-2.409 0-4.448.789-6.116 2.366-1.668 1.577-2.502 3.474-2.502 5.69 0 2.217.834 4.092 2.502 5.626 1.668 1.535 3.707 2.302 6.117 2.302h52.13zM26.1 47.951c-2.41 0-4.449.789-6.117 2.366-1.668 1.577-2.502 3.473-2.502 5.69 0 2.216.834 4.092 2.502 5.626 1.668 1.534 3.707 2.302 6.117 2.302h52.13c2.409 0 4.47-.768 6.185-2.302 1.715-1.534 2.572-3.41 2.572-5.626 0-2.217-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1zm52.407 64.063l1.807-1.663 3.476-3.196a479.75 479.75 0 0 0 4.587-4.284 500.757 500.757 0 0 1 5.004-4.667c3.985-3.666 8.48-7.758 13.485-12.276l11.677 10.741-13.485 12.404-5.004 4.603-4.587 4.22a179.46 179.46 0 0 0-3.267 3.068c-.88.853-1.367 1.322-1.46 1.407-.463.341-.973.703-1.529 1.087-.556.383-1.112.703-1.668.959-.556.256-1.413.575-2.572.959a83.5 83.5 0 0 1-3.545 1.087 72.2 72.2 0 0 1-3.475.895c-1.112.256-1.946.426-2.502.511-1.112.17-1.854.043-2.224-.383-.371-.426-.464-1.151-.278-2.174.092-.511.278-1.279.556-2.302.278-1.023.602-2.067.973-3.132l1.042-3.005c.325-.938.58-1.577.765-1.918a10.157 10.157 0 0 1 2.224-2.941z"/></svg>
qqjf-Web/src/icons/svg/fullscreen.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M38.47 52L52 38.462l-23.648-23.67L43.209 0H.035L0 43.137l14.757-14.865L38.47 52zm74.773 47.726L89.526 76 76 89.536l23.648 23.672L84.795 128h43.174L128 84.863l-14.757 14.863zM89.538 52l23.668-23.648L128 43.207V.038L84.866 0 99.73 14.76 76 38.472 89.538 52zM38.46 76L14.792 99.651 0 84.794v43.173l43.137.033-14.865-14.757L52 89.53 38.46 76z"/></svg>
qqjf-Web/src/icons/svg/guide.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M1.482 70.131l36.204 16.18 69.932-65.485-61.38 70.594 46.435 18.735c1.119.425 2.397-.17 2.797-1.363v-.085L127.998.047 1.322 65.874c-1.12.597-1.519 1.959-1.04 3.151.32.511.72.937 1.2 1.107zm44.676 57.821L64.22 107.26l-18.062-7.834v28.527z"/></svg>
qqjf-Web/src/icons/svg/him.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1624246657816" class="icon" viewBox="0 0 1228 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2010" xmlns:xlink="http://www.w3.org/1999/xlink" width="38.375" height="32"><defs><style type="text/css"></style></defs><path d="M1016.88888897 63.99999999a28.444444 28.444444 0 0 0-28.444445 28.444444v187.164445H248.88888897V92.44444399a28.444444 28.444444 0 0 0-56.888889 0v796.444445a28.444444 28.444444 0 0 0 56.888889 0v-63.431111h739.555555V888.88888899a28.444444 28.444444 0 0 0 56.888889 0V92.44444399a28.444444 28.444444 0 0 0-28.444444-28.444444z m-28.444445 704.568889H248.88888897v-187.733333h739.555555z m0-244.622222H248.88888897V336.49777799h739.555555z"  p-id="2011"></path></svg>
qqjf-Web/src/icons/svg/homePage.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1621487598758" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2368" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M566.55497187 51.95428531a77.02857187 77.02857187 0 0 0-103.47428625 0L44.68068594 449.16571437a38.5828575 38.5828575 0 0 0 51.67999969 57.32571375l6.65142843-6.33142781V914.74285719A77.16571406 77.16571406 0 0 0 180.2235425 992h224.64V759.65714281a54.33142875 54.33142875 0 0 1 54.37714313-54.40000031h105.69142875a54.35428594 54.35428594 0 0 1 54.40000031 54.40000031V992h229.94285719a77.23428563 77.23428563 0 0 0 77.23428562-77.25714281V505.21142844c17.14285687 15.52000031 41.4628575 14.33142844 55.74857063-1.55428594a38.5828575 38.5828575 0 0 0-2.78857125-54.51428531L566.55497187 51.9771425z" fill="#ffffff" p-id="2369"></path></svg>
qqjf-Web/src/icons/svg/icon.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.147.062a13 13 0 0 1 4.94.945c1.55.63 2.907 1.526 4.069 2.688a13.148 13.148 0 0 1 2.761 4.069c.678 1.55 1.017 3.245 1.017 5.086v102.3c0 3.681-1.187 6.733-3.56 9.155-2.373 2.422-5.352 3.633-8.937 3.633H12.992c-3.875 0-7-1.26-9.373-3.779-2.373-2.518-3.56-5.667-3.56-9.445V12.704c0-3.39 1.163-6.345 3.488-8.863C5.872 1.32 8.972.062 12.847.062h102.3zM81.434 109.047c1.744 0 3.003-.412 3.778-1.235.775-.824 1.163-1.914 1.163-3.27 0-1.26-.388-2.325-1.163-3.197-.775-.872-2.034-1.307-3.778-1.307H72.57c.097-.194.145-.485.145-.872V27.09h9.01c1.743 0 2.954-.436 3.633-1.308.678-.872 1.017-1.938 1.017-3.197 0-1.26-.34-2.325-1.017-3.197-.679-.872-1.89-1.308-3.633-1.308H46.268c-1.743 0-2.954.436-3.632 1.308-.678.872-1.018 1.938-1.018 3.197 0 1.26.34 2.325 1.018 3.197.678.872 1.889 1.308 3.632 1.308h8.138v72.075c0 .193.024.339.073.436.048.096.072.242.072.436H46.56c-1.744 0-3.003.435-3.778 1.307-.775.872-1.163 1.938-1.163 3.197 0 1.356.388 2.446 1.163 3.27.775.823 2.034 1.235 3.778 1.235h34.875z"/></svg>
qqjf-Web/src/icons/svg/in-storage.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1623139027497" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4941" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><defs><style type="text/css"></style></defs><path d="M258.701056 193.045226l512.00016 0 0 63.99952L258.701056 257.044746 258.701056 193.045226zM256.993602 321.671065l511.99916 0 0 63.99952L256.993602 385.670585 256.993602 321.671065zM256.993602 449.663108l131.31098 0 0 64.00052L256.993602 513.663628 256.993602 449.663108zM256.993602 577.665147l57.948456 0 0 64.00052-57.948456 0L256.993602 577.665147zM898.701256 0 130.701016 0C95.356326 0 66.702495 28.653831 66.702495 64.00052l0 895.998281c0 35.34469 28.653831 63.99952 63.99952 63.99952l299.403191-0.327895 0-63.99952-299.403191 0.327895L130.702015 64.00052l768.00024 0 0 611.622281 63.99952 0L962.701775 64.00052C962.700776 28.653831 934.041947 0 898.701256 0L898.701256 0z" p-id="4942" ></path><path d="M962.700776 998.077615c-4.265635-63.979527-29.857446-375.345889-362.549984-392.40643l0-98.101607c0-4.265635 0-17.06154-8.53027-29.857446s-25.591811-12.795905-46.917986-4.265635l-4.265635 0-187.672945 204.734485c-4.265635 4.265635-21.326176 25.591811-21.326176 46.917986 0 25.591811 21.326176 46.917986 25.591811 46.917986l187.672945 213.264755c4.265635 4.265635 17.06154 17.06154 29.857446 17.06154 12.795905 0 21.326176-8.53027 25.591811-17.06154 4.265635-8.53027 4.265635-17.06154 4.265635-29.857446L604.417426 831.731846c55.449256 0 208.99912 8.53027 302.836092 174.877039 6.536908 14.430382 17.06154 17.06154 25.591811 17.06154l8.53027 0 6.380958-1.880398C960.551464 1017.524392 962.700776 1002.34325 962.700776 998.077615L962.700776 998.077615zM617.212332 789.078495c-21.326176 0-34.122081 0-34.122081 0l-21.326176 4.265635 0 145.019594L391.151671 742.160509c-4.265635-4.265635-12.795905-12.795905-12.795905-17.06154 0-4.265635 4.265635-12.795905 8.53027-17.06154l166.346769-179.142674 0 123.693418 21.326176 0c238.856566 0 311.366363 162.081134 332.692538 272.978647C809.149912 801.8744 676.926224 789.078495 617.212332 789.078495L617.212332 789.078495z" p-id="4943" ></path></svg>
qqjf-Web/src/icons/svg/inbound.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1621487711672" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4691" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M258.701056 193.045226l512.00016 0 0 63.99952L258.701056 257.044746 258.701056 193.045226zM256.993602 321.671065l511.99916 0 0 63.99952L256.993602 385.670585 256.993602 321.671065zM256.993602 449.663108l131.31098 0 0 64.00052L256.993602 513.663628 256.993602 449.663108zM256.993602 577.665147l57.948456 0 0 64.00052-57.948456 0L256.993602 577.665147zM898.701256 0 130.701016 0C95.356326 0 66.702495 28.653831 66.702495 64.00052l0 895.998281c0 35.34469 28.653831 63.99952 63.99952 63.99952l299.403191-0.327895 0-63.99952-299.403191 0.327895L130.702015 64.00052l768.00024 0 0 611.622281 63.99952 0L962.701775 64.00052C962.700776 28.653831 934.041947 0 898.701256 0L898.701256 0z" p-id="4692"></path><path d="M962.700776 998.077615c-4.265635-63.979527-29.857446-375.345889-362.549984-392.40643l0-98.101607c0-4.265635 0-17.06154-8.53027-29.857446s-25.591811-12.795905-46.917986-4.265635l-4.265635 0-187.672945 204.734485c-4.265635 4.265635-21.326176 25.591811-21.326176 46.917986 0 25.591811 21.326176 46.917986 25.591811 46.917986l187.672945 213.264755c4.265635 4.265635 17.06154 17.06154 29.857446 17.06154 12.795905 0 21.326176-8.53027 25.591811-17.06154 4.265635-8.53027 4.265635-17.06154 4.265635-29.857446L604.417426 831.731846c55.449256 0 208.99912 8.53027 302.836092 174.877039 6.536908 14.430382 17.06154 17.06154 25.591811 17.06154l8.53027 0 6.380958-1.880398C960.551464 1017.524392 962.700776 1002.34325 962.700776 998.077615L962.700776 998.077615zM617.212332 789.078495c-21.326176 0-34.122081 0-34.122081 0l-21.326176 4.265635 0 145.019594L391.151671 742.160509c-4.265635-4.265635-12.795905-12.795905-12.795905-17.06154 0-4.265635 4.265635-12.795905 8.53027-17.06154l166.346769-179.142674 0 123.693418 21.326176 0c238.856566 0 311.366363 162.081134 332.692538 272.978647C809.149912 801.8744 676.926224 789.078495 617.212332 789.078495L617.212332 789.078495z" p-id="4693"></path></svg>
qqjf-Web/src/icons/svg/international.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M83.287 103.01c-1.57-3.84-6.778-10.414-15.447-19.548-2.327-2.444-2.182-4.306-1.338-9.862v-.64c.553-3.81 1.513-6.05 14.313-8.087 6.516-1.018 8.203 1.57 10.589 5.178l.785 1.193a12.625 12.625 0 0 0 6.43 5.207c1.134.524 2.53 1.164 4.421 2.24 4.596 2.53 4.596 5.41 4.596 11.753v.727a26.91 26.91 0 0 1-5.178 17.454 59.055 59.055 0 0 1-19.025 11.026c3.49-6.546.814-14.313 0-16.553l-.146-.087zM64 5.12a58.502 58.502 0 0 1 25.484 5.818 54.313 54.313 0 0 0-12.859 10.327c-.93 1.28-1.716 2.473-2.472 3.579-2.444 3.694-3.637 5.352-5.818 5.614a25.105 25.105 0 0 1-4.219 0c-4.276-.29-10.094-.64-11.956 4.422-1.193 3.23-1.396 11.956 2.444 16.495.66 1.077.778 2.4.32 3.578a7.01 7.01 0 0 1-2.066 3.229 18.938 18.938 0 0 1-2.909-2.91 18.91 18.91 0 0 0-8.32-6.603c-1.25-.349-2.647-.64-3.985-.93-3.782-.786-8.03-1.688-9.019-3.812a14.895 14.895 0 0 1-.727-5.818 21.935 21.935 0 0 0-1.396-9.25 8.873 8.873 0 0 0-5.557-4.946A58.705 58.705 0 0 1 64 5.12zM0 64c0 35.346 28.654 64 64 64 35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64z"/></svg>
qqjf-Web/src/icons/svg/language.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.742 36.8c2.398 7.2 5.595 12.8 11.19 18.4 4.795-4.8 7.992-11.2 10.39-18.4h-21.58zm-52.748 40h20.78l-10.39-28-10.39 28z"/><path d="M111.916 0H16.009C7.218 0 .025 7.2.025 16v96c0 8.8 7.193 16 15.984 16h95.907c8.791 0 15.984-7.2 15.984-16V16c0-8.8-6.394-16-15.984-16zM72.754 103.2c-1.598 1.6-3.197 1.6-4.795 1.6-.8 0-2.398 0-3.197-.8-.8-.8-1.599 0-1.599-.8s-.799-1.6-1.598-3.2c-.8-1.6-.8-2.4-1.599-4l-3.196-8.8H28.797L25.6 96c-1.598 3.2-2.398 5.6-3.197 7.2-.8 1.6-2.398 1.6-4.795 1.6-1.599 0-3.197-.8-4.796-1.6-1.598-1.6-2.397-2.4-2.397-4 0-.8 0-1.6.799-3.2.8-1.6.8-2.4 1.598-4l17.583-44.8c.8-1.6.8-3.2 1.599-4.8.799-1.6 1.598-3.2 2.397-4 .8-.8 1.599-2.4 3.197-3.2 1.599-.8 3.197-.8 4.796-.8 1.598 0 3.196 0 4.795.8 1.598.8 2.398 1.6 3.197 3.2.799.8 1.598 2.4 2.397 4 .8 1.6 1.599 3.2 2.398 5.6l17.583 44c1.598 3.2 2.398 5.6 2.398 7.2-.8.8-1.599 2.4-2.398 4zM116.711 72c-8.791-3.2-15.185-7.2-20.78-12-5.594 5.6-12.787 9.6-21.579 12l-2.397-4c8.791-2.4 15.984-5.6 21.579-11.2C87.939 51.2 83.144 44 81.545 36h-7.992v-3.2h21.58c-1.6-2.4-3.198-5.6-4.796-8l2.397-.8c1.599 2.4 3.997 5.6 5.595 8.8h19.98v4h-7.992c-2.397 8-6.393 15.2-11.189 20 5.595 4.8 11.988 8.8 20.78 11.2l-3.197 4z"/></svg>
qqjf-Web/src/icons/svg/link.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.625 127.937H.063V12.375h57.781v12.374H12.438v90.813h90.813V70.156h12.374z"/><path d="M116.426 2.821l8.753 8.753-56.734 56.734-8.753-8.745z"/><path d="M127.893 37.982h-12.375V12.375H88.706V0h39.187z"/></svg>
qqjf-Web/src/icons/svg/list.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M1.585 12.087c0 6.616 3.974 11.98 8.877 11.98 4.902 0 8.877-5.364 8.877-11.98 0-6.616-3.975-11.98-8.877-11.98-4.903 0-8.877 5.364-8.877 11.98zM125.86.107H35.613c-1.268 0-2.114 1.426-2.114 2.852v18.255c0 1.712 1.057 2.853 2.114 2.853h90.247c1.268 0 2.114-1.426 2.114-2.853V2.96c0-1.711-1.057-2.852-2.114-2.852zM.106 62.86c0 6.615 3.974 11.979 8.876 11.979 4.903 0 8.877-5.364 8.877-11.98 0-6.616-3.974-11.98-8.877-11.98-4.902 0-8.876 5.364-8.876 11.98zM124.17 50.88H33.921c-1.268 0-2.114 1.425-2.114 2.851v18.256c0 1.711 1.057 2.852 2.114 2.852h90.247c1.268 0 2.114-1.426 2.114-2.852V53.73c0-1.426-.846-2.852-2.114-2.852zM.106 115.913c0 6.616 3.974 11.98 8.876 11.98 4.903 0 8.877-5.364 8.877-11.98 0-6.616-3.974-11.98-8.877-11.98-4.902 0-8.876 5.364-8.876 11.98zm124.064-11.98H33.921c-1.268 0-2.114 1.426-2.114 2.853v18.255c0 1.711 1.057 2.852 2.114 2.852h90.247c1.268 0 2.114-1.426 2.114-2.852v-18.255c0-1.427-.846-2.853-2.114-2.853z"/></svg>
qqjf-Web/src/icons/svg/lock.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M119.88 49.674h-7.987V39.52C111.893 17.738 90.45.08 63.996.08 37.543.08 16.1 17.738 16.1 39.52v10.154H8.113c-4.408 0-7.987 2.94-7.987 6.577v65.13c0 3.637 3.57 6.577 7.987 6.577H119.88c4.407 0 7.987-2.94 7.987-6.577v-65.13c-.008-3.636-3.58-6.577-7.987-6.577zm-23.953 0H32.065V39.52c0-14.524 14.301-26.295 31.931-26.295 17.63 0 31.932 11.777 31.932 26.295v10.153z"/></svg>
qqjf-Web/src/icons/svg/logo.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg t="1595484202945" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12292" width="32" height="32"><path d="M483.2 4.16c180.544-3.072 279.36 58.304 376.512 136.448 28.864 23.168 45.184 58.432 71.744 83.648l-0.96 1.92-102.656 52.864C774.4 184.768 584.96 82.56 422.4 128.64a462.72 462.72 0 0 0-117.568 49.792l-60.8-64.768c-6.528-6.528-20.48-15.488-15.936-23.872l40.832-24.896c30.4-15.936 62.08-29.248 94.72-39.808 26.24-8.96 55.616-12.608 84.608-17.92L483.2 4.16z m-26.944 1015.808c-57.856 0.832-114.304-23.104-155.456-42.88-140.544-67.456-231.296-172.928-280.96-331.584-46.144-147.712 5.184-317.184 65.792-408.32 15.552-23.424 30.848-51.84 52.8-68.736h1.984l77.696 82.688-3.968 3.968-28.864 37.824a477.376 477.376 0 0 0-53.76 117.504c-10.944 35.328-18.56 89.856-11.008 133.504 5.44 31.552 5.12 56.96 13.952 83.648 35.84 108.16 101.376 181.888 192.256 235.008 24.192 14.08 54.144 24.192 82.688 32.832l46.848 9.984v114.56z m112.576 0l1.024-116.544c47.552 0.128 96.32-23.936 128.512-42.88 108.608-63.744 174.528-148.16 204.16-291.712 8.576-41.408 5.12-102.144-4.928-138.432l-14.976-51.84 102.656-52.736c12.16 31.36 20.48 65.728 28.864 101.568 13.888 59.584 7.616 148.416-6.976 200.192-44.16 156.928-122.368 263.424-252.032 333.632-49.472 26.752-114.048 57.92-186.304 58.752z m180.352-673.28c110.976-2.816 79.552 158.208-21.952 115.584l-139.52 100.544c0.576 42.944-42.752 77.696-86.656 57.792-36.48-16.576-26.496-29.44-37.824-53.76l-164.416-57.792c-37.248 48.064-127.232-7.104-98.56-69.76 26.88-58.816 120.32-44.672 118.528 32.896l157.44 55.808a60.16 60.16 0 0 1 97.6-4.032l125.504-92.608c-15.808-57.6 22.784-81.92 49.856-84.608z m-266.048 2.048c32.896-6.016 62.528 11.264 71.744 47.808a54.72 54.72 0 0 1-1.984 33.792c1.472 0.512 58.112 34.752 60.8 41.856l-32.896 23.872-51.84-34.816c-26.112 19.84-48.384 11.392-70.72-1.024l-33.92 28.928-42.752-14.976c17.92-16.256 54.272-47.808 53.76-48.768-11.968-48.832 27.904-71.232 47.808-76.672z m269.056 80.64c22.016 7.296 36.864-28.864 13.952-40.832-30.912-10.24-44.16 30.848-14.016 40.832z m-500.16 13.952c25.6-6.336 37.184 39.168 7.04 41.856-26.24 2.304-34.176-35.2-7.04-41.856z m430.4 73.728l51.84 34.816c12.928-3.584 24.512-13.696 44.8-9.984 40.64 7.488 70.592 58.624 40.832 98.56-26.88 36.16-89.856 28.224-106.624-11.904-5.632-13.504 0-37.12-4.928-46.784l-58.816-39.872v-0.96l32.896-23.872z m-367.616 15.872l41.856 16-7.04 7.936-38.784 33.856c24.512 79.36-63.04 118.976-104.64 64.704-29.504-38.4-5.376-92.032 36.864-100.608 16.896-3.392 29.44 3.584 40.832 6.016l30.912-27.904z m205.248 9.984c-26.432 9.472-16.448 48.32 10.88 41.856 27.456-6.464 15.488-51.328-10.88-41.856z" fill="#1890FF" p-id="12293"></path></svg>
qqjf-Web/src/icons/svg/message.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 20.967v59.59c0 11.59 8.537 20.966 19.075 20.966h28.613l1 26.477L76.8 101.523h32.125c10.538 0 19.075-9.377 19.075-20.966v-59.59C128 9.377 119.463 0 108.925 0h-89.85C8.538 0 0 9.377 0 20.967zm82.325 33.1c0-5.524 4.013-9.935 9.037-9.935 5.026 0 9.038 4.41 9.038 9.934 0 5.524-4.025 9.934-9.038 9.934-5.024 0-9.037-4.41-9.037-9.934zm-27.613 0c0-5.524 4.013-9.935 9.038-9.935s9.037 4.41 9.037 9.934c0 5.524-4.025 9.934-9.037 9.934-5.025 0-9.038-4.41-9.038-9.934zm-27.1 0c0-5.524 4.013-9.935 9.038-9.935s9.038 4.41 9.038 9.934c0 5.524-4.026 9.934-9.05 9.934-5.013 0-9.025-4.41-9.025-9.934z"/></svg>
qqjf-Web/src/icons/svg/money.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.122 127.892v-28.68H7.513V87.274h46.609v-12.4H7.513v-12.86h38.003L.099 0h22.6l32.556 45.07c3.617 5.144 6.44 9.611 8.487 13.385 1.788-3.05 4.89-7.779 9.301-14.186L103.93 0h24.01L82.385 62.013h38.34v12.862h-46.41v12.4h46.41v11.937h-46.41v28.68H54.123z"/></svg>
qqjf-Web/src/icons/svg/nested.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.002 9.2c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-5.043-3.58-9.132-7.997-9.132S.002 4.157.002 9.2zM31.997.066h95.981V18.33H31.997V.066zm0 45.669c0 5.044 3.58 9.132 7.998 9.132 4.417 0 7.997-4.088 7.997-9.132 0-3.263-1.524-6.278-3.998-7.91-2.475-1.63-5.524-1.63-7.998 0-2.475 1.632-4 4.647-4 7.91zM63.992 36.6h63.986v18.265H63.992V36.6zm-31.995 82.2c0 5.043 3.58 9.132 7.998 9.132 4.417 0 7.997-4.089 7.997-9.132 0-5.044-3.58-9.133-7.997-9.133s-7.998 4.089-7.998 9.133zm31.995-9.131h63.986v18.265H63.992V109.67zm0-27.404c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-3.263-1.524-6.277-3.998-7.909-2.475-1.631-5.524-1.631-7.998 0-2.475 1.632-4 4.646-4 7.91zm31.995-9.13h31.991V91.4H95.987V73.135z"/></svg>
qqjf-Web/src/icons/svg/out-storage.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1623138991555" class="icon" viewBox="0 0 1189 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3253" width="37.15625" height="32" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M702.776889 539.932444l178.716444-137.955555a17.237333 17.237333 0 0 0 0-27.306667l-178.716444-137.955555a17.237333 17.237333 0 0 0-27.761778 13.653333V329.955556c-168.96 18.005333-293.205333 142.592-278.869333 281.742222 45.795556-89.685333 151.04-156.16 278.528-162.133334l0.341333 0.312889v76.430223a17.237333 17.237333 0 0 0 27.761778 13.653333zM98.816 168.504889H461.937778v56.888889H98.816zM98.816 362.609778h246.613333v56.888889h-246.613333zM98.816 556.743111h165.973333v56.888889H98.816z"  p-id="3254"></path><path d="M838.769778 636.017778L835.555556 824.888889H56.888889V56.888889h778.296889v85.646222a26.481778 26.481778 0 0 0 0.768 3.754667h55.381333a26.481778 26.481778 0 0 0 0.739556-3.754667V34.844444A34.816 34.816 0 0 0 857.372444 0H34.702222A34.816 34.816 0 0 0 0 34.844444v812.088889A34.816 34.816 0 0 0 34.702222 881.777778h822.698667a34.702222 34.702222 0 0 0 34.702222-34.360889l3.584-211.399111z"  p-id="3255"></path></svg>
qqjf-Web/src/icons/svg/outbound.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1621487819085" class="icon" viewBox="0 0 1189 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5547" xmlns:xlink="http://www.w3.org/1999/xlink" width="232.2265625" height="200"><defs><style type="text/css"></style></defs><path d="M702.776889 539.932444l178.716444-137.955555a17.237333 17.237333 0 0 0 0-27.306667l-178.716444-137.955555a17.237333 17.237333 0 0 0-27.761778 13.653333V329.955556c-168.96 18.005333-293.205333 142.592-278.869333 281.742222 45.795556-89.685333 151.04-156.16 278.528-162.133334l0.341333 0.312889v76.430223a17.237333 17.237333 0 0 0 27.761778 13.653333zM98.816 168.504889H461.937778v56.888889H98.816zM98.816 362.609778h246.613333v56.888889h-246.613333zM98.816 556.743111h165.973333v56.888889H98.816z"  p-id="5548"></path><path d="M838.769778 636.017778L835.555556 824.888889H56.888889V56.888889h778.296889v85.646222a26.481778 26.481778 0 0 0 0.768 3.754667h55.381333a26.481778 26.481778 0 0 0 0.739556-3.754667V34.844444A34.816 34.816 0 0 0 857.372444 0H34.702222A34.816 34.816 0 0 0 0 34.844444v812.088889A34.816 34.816 0 0 0 34.702222 881.777778h822.698667a34.702222 34.702222 0 0 0 34.702222-34.360889l3.584-211.399111z"  p-id="5549"></path></svg>
qqjf-Web/src/icons/svg/password.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M108.8 44.322H89.6v-5.36c0-9.04-3.308-24.163-25.6-24.163-23.145 0-25.6 16.881-25.6 24.162v5.361H19.2v-5.36C19.2 15.281 36.798 0 64 0c27.202 0 44.8 15.281 44.8 38.961v5.361zm-32 39.356c0-5.44-5.763-9.832-12.8-9.832-7.037 0-12.8 4.392-12.8 9.832 0 3.682 2.567 6.808 6.407 8.477v11.205c0 2.718 2.875 4.962 6.4 4.962 3.524 0 6.4-2.244 6.4-4.962V92.155c3.833-1.669 6.393-4.795 6.393-8.477zM128 64v49.201c0 8.158-8.645 14.799-19.2 14.799H19.2C8.651 128 0 121.359 0 113.201V64c0-8.153 8.645-14.799 19.2-14.799h89.6c10.555 0 19.2 6.646 19.2 14.799z"/></svg>
qqjf-Web/src/icons/svg/pdf.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M869.073 277.307H657.111V65.344l211.962 211.963zm-238.232 26.27V65.344l-476.498-.054v416.957h714.73v-178.67H630.841zm-335.836 360.57c-5.07-3.064-10.944-5.133-17.61-6.201-6.67-1.064-13.603-1.6-20.81-1.6h-48.821v85.641h48.822c7.206 0 14.14-.532 20.81-1.6 6.665-1.065 12.54-3.133 17.609-6.202 5.064-3.063 9.134-7.406 12.208-13.007 3.065-5.602 4.6-12.937 4.6-22.011 0-9.07-1.535-16.408-4.6-22.01-3.074-5.603-7.144-9.94-12.208-13.01zM35.82 541.805v416.904h952.358V541.805H35.821zm331.421 191.179c-3.6 11.071-9.343 20.879-17.209 29.413-7.874 8.542-18.078 15.408-30.617 20.61-12.544 5.206-27.747 7.807-45.621 7.807h-66.036v102.45h-62.831V607.517h128.867c17.874 0 33.077 2.6 45.62 7.802 12.541 5.207 22.745 12.076 30.618 20.615 7.866 8.538 13.604 18.277 17.21 29.212 3.6 10.943 5.401 22.278 5.401 34.018 0 11.477-1.8 22.752-5.402 33.819zM644.9 806.417c-5.343 17.61-13.408 32.818-24.212 45.627-10.807 12.803-24.283 22.879-40.423 30.213-16.146 7.343-35.155 11.007-57.03 11.007h-123.26V607.518h123.26c18.41 0 35.552 2.941 51.428 8.808 15.873 5.869 29.618 14.671 41.22 26.412 11.608 11.744 20.674 26.411 27.217 44.02 6.535 17.61 9.803 38.288 9.803 62.035 0 20.81-2.67 40.02-8.003 57.624zm245.362-146.07h-138.07v66.03h119.66v48.829h-119.66v118.058h-62.83V607.518h200.9v52.829h-.001zm-318.2 25.611c-6.402-8.266-14.877-14.604-25.412-19.01-10.544-4.402-23.551-6.602-39.019-6.602h-44.825v180.088h56.029c9.07 0 17.872-1.463 26.415-4.401 8.535-2.932 16.14-7.802 22.812-14.609 6.665-6.8 12.007-15.667 16.007-26.61 4.003-10.94 6.003-24.275 6.003-40.021 0-14.408-1.4-27.416-4.202-39.019-2.8-11.607-7.406-21.542-13.808-29.816zm0 0"/></svg>
qqjf-Web/src/icons/svg/people.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M104.185 95.254c8.161 7.574 13.145 17.441 13.145 28.28 0 1.508-.098 2.998-.285 4.466h-10.784c.238-1.465.403-2.948.403-4.465 0-8.983-4.36-17.115-11.419-23.216C86 104.66 75.355 107.162 64 107.162c-11.344 0-21.98-2.495-31.22-6.83-7.064 6.099-11.444 14.218-11.444 23.203 0 1.517.165 3 .403 4.465H10.955a35.444 35.444 0 0 1-.285-4.465c0-10.838 4.974-20.713 13.127-28.291C9.294 85.42.003 70.417.003 53.58.003 23.99 28.656.001 64 .001s63.997 23.988 63.997 53.58c0 16.842-9.299 31.85-23.812 41.673zM64 36.867c-29.454 0-53.33-10.077-53.33 15.342 0 25.418 23.876 46.023 53.33 46.023 29.454 0 53.33-20.605 53.33-46.023 0-25.419-23.876-15.342-53.33-15.342zm24.888 25.644c-3.927 0-7.111-2.665-7.111-5.953 0-3.288 3.184-5.954 7.11-5.954 3.928 0 7.111 2.666 7.111 5.954s-3.183 5.953-7.11 5.953zm-3.556 16.372c0 4.11-9.55 7.442-21.332 7.442-11.781 0-21.332-3.332-21.332-7.442 0-1.06.656-2.064 1.8-2.976 3.295 2.626 10.79 4.465 19.532 4.465 8.743 0 16.237-1.84 19.531-4.465 1.145.912 1.801 1.916 1.801 2.976zm-46.22-16.372c-3.927 0-7.11-2.665-7.11-5.953 0-3.288 3.183-5.954 7.11-5.954 3.927 0 7.111 2.666 7.111 5.954s-3.184 5.953-7.11 5.953z"/></svg>
qqjf-Web/src/icons/svg/peoples.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M95.648 118.762c0 5.035-3.563 9.121-7.979 9.121H7.98c-4.416 0-7.979-4.086-7.979-9.121C0 100.519 15.408 83.47 31.152 76.75c-9.099-6.43-15.216-17.863-15.216-30.987v-9.128c0-20.16 14.293-36.518 31.893-36.518s31.894 16.358 31.894 36.518v9.122c0 13.137-6.123 24.556-15.216 30.993 15.738 6.726 31.141 23.769 31.141 42.012z"/><path d="M106.032 118.252h15.867c3.376 0 6.101-3.125 6.101-6.972 0-13.957-11.787-26.984-23.819-32.123 6.955-4.919 11.638-13.66 11.638-23.704v-6.985c0-15.416-10.928-27.926-24.39-27.926-1.674 0-3.306.193-4.89.561 1.936 4.713 3.018 9.974 3.018 15.526v9.121c0 13.137-3.056 23.111-11.066 30.993 14.842 4.41 27.312 23.42 27.541 41.509z"/></svg>
qqjf-Web/src/icons/svg/qq.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M18.448 57.545l-.244-.744-.198-.968-.132-.53v-2.181l.236-.859.24-.908.317-.953.428-1.06.561-1.103.794-1.104v-.773l.077-.724.123-.984.34-1.106.313-1.194.25-.548.289-.511.371-.569.405-.423v-2.73l.234-1.407.236-1.633.42-1.955.577-2.035.43-1.118.426-1.217.468-1.135.559-1.216.57-1.332.655-1.247.737-1.331.929-1.33.43-.762.457-.624.995-1.406 1.025-1.403 1.163-1.444 1.246-1.405 1.352-1.384 1.41-1.423 1.708-1.536 1.083-.934 1.322-1.008 1.34-.89 1.448-.855 1.392-.76 1.57-.63 1.667-.775 1.657-.532 1.653-.552 1.787-.548 1.785-.417 1.876-.347L59.128.68l1.879-.245 1.876-.252 2.002-.106h5.912l1.97.243 1.981.231 2.019.207 1.874.441 1.979.413 1.857.475 2.035.53 1.862.646 1.782.738 1.904.78 1.736.853 1.689.95 1.655 1.044 1.425.971.662.548.693.401 1.323 1.1 1.115 1.064 1.112 1.1 1.083 1.214.894 1.178 1.064 1.217.74 1.306.752 1.162.798 1.352.661 1.175 1.113 2.489.546 1.286.428 1.192.428 1.294.384 1.217.267 1.047.347 1.231.607 2.198.388 1.924.253 1.861.217 1.497.342 2.28.077.362.274.41.737 1.18.473.8.42.832.534.892.472 1.07.307 1.093.334 1.2.252 1.232.115.605.106.746v.648l-.106.643v.8l-.192.774-.35 1.5-.403.76-.299.852v.213l.142.264.4.623 1.746 2.53 1.377 1.9.66 1.267.889 1.389.774 1.52.893 1.627.894 1.828 1.006 2.069.567 1.268.518 1.239.447 1.307.44 1.175.336 1.235.342 1.16.432 2.261.343 2.31.235 2.05v2.891l-.158 1.025-.226 1.768-.308 1.59-.48 1.44-.18.588-.336.707-.28.493-.375.607-.33.383-.42.494-.375.4-.401.34-.48.207-.432.207-.355.114h-.543l-.346-.114-.66-.32-.302-.212-.317-.223-.347-.304-.35-.342-.579-.63-.684-.89-.539-.917-.538-.734-.526-.855-.741-1.517-.833-1.579-.098-.055h-.138l-.338.247-.196.415-.326.516-.567 1.533-.856 2.182-1.096 2.626-.824 1.308-.864 1.366-1.027 1.536-1.09 1.503-.557.68-.676.743-1.555 1.497.136.135.21.214.777.446 3.235 1.524 1.41.779 1.347.756 1.332.953 1.187.982.574.443.432.511.445.593.367.643.198.533.242.64.105.554.115.647-.115.433v.44l-.105.454-.242.415-.092.325-.22.394-.587.784-.543.627-.42.47-.35.348-.893.638-1.01.556-1.077.532-1.155.511-1.287.495-.693.207-.608.167-1.496.342-1.545.325-1.552.323-1.689.27-1.74.072-1.785.21h-5.539l-1.998-.114-1.86-.168-2.005-.27-1.99-.209-2.095-.286-2.03-.495-1.981-.374-1.968-.552-2.019-.707-1.98-.585-1.044-.342-.927-.323-.586-.223-.582-.12h-1.647l-1.904-.131-.962-.096-1.24-.135-.795.705-1.085.665-1.471.701-1.628.875-.99.475-1.033.376-2.281.914-1.24.305-1.3.343-1.803.344-1.13.086-1.193.1-1.246.135-1.45.053h-5.926l-3.346-.053-3.25-.321-1.644-.23-1.589-.23-1.546-.227-1.547-.305-1.442-.456-1.434-.325-1.294-.51-1.223-.474-1.142-.533-.99-.583-.984-.71-.336-.343-.44-.415-.334-.362-.3-.417-.278-.415-.215-.42-.311-.89-.109-.46-.138-.51v-.473l.138-.533v-.53l.109-.53v-1.069l.052-.564.259-.647.215-.646.39-.779.286-.3.236-.348.615-.738.49-.38.464-.266.428-.338.676-.21.543-.324.676-.341.77-.227.775-.231.897-.192.85-.11 1.008-.13 1.093-.081.284-.092h.063l.137-.115v-.13l-.2-.266-.58-.27-1.45-1.231-.975-.761-1.127-.967-1.136-1.082-1.181-1.382-1.36-1.558-.508-.843-.672-.87-.58-1.007-.522-1.1-.704-1.047-.459-1.194-.547-1.192-.546-1.33-.397-1.273-.378-1.575-.112-.057h-.115l-.059-.113h-.14l-.23.113-.114.057-.158.264-.057.321-.119.286-.206.477-.664 1.157-.345.701-.546.612-.58.736-.641.816-.677.724-.795.701-.734.658-.814.524-.89.546-.855.325-1.008.247-.99.095h-.233l-.228-.095-.18-.384-.29-.188-.38-.912-.237-.493-.255-.707-.21-.734-.113-.724-.313-1.648-.12-.972v-3.185l.12-2.379.196-1.214.23-1.252.21-1.347.374-1.254.42-1.443.431-1.407.578-1.448.545-1.38.754-1.4.699-1.52.855-1.425 1.006-1.538 1.023-1.382 1.069-1.538.891-1.071 1.142-1.227 1.202-1.237.56-.59.678-.662.985-.836 1.012-.853 1.647-1.446 1.242-.889z"/></svg>
qqjf-Web/src/icons/svg/record-chart.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1623139100922" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6811" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><defs><style type="text/css"></style></defs><path d="M846.5 990h-669c-40.3 0-73-32.7-73-73V107c0-40.3 32.7-73 73-73h669c40.3 0 73 32.7 73 73v810c0 40.3-32.7 73-73 73z m-669-900c-9.4 0-17 7.6-17 17v810c0 9.4 7.6 17 17 17h669c9.4 0 17-7.6 17-17V107c0-9.4-7.6-17-17-17h-669z"  p-id="6812"></path><path d="M316.2 356.7h192v56h-192zM316.6 228.8h256v56h-256zM225 62.9h56v898.2h-56zM726 897.1h-50c-40.3 0-73-32.7-73-73V357.5l98-98 98 98v466.6c0 40.2-32.7 73-73 73z m-67-516.4v443.4c0 9.4 7.6 17 17 17h50c9.4 0 17-7.6 17-17V380.7l-42-42-42 42z"  p-id="6813"></path></svg>
qqjf-Web/src/icons/svg/search.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M124.884 109.812L94.256 79.166c-.357-.357-.757-.629-1.129-.914a50.366 50.366 0 0 0 8.186-27.59C101.327 22.689 78.656 0 50.67 0 22.685 0 0 22.688 0 50.663c0 27.989 22.685 50.663 50.656 50.663 10.186 0 19.643-3.03 27.6-8.201.286.385.557.771.9 1.114l30.628 30.632a10.633 10.633 0 0 0 7.543 3.129c2.728 0 5.457-1.043 7.543-3.115 4.171-4.157 4.171-10.915.014-15.073M50.671 85.338C31.557 85.338 16 69.78 16 50.663c0-19.102 15.557-34.661 34.67-34.661 19.115 0 34.657 15.559 34.657 34.675 0 19.102-15.557 34.661-34.656 34.661"/></svg>
qqjf-Web/src/icons/svg/shopping.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M42.913 101.36c1.642 0 3.198.332 4.667.996a12.28 12.28 0 0 1 3.89 2.772c1.123 1.184 1.987 2.582 2.592 4.193.605 1.612.908 3.318.908 5.118 0 1.8-.303 3.507-.908 5.118-.605 1.611-1.469 3.01-2.593 4.194a13.3 13.3 0 0 1-3.889 2.843 10.582 10.582 0 0 1-4.667 1.066c-1.729 0-3.306-.355-4.732-1.066a13.604 13.604 0 0 1-3.825-2.843c-1.123-1.185-1.988-2.583-2.593-4.194a14.437 14.437 0 0 1-.907-5.118c0-1.8.302-3.506.907-5.118.605-1.61 1.47-3.009 2.593-4.193a12.515 12.515 0 0 1 3.825-2.772c1.426-.664 3.003-.996 4.732-.996zm53.932.285c1.643 0 3.22.331 4.733.995a11.386 11.386 0 0 1 3.889 2.772c1.08 1.185 1.945 2.583 2.593 4.194.648 1.61.972 3.317.972 5.118 0 1.8-.324 3.506-.972 5.117-.648 1.611-1.513 3.01-2.593 4.194a12.253 12.253 0 0 1-3.89 2.843 11 11 0 0 1-4.732 1.066 10.58 10.58 0 0 1-4.667-1.066 12.478 12.478 0 0 1-3.824-2.843c-1.08-1.185-1.945-2.583-2.593-4.194a13.581 13.581 0 0 1-.973-5.117c0-1.801.325-3.507.973-5.118.648-1.611 1.512-3.01 2.593-4.194a11.559 11.559 0 0 1 3.824-2.772 11.212 11.212 0 0 1 4.667-.995zm21.781-80.747c2.42 0 4.3.355 5.64 1.066 1.34.71 2.29 1.587 2.852 2.63a6.427 6.427 0 0 1 .778 3.34c-.044 1.185-.195 2.204-.454 3.057-.26.853-.8 2.606-1.62 5.26a589.268 589.268 0 0 1-2.788 8.743 1236.373 1236.373 0 0 0-3.047 9.453c-.994 3.128-1.75 5.592-2.269 7.393-1.123 3.79-2.55 6.42-4.278 7.89-1.728 1.469-3.846 2.203-6.352 2.203H39.023l1.945 12.795h65.342c4.148 0 6.223 1.943 6.223 5.828 0 1.896-.41 3.53-1.232 4.905-.821 1.374-2.442 2.061-4.862 2.061H38.505c-1.729 0-3.176-.426-4.343-1.28-1.167-.852-2.14-1.966-2.917-3.34a21.277 21.277 0 0 1-1.88-4.478 44.128 44.128 0 0 1-1.102-4.55c-.087-.568-.324-1.942-.713-4.122-.39-2.18-.865-4.904-1.426-8.174l-1.88-10.947c-.692-4.027-1.383-8.079-2.075-12.154-1.642-9.572-3.5-20.234-5.574-31.986H6.87c-1.296 0-2.377-.356-3.24-1.067a9.024 9.024 0 0 1-2.14-2.558 10.416 10.416 0 0 1-1.167-3.2C.108 8.53 0 7.488 0 6.54c0-1.896.583-3.46 1.75-4.69C2.917.615 4.494 0 6.482 0h13.095c1.728 0 3.111.284 4.148.853 1.037.569 1.858 1.28 2.463 2.132a8.548 8.548 0 0 1 1.297 2.701c.26.948.475 1.754.648 2.417.173.758.346 1.825.519 3.199.173 1.374.345 2.772.518 4.193.26 1.706.519 3.507.778 5.403h88.678z"/></svg>
qqjf-Web/src/icons/svg/size.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h54.796v18.286H36.531V128H18.265V73.143H0V54.857zm127.857-36.571H91.935V128H72.456V18.286H36.534V0h91.326l-.003 18.286z"/></svg>
qqjf-Web/src/icons/svg/skill.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M31.652 93.206h33.401c1.44 2.418 3.077 4.663 4.93 6.692h-38.33v-6.692zm0-10.586h28.914a44.8 44.8 0 0 1-1.264-6.688h-27.65v6.688zm0-17.27H59.39c.288-2.286.714-4.532 1.34-6.687H31.65v6.687h.003zm53.913 44.84v5.85c0 2.798-2.095 5.075-4.667 5.075h-70.07c-2.576 0-4.663-2.277-4.663-5.075V31.26l23.22-20.96v22.25H17.16v6.688h18.39V6.688h45.348c2.576 0 4.667 2.277 4.667 5.066v20.009c1.987-.675 4.053-1.128 6.17-1.445v-18.56C91.738 5.28 86.874 0 80.902 0H31.15L0 28.118v87.917c0 6.48 4.859 11.759 10.832 11.759h70.07c5.974 0 10.837-5.27 10.837-11.759v-4.41c-2.117-.312-4.183-.765-6.17-1.435h-.004zM23.279 58.667h-7.96v6.688h7.96v-6.688zm-7.956 41.23h7.96v-6.691h-7.96v6.692zm7.956-23.96h-7.96v6.687h7.96v-6.688zm89.718-15.042l-4.896-4.07-12.447 17.613-11.19-9.305-3.762 5.311 16.091 13.38 16.204-22.929zM128 70.978c0-18.632-13.97-33.782-31.147-33.782-17.168 0-31.135 15.155-31.135 33.782 0 18.628 13.97 33.783 31.135 33.783 17.172 0 31.143-15.15 31.143-33.783H128zm-6.17 0c0 14.933-11.203 27.1-24.981 27.1-13.77 0-24.987-12.158-24.987-27.1 0-14.941 11.195-27.099 24.987-27.099 13.778 0 24.982 12.158 24.982 27.1z"/></svg>
qqjf-Web/src/icons/svg/star.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M70.66 4.328l14.01 29.693c1.088 2.29 3.177 3.882 5.603 4.25l31.347 4.76c6.087.926 8.528 8.756 4.117 13.247L103.05 79.395c-1.75 1.78-2.544 4.352-2.132 6.867l5.352 32.641c1.043 6.337-5.33 11.182-10.778 8.19l-28.039-15.409a7.13 7.13 0 0 0-6.91 0l-28.039 15.41c-5.448 2.99-11.821-1.854-10.777-8.19l5.352-32.642c.415-2.515-.387-5.088-2.136-6.867L2.264 56.278C-2.146 51.787.286 43.957 6.38 43.031l31.343-4.76c2.419-.368 4.51-1.96 5.595-4.25L57.334 4.328c2.728-5.77 10.605-5.77 13.325 0z"/></svg>
qqjf-Web/src/icons/svg/storage.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1621487921042" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8725" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M747.08 489.45A212.73 212.73 0 1 0 534.27 276.7c0 45.56-0.34 182.31-0.35 183.68l-0.07 27.62 28.06 0.26c1.29-0.02 129.76 1.19 185.17 1.19zM590.78 276.7c0-86.67 70.12-157.18 156.3-157.18S903.39 190 903.39 276.7s-70.12 157.18-156.31 157.18c-39.22 0-115.39-0.61-156.58-1 0.1-42.66 0.28-123.22 0.28-156.18zM277.06 534.11a212.71 212.71 0 1 0 212.82 212.75c0-45.56 0.34-182.31 0.34-183.68l0.07-27.59-28.06-0.26c-1.28-0.02-129.75-1.22-185.17-1.22z m156.3 212.75c0 86.64-70.12 157.13-156.3 157.13S120.81 833.5 120.81 746.86s70.1-157.18 156.25-157.18c39.22 0 115.4 0.61 156.58 1-0.1 42.66-0.27 123.22-0.27 156.18zM489.88 276.7A212.81 212.81 0 0 0 126.4 126.46a212.74 212.74 0 0 0 150.66 363c55.42 0 183.88-1.2 185.18-1.21l28.06-0.26-0.07-27.59c-0.01-1.4-0.35-138.15-0.35-183.7zM277.06 433.88c-86.16 0-156.25-70.51-156.25-157.18s70.1-157.18 156.25-157.18S433.37 190 433.37 276.7c0 33 0.18 113.52 0.28 156.22-41.19 0.35-117.37 0.96-156.59 0.96zM747.08 534.11c-55.41 0-183.88 1.2-185.18 1.21l-28.06 0.26 0.07 27.59c0 1.38 0.35 138.13 0.35 183.68a212.84 212.84 0 1 0 212.82-212.74z m0 369.88c-86.19 0-156.3-70.49-156.3-157.13 0-33-0.18-113.52-0.28-156.22 41.19-0.35 117.36-1 156.58-1 86.19 0 156.31 70.51 156.31 157.18S833.27 904 747.08 904z" p-id="8726"></path></svg>
qqjf-Web/src/icons/svg/sys.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1621487976998" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10630" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M446.475758 660.107444C442.182118 660.107444 437.789395 659.281744 433.561811 657.465204 371.832486 631.240975 331.934666 570.865798 331.934666 503.620797 331.934666 411.538743 406.610966 336.59822 498.428796 336.59822 590.246626 336.59822 664.922926 411.538743 664.922926 503.620797 664.922926 569.874958 626.907702 630.118023 568.051813 657.101897 551.43873 664.698336 531.853129 657.465204 524.223661 640.852122 516.66025 624.272068 523.926409 604.653438 540.506464 597.056999 575.945504 580.807225 598.866933 544.113121 598.866933 503.620797 598.866933 447.935595 553.816746 402.654212 498.428796 402.654212 443.040846 402.654212 397.990659 447.935595 397.990659 503.620797 397.990659 544.311289 422.101097 580.840253 459.422733 596.660663 476.200955 603.827738 484.02859 623.215172 476.894543 639.993394 471.544007 652.544033 459.323649 660.107444 446.475758 660.107444" p-id="10631"></path><path d="M542.851451 996.708967 454.039169 996.708967C408.724758 996.708967 371.865514 959.849723 371.865514 914.56834L371.865514 821.561502C363.245207 818.985318 353.435892 815.847658 344.088969 812.577887L293.622191 863.011637C262.608902 894.057954 208.476016 894.057954 177.462727 863.011637L114.643478 800.225416C82.606322 768.18826 82.606322 716.070081 114.61045 684.032925L138.985112 659.691291C151.899058 646.777345 172.772752 646.777345 185.686698 659.691291 198.600645 672.605238 198.600645 693.478932 185.686698 706.392878L161.345065 730.734512C155.069746 737.042859 155.069746 747.215482 161.345065 753.523829L224.164314 816.31005C228.259786 820.405522 233.048845 821.033054 235.525945 821.033054 238.036073 821.033054 242.792104 820.405522 246.887576 816.31005L312.778429 750.452226C322.686828 740.510799 337.747594 737.934615 350.463372 744.044794 365.788363 751.410037 401.029235 761.41752 413.282622 764.654264 427.81494 768.452484 437.921507 781.564598 437.921507 796.559308L437.921507 914.56834C437.921507 923.419843 445.154638 930.652974 454.039169 930.652974L542.851451 930.652974C551.735982 930.652974 558.936086 923.419843 558.936086 914.56834L558.936086 796.559308C558.936086 780.70587 570.23166 767.065308 585.820875 764.125816 606.463372 760.228512 626.841646 753.457773 646.427248 744.044794 659.143027 737.934615 674.170765 740.510799 684.079164 750.452226L749.970017 816.31005C754.098516 820.405522 758.854548 821.033054 761.331648 821.033054 763.808747 821.033054 768.597807 820.405522 772.726306 816.31005L835.545555 753.523829C841.787847 747.215482 841.787847 737.042859 835.512527 730.734512L769.654703 664.876687C759.746304 654.968288 757.17012 639.841466 763.247271 627.191743 772.66025 607.672197 779.43099 587.293923 783.328293 566.651426 786.267785 551.029183 799.908347 539.733609 815.761786 539.733609L914.647607 539.733609C923.532138 539.733609 930.765269 532.500477 930.765269 523.648974L930.765269 434.803664C930.765269 425.952161 923.532138 418.71903 914.647607 418.71903L815.761786 418.71903C799.908347 418.71903 786.267785 407.423455 783.328293 391.834241 779.43099 371.257799 772.66025 350.846497 763.247271 331.260895 757.17012 318.611173 759.746304 303.48435 769.654703 293.575951L835.545555 227.718127C841.787847 221.409779 841.787847 211.237156 835.512527 204.928809L772.726306 142.142588C768.597807 138.047117 763.808747 137.419585 761.331648 137.419585 758.854548 137.419585 754.098516 138.047117 749.970017 142.142588L684.079164 208.000413C674.170765 217.94184 659.143027 220.518023 646.427248 214.407844 626.841646 204.994865 606.463372 198.224126 585.820875 194.326822 570.23166 191.387331 558.936086 177.746768 558.936086 161.89333L558.936086 82.130719C558.936086 73.246188 551.735982 66.046084 542.851451 66.046084L454.039169 66.046084C445.154638 66.046084 437.921507 73.246188 437.921507 82.130719L437.921507 161.89333C437.921507 177.317404 427.220436 190.759799 412.126642 194.095626 397.495239 197.398426 369.025106 205.490285 350.463372 214.407844 337.747594 220.518023 322.686828 217.94184 312.778429 208.000413L246.920604 142.142588C242.792104 138.047117 238.036073 137.419585 235.525945 137.419585 233.048845 137.419585 228.259786 138.047117 224.164314 142.142588L161.345065 204.928809C155.069746 211.237156 155.069746 221.409779 161.345065 227.718127L227.20289 293.575951C236.913121 303.286182 239.621417 317.950613 233.973629 330.468223 227.665282 344.505122 217.162379 372.810115 213.562327 391.834241 210.622836 407.423455 196.982273 418.71903 181.095807 418.71903L82.209986 418.71903C73.358483 418.71903 66.125352 425.952161 66.125352 434.803664L66.125352 523.648974C66.125352 532.500477 73.358483 539.733609 82.209986 539.733609L111.935183 539.733609C130.166637 539.733609 144.963179 554.497123 144.963179 572.761605 144.963179 591.026087 130.166637 605.789601 111.935183 605.789601L82.209986 605.789601C36.928603 605.789601 0.069359 568.930357 0.069359 523.648974L0.069359 434.803664C0.069359 389.522281 36.928603 352.663037 82.209986 352.663037L155.433054 352.663037C158.405573 342.820694 161.807457 333.176519 165.011173 324.75438L114.643478 274.419714C82.606322 242.382557 82.606322 190.264379 114.61045 158.227222L177.462727 95.441001C208.476016 64.394685 262.608902 64.394685 293.622191 95.441001L343.857773 145.643556C353.336808 142.10956 363.047039 139.004928 371.865514 136.395717L371.865514 82.130719C371.865514 36.849336 408.724758-0.009908 454.039169-0.009908L542.851451-0.009908C588.165862-0.009908 624.992078 36.849336 624.992078 82.130719L624.992078 135.834241C634.537169 138.542536 643.983176 141.713224 653.297071 145.41236L703.26843 95.441001C734.24869 64.394685 788.414605 64.394685 819.427893 95.441001L882.247142 158.227222C914.251271 190.264379 914.251271 242.382557 882.247142 274.419714L832.275784 324.391072C835.941891 333.704967 839.112579 343.150974 841.853903 352.663037L914.647607 352.663037C959.962018 352.663037 996.821262 389.522281 996.821262 434.803664L996.821262 523.648974C996.821262 568.930357 959.962018 605.789601 914.647607 605.789601L841.853903 605.789601C839.112579 615.301664 835.941891 624.747671 832.275784 634.094594L882.247142 684.032925C914.251271 716.070081 914.251271 768.18826 882.247142 800.225416L819.427893 863.011637C788.414605 894.057954 734.281718 894.057954 703.235402 863.011637L653.297071 813.040279C643.983176 816.739414 634.537169 819.910102 624.992078 822.618398L624.992078 914.56834C624.992078 959.849723 588.165862 996.708967 542.851451 996.708967" p-id="10632"></path></svg>
qqjf-Web/src/icons/svg/tab.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.921.052H49.08c-1.865 0-3.198 1.599-3.198 3.464v6.661c0 1.865 1.6 3.464 3.198 3.464h29.84c1.865 0 3.198-1.599 3.198-3.464V3.516C82.385 1.65 80.786.052 78.92.052zm45.563 0H94.642c-1.865 0-3.464 1.599-3.464 3.464v6.661c0 1.865 1.599 3.464 3.464 3.464h29.842c1.865-.266 3.464-1.599 3.464-3.464V3.516c0-1.865-1.599-3.464-3.464-3.464zm0 22.382H40.02c-1.866 0-3.464-1.599-3.464-3.464V3.516c0-1.865-1.599-3.464-3.464-3.464H3.516C1.65.052.052 1.651.052 3.516V124.75c0 1.598 1.599 3.197 3.464 3.197h120.968c1.865 0 3.464-1.599 3.464-3.464V25.898c0-1.865-1.599-3.464-3.464-3.464z"/></svg>
qqjf-Web/src/icons/svg/table.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/></svg>
qqjf-Web/src/icons/svg/theme.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M125.5 36.984L95.336 2.83C93.735 1.018 91.565 0 89.3 0c-2.263 0-4.433 1.018-6.033 2.83l-3.786 4.286c-1.6 1.812-3.77 2.83-6.032 2.831H54.553c-2.263 0-4.434-1.018-6.033-2.83L44.734 2.83C43.134 1.018 40.964 0 38.701 0c-2.263 0-4.434 1.018-6.034 2.83L2.5 36.984C.9 38.796 0 41.254 0 43.815c0 2.562.899 5.02 2.5 6.831L14.565 64.31c2.178 2.468 5.367 3.403 8.33 2.444 1.35-.435 2.709.592 2.709 2.18v49.407c0 5.313 3.84 9.66 8.532 9.66h59.726c4.693 0 8.532-4.347 8.532-9.66V68.934c0-1.59 1.36-2.616 2.71-2.181 2.962.96 6.15.024 8.329-2.444L125.5 50.646c1.6-1.811 2.499-4.269 2.499-6.83 0-2.563-.899-5.02-2.5-6.832z"/></svg>
qqjf-Web/src/icons/svg/trade.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1623139067675" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5837" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><defs><style type="text/css"></style></defs><path d="M908.629333 743.765333H257.877333c-19.285333 0-37.376-7.509333-50.858666-21.162666-13.482667-13.653333-20.992-31.573333-20.821334-50.858667l2.389334-479.232c0-19.114667-6.656-31.914667-39.765334-37.205333h-0.170666l-95.573334-16.384c-9.216-1.536-15.530667-10.410667-13.994666-19.626667 1.536-9.216 10.410667-15.530667 19.626666-13.994667l95.402667 16.384c45.397333 7.168 68.437333 31.061333 68.437333 70.997334L220.16 672.085333c0 10.069333 3.754667 19.456 10.922667 26.453334 7.168 7.168 16.554667 11.093333 26.624 11.093333h650.752c9.386667 0 17.066667 7.68 17.066666 17.066667s-7.509333 17.066667-16.896 17.066666z"  p-id="5838"></path><path d="M859.989333 645.802667l-602.624-1.877334c-18.944-0.170667-36.693333-7.509333-50.005333-20.992-13.312-13.482667-20.48-31.232-20.48-50.176l1.877333-353.962666L870.570667 269.653333c30.890667 1.194667 55.125333 26.282667 55.125333 57.173334V580.266667c0 36.181333-29.525333 65.536-65.706667 65.536zM257.706667 609.792l602.453333 1.877333c17.408 0 31.573333-14.165333 31.573333-31.402666V326.826667c0-12.458667-9.898667-22.698667-22.357333-23.04h-0.682667l-645.632-48.128-1.536 317.44c0 9.728 3.754667 18.944 10.581334 25.941333 6.485333 6.826667 15.701333 10.752 25.6 10.752z"  p-id="5839"></path><path d="M324.096 800.085333m-63.658667 0a63.658667 63.658667 0 1 0 127.317334 0 63.658667 63.658667 0 1 0-127.317334 0Z"  p-id="5840"></path><path d="M324.096 880.810667c-44.544 0-80.725333-36.181333-80.725333-80.725334s36.181333-80.725333 80.725333-80.725333c44.544 0 80.725333 36.181333 80.725333 80.725333s-36.181333 80.725333-80.725333 80.725334z m0-127.317334c-25.770667 0-46.592 20.821333-46.592 46.592s20.821333 46.592 46.592 46.592 46.592-20.821333 46.592-46.592-20.821333-46.592-46.592-46.592z"  p-id="5841"></path><path d="M812.714667 800.085333m-63.658667 0a63.658667 63.658667 0 1 0 127.317333 0 63.658667 63.658667 0 1 0-127.317333 0Z"  p-id="5842"></path><path d="M812.714667 880.810667c-44.544 0-80.725333-36.181333-80.725334-80.725334s36.181333-80.725333 80.725334-80.725333 80.725333 36.181333 80.725333 80.725333-36.181333 80.725333-80.725333 80.725334z m0-127.317334c-25.770667 0-46.592 20.821333-46.592 46.592s20.821333 46.592 46.592 46.592 46.592-20.821333 46.592-46.592-20.821333-46.592-46.592-46.592z"  p-id="5843"></path><path d="M710.314667 417.962667H362.496c-9.386667 0-17.066667-7.68-17.066667-17.066667s7.68-17.066667 17.066667-17.066667h347.818667c9.386667 0 17.066667 7.68 17.066666 17.066667s-7.68 17.066667-17.066666 17.066667zM710.314667 516.096H362.496c-9.386667 0-17.066667-7.68-17.066667-17.066667s7.68-17.066667 17.066667-17.066666h347.818667c9.386667 0 17.066667 7.68 17.066666 17.066666s-7.68 17.066667-17.066666 17.066667z"  p-id="5844"></path></svg>
qqjf-Web/src/icons/svg/tree-table.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M44.8 0h79.543C126.78 0 128 1.422 128 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H44.8c-2.438 0-3.657-1.422-3.657-4.267V4.267C41.143 1.422 42.362 0 44.8 0zm22.857 48h56.686c2.438 0 3.657 1.422 3.657 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H67.657C65.22 80 64 78.578 64 75.733V52.267C64 49.422 65.219 48 67.657 48zm0 48h56.686c2.438 0 3.657 1.422 3.657 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H67.657C65.22 128 64 126.578 64 123.733v-23.466C64 97.422 65.219 96 67.657 96zM50.286 68.267c2.02 0 3.657-1.91 3.657-4.267 0-2.356-1.638-4.267-3.657-4.267H17.37V32h6.4c2.02 0 3.658-1.91 3.658-4.267V4.267C27.429 1.91 25.79 0 23.77 0H3.657C1.637 0 0 1.91 0 4.267v23.466C0 30.09 1.637 32 3.657 32h6.4v80c0 2.356 1.638 4.267 3.657 4.267h36.572c2.02 0 3.657-1.91 3.657-4.267 0-2.356-1.638-4.267-3.657-4.267H17.37V68.267h32.915z"/></svg>
qqjf-Web/src/icons/svg/tree.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M126.713 90.023c.858.985 1.287 2.134 1.287 3.447v29.553c0 1.423-.429 2.6-1.287 3.53-.858.93-1.907 1.395-3.146 1.395H97.824c-1.145 0-2.146-.465-3.004-1.395-.858-.93-1.287-2.107-1.287-3.53V93.47c0-.875.19-1.696.572-2.462.382-.766.906-1.368 1.573-1.806a3.84 3.84 0 0 1 2.146-.657h9.725V69.007a3.84 3.84 0 0 0-.43-1.806 3.569 3.569 0 0 0-1.143-1.313 2.714 2.714 0 0 0-1.573-.492h-36.47v23.149h9.725c1.144 0 2.145.492 3.004 1.478.858.985 1.287 2.134 1.287 3.447v29.553c0 .876-.191 1.696-.573 2.463-.38.766-.905 1.368-1.573 1.806a3.84 3.84 0 0 1-2.145.656H51.915a3.84 3.84 0 0 1-2.145-.656c-.668-.438-1.216-1.04-1.645-1.806a4.96 4.96 0 0 1-.644-2.463V93.47c0-1.313.43-2.462 1.288-3.447.858-.986 1.907-1.478 3.146-1.478h9.582v-23.15h-37.9c-.953 0-1.74.356-2.359 1.068-.62.711-.93 1.56-.93 2.544v19.538h9.726c1.239 0 2.264.492 3.074 1.478.81.985 1.216 2.134 1.216 3.447v29.553c0 1.423-.405 2.6-1.216 3.53-.81.93-1.835 1.395-3.074 1.395H4.29c-.476 0-.93-.082-1.358-.246a4.1 4.1 0 0 1-1.144-.657 4.658 4.658 0 0 1-.93-1.067 5.186 5.186 0 0 1-.643-1.395 5.566 5.566 0 0 1-.215-1.56V93.47c0-.437.048-.875.143-1.313a3.95 3.95 0 0 1 .429-1.15c.19-.328.429-.656.715-.984.286-.329.572-.602.858-.821.286-.22.62-.383 1.001-.493.382-.11.763-.164 1.144-.164h9.726V61.619c0-.985.31-1.833.93-2.544.619-.712 1.358-1.068 2.216-1.068h44.335V39.62h-9.582c-1.24 0-2.288-.492-3.146-1.477a5.09 5.09 0 0 1-1.287-3.448V5.14c0-1.423.429-2.627 1.287-3.612.858-.985 1.907-1.477 3.146-1.477h25.743c.763 0 1.478.246 2.145.739a5.17 5.17 0 0 1 1.573 1.888c.382.766.573 1.587.573 2.462v29.553c0 1.313-.43 2.463-1.287 3.448-.859.985-1.86 1.477-3.004 1.477h-9.725v18.389h42.762c.954 0 1.74.355 2.36 1.067.62.711.93 1.56.93 2.545v26.925h9.582c1.239 0 2.288.492 3.146 1.478z"/></svg>
qqjf-Web/src/icons/svg/user.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>
qqjf-Web/src/icons/svg/wechat.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="110" xmlns="http://www.w3.org/2000/svg"><path d="M86.635 33.334c1.467 0 2.917.113 4.358.283C87.078 14.392 67.58.111 45.321.111 20.44.111.055 17.987.055 40.687c0 13.104 6.781 23.863 18.115 32.209l-4.527 14.352 15.82-8.364c5.666 1.182 10.207 2.395 15.858 2.395 1.42 0 2.829-.073 4.227-.189-.886-3.19-1.398-6.53-1.398-9.996 0-20.845 16.98-37.76 38.485-37.76zm-24.34-12.936c3.407 0 5.665 2.363 5.665 5.954 0 3.576-2.258 5.97-5.666 5.97-3.392 0-6.795-2.395-6.795-5.97 0-3.591 3.403-5.954 6.795-5.954zM30.616 32.323c-3.393 0-6.818-2.395-6.818-5.971 0-3.591 3.425-5.954 6.818-5.954 3.392 0 5.65 2.363 5.65 5.954 0 3.576-2.258 5.97-5.65 5.97z"/><path d="M127.945 70.52c0-19.075-18.108-34.623-38.448-34.623-21.537 0-38.5 15.548-38.5 34.623 0 19.108 16.963 34.622 38.5 34.622 4.508 0 9.058-1.2 13.584-2.395l12.414 7.167-3.404-11.923c9.087-7.184 15.854-16.712 15.854-27.471zm-50.928-5.97c-2.254 0-4.53-2.362-4.53-4.773 0-2.378 2.276-4.771 4.53-4.771 3.422 0 5.665 2.393 5.665 4.771 0 2.41-2.243 4.773-5.665 4.773zm24.897 0c-2.24 0-4.498-2.362-4.498-4.773 0-2.378 2.258-4.771 4.498-4.771 3.392 0 5.665 2.393 5.665 4.771 0 2.41-2.273 4.773-5.665 4.773z"/></svg>
qqjf-Web/src/icons/svg/zip.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.527 116.793c.178.008.348.024.527.024h40.233c4.711-.005 8.53-3.677 8.534-8.21V18.895c-.004-4.532-3.823-8.204-8.534-8.209H79.054c-.179 0-.353.016-.527.024V0L0 10.082v107.406l78.527 10.342v-11.037zm0-101.362c.174-.024.348-.052.527-.052h40.233c2.018 0 3.659 1.578 3.659 3.52v89.713c-.003 1.942-1.64 3.517-3.659 3.519H79.054c-.179 0-.353-.028-.527-.052V15.431zM30.262 75.757l-18.721-.46V72.37l11.3-16.673v-.148l-10.266.164v-4.51l17.504-.44v3.264L18.696 70.76v.144l11.566.176v4.678zm9.419.231l-5.823-.144V50.671l5.823-.144v25.461zm22.255-11.632c-2.168 1.922-5.353 2.76-9.02 2.736-.702.004-1.402-.04-2.097-.131v9.303l-5.997-.148V50.743c1.852-.352 4.473-.647 8.218-.743 3.838-.096 6.608.539 8.48 1.913 1.807 1.306 3.032 3.5 3.032 6.112s-.926 4.833-2.612 6.331h-.004zM53.36 54.45c-.856-.01-1.71.083-2.541.275v7.682c.523.116 1.167.152 2.06.152 3.301-.004 5.36-1.614 5.36-4.314 0-2.425-1.772-3.843-4.875-3.791l-.004-.004zm39.847-37.066h9.564v3.795h-9.564v-3.795zm-9.568 5.68h9.564v3.8h-9.564v-3.8zm9.568 6.216h9.564v3.799h-9.564V29.28zm0 12h9.564v3.794h-9.564V41.28zm-9.568-6.096h9.564v3.795h-9.564v-3.795zm9.472 47.064c2.512 0 4.921-.96 6.697-2.67 1.776-1.708 2.773-4.026 2.772-6.442l-1.748-15.263c0-5.033-2.492-9.112-7.725-9.112-5.232 0-7.72 4.079-7.72 9.112l-1.752 15.263c-.001 2.417.996 4.735 2.773 6.444 1.777 1.71 4.187 2.669 6.7 2.668h.003zm-3.135-16.75h6.27v12.743h-6.27V65.5z"/></svg>
qqjf-Web/src/main.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import Element from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import '@/styles/index.scss';
import './icons';
import './permission'; // è·¯ç”±å¯¼èˆªå®ˆå«
/**
 * è§£å†³è·¯ç”±åœ°å€æŠ¥é”™ä½†æ­£å¸¸è¿è¡Œ
 * æ­¤å¤„理方案只针对于vue-router 3.0以上版本
 */
import Router from 'vue-router';
const originalPush = Router.prototype.push;
Router.prototype.push = function push(location) {
  return originalPush.call(this, location).catch(err => err);
};
// import $ from "jquery";
Vue.config.productionTip = false;
Vue.use(Element);
//加载动画
import Vab from './utils/vab';
Vue.use(Vab);
// Vue.use(Element, {
//   size: Cookies.get('size') || 'medium', // set element-ui default size
//   locale: enLang // å¦‚果使用中文,无需设置,请删除
// })
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app');
qqjf-Web/src/mixins/layout.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
import store from '@/store';
const { body } = document;
const WIDTH = 992;
export default {
  beforeMount() {
    window.addEventListener('resize', this.$_resizeHandler);
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.$_resizeHandler);
  },
  mounted() {
    const isMobile = this.$_isMobile();
    if (isMobile) {
      store.dispatch('setting/togglesidebar', false);
    }
  },
  methods: {
    $_isMobile() {
      const rect = body.getBoundingClientRect();
      return rect.width - 1 < WIDTH;
    },
    $_resizeHandler() {
      const isMobile = this.$_isMobile();
      if (isMobile) {
        store.dispatch('setting/togglesidebar', false);
      }
    }
  }
};
qqjf-Web/src/mixins/resize.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
import {
  debounce
} from '@/utils/debounce';
export default {
  data() {
    return {
      myChart: null,
      resizeHandler: null
    };
  },
  computed: {
    open() {
      console.log(this.$store.state.setting.opened);
      return this.$store.state.setting.opened;
    }
  },
  mounted() {
    this.resizeHandler = debounce(() => {
      if (this.myChart) {
        this.myChart.resize();
      }
    }, 100);
    this.initResizeEvent();
  },
  methods: {
    //监听resize
    initResizeEvent() {
      window.addEventListener('resize', this.resizeHandler);
    },
    //移除resize
    destroyResizeEvent() {
      window.removeEventListener('resize', this.resizeHandler);
    }
  },
  beforeDestroy() {
    this.destroyResizeEvent();
    if (!this.myChart) {
      return;
    }
    this.myChart.dispose();
    this.myChart.off('click');
    this.myChart = null;
  },
  activated() {
    this.initResizeEvent();
    if (this.myChart) {
      this.myChart.resize();
    }
  },
  deactivated() {
    this.destroyResizeEvent();
  },
  watch: {
    open() {
      if (this.myChart) {
        console.log(123);
        this.myChart.resize();
      }
    }
  }
};
qqjf-Web/src/permission.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,134 @@
import router from './router';
import store from './store';
import qs from 'qs';
import axios from '@/utils/axios';
import {
  asyncRoutes,
  baseRoute
} from '@/router';
import NProgress from 'nprogress'; // progress bar
import 'nprogress/nprogress.css'; // progress bar style
import {
  getCache,
  setCache
} from '@/utils/sessionStorage';
import getPageTitle from '@/utils/getPageTitle';
const _import = require('./router/_import_production'); // èŽ·å–ç»„ä»¶çš„æ–¹æ³•
const _mainImport = require('./router/_import_development');
import Layout from '@/Layout';
let getRouter = ''; // ç”¨æ¥èŽ·å–åŽå°æ‹¿åˆ°çš„è·¯ç”±
NProgress.configure({
  showSpinner: false
}); // NProgress Configuration
let _this = this;
router.beforeEach(async (to, from, next) => {
  document.title = to.meta.title + ' - æ™ºèƒ½åŒ–立体库管理系统';
  NProgress.start();
  const isLogin = getCache('userInfo');
  if (to.path == '/Login') {
    getRouter = '';
    next();
  } else {
    if (!JSON.stringify(isLogin)) {
      getRouter = '';
      next('/Login');
      NProgress.done();
    } else {
      if (store.state.permission.addRoutes.length > 0) {
        NProgress.done();
        next();
      } else {
        axios
          .post(
            '/Permission/GetUserRolePermission',
            qs.stringify({
              roleName: isLogin.roleName,
              type: 1
            })
          )
          .then(res => {
            if (res.code == 0) {
              let data = res.data || [];
              let Didproject = null;
              data.filter((item, index) => {
                if (item.name == 'Didproject') {
                  Didproject = item;
                  Didproject.meta.affix = true;
                  return data.splice(index, 1);
                }
              });
              data.unshift(Didproject);
              let baserouter = routerchildren(res.data);
              let layer = [{
                path: '/',
                redirect: '/Didproject',
                children: baserouter
              }];
              getRouter = layer;
              routerGo(to, next); // æ‰§è¡Œè·¯ç”±è·³è½¬æ–¹æ³•
            }
          });
      }
    }
  }
});
// router.
//过滤路由中的children
function routerchildren(basrouter) {
  basrouter.filter(item => {
    if (item.children == null) {
      delete item.children;
    } else if (item.children.length > 0) {
      routerchildren(item.children);
    }
    return true;
  });
  return basrouter;
}
function routerGo(to, next) {
  getRouter = filterAsyncRouter(getRouter); // è¿‡æ»¤è·¯ç”±
  console.log(getRouter);
  setCache('baserouter', getRouter);
  console.log(getRouter);
  global.addRoutes = getRouter; // å°†è·¯ç”±æ•°æ®ä¼ é€’给全局变量,做侧边栏菜单渲染工作
  store.dispatch('permission/generateRoutes', getRouter);
  router.addRoutes(getRouter); // åŠ¨æ€æ·»åŠ è·¯ç”±
  next({
    ...to,
    replace: true
  });
}
function filterAsyncRouter(asyncRouterMap) {
  // éåŽ†åŽå°ä¼ æ¥çš„è·¯ç”±å­—ç¬¦ä¸²ï¼Œè½¬æ¢ä¸ºç»„ä»¶å¯¹è±¡
  asyncRouterMap.forEach(route => {
    if (route.path) {
      if (route.path == '/') {
        route.component = _mainImport('Layout');
      } else {
        route.component = _import(route.path);
      }
    } else {
      route.path = '/test';
    }
    if (route.children && route.children.length > 0) {
      route.children = filterAsyncRouter(route.children);
    }
  });
  return asyncRouterMap;
}
router.afterEach(() => {
  // finish progress bar
  NProgress.done();
});
qqjf-Web/src/plugins/cdn.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
const VueCDN = 'https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js';
const AxiosCDN = 'https://cdn.bootcdn.net/ajax/libs/axios/0.21.0/axios.min.js';
const VueRouterCDN = 'https://cdn.bootcdn.net/ajax/libs/vue-router/3.2.0/vue-router.min.js';
const VuexCDN = 'https://cdn.bootcdn.net/ajax/libs/vuex/3.5.1/vuex.min.js';
module.exports = {
  VueCDN,
  AxiosCDN,
  VueRouterCDN,
  VuexCDN
};
qqjf-Web/src/plugins/mapServer.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
// const salineLand = 'http://59.110.28.240:6080/arcgis/rest/services/YJD/YBSFQDK_2018_1_1/MapServer';
module.exports = {
  // salineLand
};
qqjf-Web/src/router/_import_development.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
// module.exports = file => () => import('@' + file )
module.exports = file => () => import(/* webpackChunkName: "chunkName" */  `@/${file}` )
qqjf-Web/src/router/_import_production.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
// module.exports = file => () => import('@/views' + file + '/index.vue')
module.exports = file => () => import(/* webpackChunkName: "chunkName" */  `@/views${file}/index.vue`)
qqjf-Web/src/router/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,140 @@
import Vue from 'vue';
import VueRouter from 'vue-router';
import BasRoute from './modules/base';
import Layout from '@/Layout';
Vue.use(VueRouter);
export const baseRoute = [{
    name: 'login',
    path: '/login',
    meta: {
      title: '登录'
    },
    component: () => import('@/views/login/index')
  },
  {
    name: 'home',
    path: '/home',
    component: () => import('@/views/Home/index')
  },
  {
    name: 'taskbeat',
    path: '/taskbeat',
    meta: {
      title: '任务节拍'
    },
    component: () => import('@/views/dataview/taskbeat.vue')
  },
  {
    name: 'classified',
    path: '/classified',
    meta: {
      title: '分类统计'
    },
    component: () => import('@/views/dataview/classified.vue')
  },
  {
    name: 'movablerate',
    path: '/movablerate',
    meta: {
      title: '设备可动'
    },
    component: () => import('@/views/dataview/movablerate.vue')
  },
  {
    name: 'product',
    path: '/product',
    meta: {
      title: '在制品资金'
    },
    component: () => import('@/views/dataview/product.vue')
  },
  {
    name: 'rateequipment',
    path: '/rateequipment',
    meta: {
      title: '设备利用率'
    },
    component: () => import('@/views/dataview/rateequipment.vue')
  },
  {
    name: 'tasktime',
    path: '/tasktime',
    meta: {
      title: '平均时长'
    },
    component: () => import('@/views/dataview/tasktime.vue')
  },
  {
    name: 'turnover',
    path: '/turnover',
    meta: {
      title: '制件周转'
    },
    component: () => import('@/views/dataview/turnover.vue')
  },
  {
    name: 'warehouse',
    path: '/warehouse',
    meta: {
      title: '货格利用率'
    },
    component: () => import('@/views/dataview/warehouse.vue')
  },
  {
    name: 'statelibrary',
    path: '/statelibrary',
    meta: {
      title: '立库总览'
    },
    component: () => import('@/views/dataview/statelibrary.vue')
  },
  {
    name: 'workpiece',
    path: '/workpiece',
    meta: {
      title: '制件总览'
    },
    component: () => import('@/views/dataview/workpiece.vue')
  },
  {
    name: 'output',
    path: '/output',
    meta: {
      title: '零件出入库'
    },
    component: () => import('@/views/dataview/output.vue')
  }
];
export const asyncRoutes = [{
  path: '/',
  component: Layout,
  redirect: '/Didproject',
  children: BasRoute
}];
// const router = new VueRouter({
//   // base: process.env.BASE_URL,
//   routes:baseRoute
// });
// const router = new VueRouter({
//   // base: process.env.BASE_URL,
//   routes:baseRoute
// });
const createRouter = function () {
  return new VueRouter({
    routes: baseRoute
  });
};
const router = createRouter();
export function resetRouter() {
  router.matcher = createRouter().matcher;
}
//重定向时报错,用这个不让他报错
const originalPush = VueRouter.prototype.push;
VueRouter.prototype.push = function push(location, onResolve, onReject) {
  if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject);
  return originalPush.call(this, location).catch(err => err);
};
export default router;
qqjf-Web/src/router/modules/base.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,379 @@
import { role } from '@/components/tableContainer/tableHead'
const baseRoute=[
    {
        path:'/Didproject',
        name:'Didproject',
        meta:{
            title:'首页',
            icon:'homePage',
            roles: [],
            affix: true
        },
        component:()=>import('@/views/Didproject/index')
    },
    {
        path: '/inbound',
        name: 'inbound',
        meta: {
            title: '入库',
            icon: 'inbound',
            roles:[]
        },
        component: () => import('@/views/inbound/index'),
        children: [
            {
                path: '/inbound/purchase',
                name: 'purchase',
                meta: {
                    title: '入库管理',
                    icon: '',
                    roles:[]
                },
                component: () => import('@/views/inbound/purchase/index'),
                children: [
                    {
                        path: '/inbound/purchase/quotation',
                        name: 'quotation',
                        meta: {
                            title: '冲压生产计划',
                            icon: '',
                            roles:[]
                        },
                        component: () => import('@/views/inbound/purchase/quotation/index'),
                    },
                    {
                        path: '/inbound/purchase/enter',
                        name: 'enter',
                        meta: {
                            title: '组盘入库',
                            icon: '',
                            roles:[]
                        },
                        component: () => import('@/views/inbound/purchase/enter/index'),
                    },
                    {
                        path: '/inbound/purchase/intype',
                        name: 'intype',
                        meta: {
                            title: '入库类型',
                            icon: '',
                            roles:[]
                        },
                        component: () => import('@/views/inbound/purchase/intype/index'),
                    },
                ]
            }
        ]
    },
    {
        path: '/outbound',
        name: 'outbound',
        meta: {
            title: '出库',
            icon: 'inbound',
            roles:[]
        },
        component: () => import('@/views/outbound/index'),
        children: [
            {
                path: '/outbound/regulator',
                name: 'regulator',
                meta: {
                    title: '出库管理',
                    icon: '',
                    roles:[]
                },
                component: () => import('@/views/outbound/regulator/index'),
                children: [
                    {
                        path: '/outbound/regulator/plant',
                        name: 'plant',
                        meta: {
                            title: '出库计划',
                            icon: '',
                            roles:[]
                        },
                        component: () => import('@/views/outbound/regulator/plant/index'),
                    }
                ]
            }
        ]
    },
    {
        path:'/task',
        name:'task',
        meta:{
            title:'任务',
            icon:'storage',
            roles: [],
        },
        component: () => import('@/views/task/index'),
        children: [
            {
                path:'/task/maintask',
                name:'maintask',
                meta:{
                    title:'主任务',
                    icon:'',
                    roles: []
                },
                component: () => import('@/views/task/maintask/index'),
            },
            {
                path: '/task/forklifttasks',
                name:'forklifttasks',
                meta:{
                    title:'叉车任务',
                    icon:'',
                    roles: [],
                },
                component:()=>import('@/views/task/forklifttasks/index')
          },
            {
                path: '/task/taskrecord',
                name:'taskrecord',
                meta:{
                    title:'任务记录',
                    icon:'',
                    roles: [],
                },
                component:()=>import('@/views/task/taskrecord/index')
            },
            {
                path: '/task/taskdocuments',
                name:'taskdocuments',
                meta:{
                    title:'任务单据',
                    icon:'',
                    roles: [],
                },
                component:()=>import('@/views/task/taskdocuments/index')
            },
        ]
    },
    {
        path:'/storage',
        name:'storage',
        meta:{
            title:'仓储',
            icon:'storage',
            roles:[]
        },
        component: () => import('@/views/storage/index'),
        children: [
            {
                path:'/storage/setting',
                name:'user',
                meta:{
                    title:'基础设置',
                    icon:'',
                    roles:[]
                },
                component: () => import('@/views/storage/setting/index'),
                children: [
                    {
                        path:'/storage/setting/position',
                        name:'position',
                        meta:{
                            title:'库位管理',
                            icon:'',
                            roles:[]
                        },
                        component: () => import('@/views/storage/setting/position/index'),
                    },
                    {
                        path:'/storage/setting/palte',
                        name:'palte',
                        meta:{
                            title:'器具管理',
                            icon:'',
                            roles:[]
                        },
                        component: () => import('@/views/storage/setting/palte/index'),
                    },
                    // {
                    //     path:'/storage/setting/storage-area',
                    //     name:'storage-area',
                    //     meta:{
                    //         title:'库区管理',
                    //         icon:'',
                    //         roles:[]
                    //     },
                    //     component: () => import('@/views/storage/setting/storage-area/index'),
                    // },
                    {
                        path:'/storage/setting/choose',
                        name:'choose',
                        meta:{
                            title:'零件管理',
                            icon:'',
                            roles:[]
                        },
                        component: () => import('@/views/storage/setting/choose/index'),
                    },
                    {
                        path:'/storage/setting/cass-line',
                        name:'cass-line',
                        meta:{
                            title:'班线管理',
                            icon:'',
                            roles:[]
                        },
                        component: () => import('@/views/storage/setting/cass-line/index'),
                    },
                    {
                        path:'/storage/setting/forklift',
                        name:'forklift',
                        meta:{
                            title:'叉车管理',
                            icon:'',
                            roles:[]
                        },
                        component: () => import('@/views/storage/setting/forklift/index'),
                    },
                ]
            },
            {
                path:'/storage/base',
                name:'base',
                meta:{
                    title:'库存状况',
                    icon:'',
                    roles:[]
                },
                component: () => import('@/views/storage/base/index'),
                children: [
                    {
                        path:'/storage/base/inventory',
                        name:'inventory',
                        meta:{
                            title:'库存管理',
                            icon:'',
                            roles:[]
                        },
                        component: () => import('@/views/storage/base/inventory/index'),
                    }
                ]
            }
        ]
    },
    {
        path: '/basicInfo',
        name: 'basicInfo',
        meta: {
            title: "设备",
            icon:'storage',
            roles:[]
        },
        component: () => import('@/views/basicInfo/index'),
        children: [
            {
                path: '/basicInfo/base',
                name: 'base',
                meta: {
                    title: '设备管理',
                    roles:[]
                },
                component: () => import('@/views/basicInfo/base/index'),
                children: [
                    {
                        path: '/basicInfo/base/stacker',
                        name: 'stacker',
                        meta: {
                            title: '设备',
                            roles:[]
                        },
                        component: () => import('@/views/basicInfo/base/stacker/index')
                    },
                    {
                        path: '/basicInfo/base/warning',
                        name: 'warning',
                        meta: {
                            title: '报警信息',
                            roles:[]
                        },
                        component: () => import('@/views/basicInfo/base/warning/index')
                    }
                ]
            }
        ]
    },
    {
        path:'/System',
        name:'System',
        meta:{
            title:'系统',
            icon:'sys',
            roles:[]
        },
        component: () => import('@/views/system/index'),
        children: [
            {
                path:'/System/user',
                name:'user',
                meta:{
                    title:'用户及权限',
                    icon:'',
                    roles:[]
                },
                component: () => import('@/views/system/user/index'),
                children: [
                    {
                        path:'/System/user/manage',
                        name:'manage',
                        meta:{
                            title:'用户管理',
                            icon:'',
                            roles:[]
                        },
                        component: () => import('@/views/system/user/manage/index'),
                    },
                    {
                        path:'/System/user/dept',
                        name:'dept',
                        meta:{
                            title:'部门管理',
                            icon:'',
                            roles:[]
                        },
                        component: () => import('@/views/system/user/dept/index'),
                    },
                    {
                        path:'/System/user/role',
                        name:'role',
                        meta:{
                            title:'角色管理',
                            icon:'',
                            roles:[]
                        },
                        component: () => import('@/views/system/user/role/index'),
                    },
                    {
                        path:'/System/user/roleAuth',
                        name:'roleAuth',
                        meta:{
                            title:'角色权限设置',
                            icon:'',
                            roles:[]
                        },
                        component: () => import('@/views/system/user/roleAuth/index'),
                    },
                ]
            }
        ]
    },
]
export default baseRoute
qqjf-Web/src/settings.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
/*
 * @Author       : gy
 * @Date         : 2020-06-27 20:27:39
 * @LastEditors  : gy
 * @LastEditTime : 2020-06-27 20:49:59
 * @FilePath     : /code/src/settings.js
 * @Description  : é¡µé¢æè¿°
 */
module.exports = {
  title: '智能化立体库管理系统',
  /**
   * @type {boolean} true | false
   * @description Whether show the settings right-panel
   */
  showSettings: false,
  /**
   * @type {boolean} true | false
   * @description Whether need tagsView
   */
  tagsView: false,
  /**
   * @type {boolean} true | false
   * @description Whether fix the header
   */
  fixedHeader: false,
  /**
   * @type {boolean} true | false
   * @description Whether show the logo in sidebar
   */
  sidebarLogo: false,
  /**
   * @type {string | array} 'production' | ['production', 'development']
   * @description Need show err logs component.
   * The default is only used in the production env
   * If you want to also use it in dev, you can pass ['production', 'development']
   */
  errorLog: 'production'
}
qqjf-Web/src/store/getters.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
const getters = {
    token: state => state.user.token,
    sidebar: state => state.setting.opened,
    visitedViews: state => state.tagsView.visitedViews,
    cachedViews: state => state.tagsView.cachedViews,
}
export default getters
qqjf-Web/src/store/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
import Vue from "vue";
import Vuex from "vuex";
import getters from './getters'
Vue.use(Vuex);
// https://webpack.js.org/guides/dependency-management/#requirecontext
const modulesFiles = require.context('./modules', true, /\.js$/)
// you do not need `import app from './modules/app'`
// it will auto require all vuex module from modules file
const modules = modulesFiles.keys().reduce((modules, modulePath) => {
  // set './app.js' => 'app'
  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
  const value = modulesFiles(modulePath)
  modules[moduleName] = value.default
  return modules
}, {})
const store = new Vuex.Store({
  modules,
  getters
})
export default store
qqjf-Web/src/store/modules/permission.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
import { asyncRoutes, baseRoute } from '@/router'
import { getCache,setCache } from '@/utils/sessionStorage';
function hasPermission(roles, route) {
  if (route.meta && route.meta.roles) {
    return roles.some(role => route.meta.roles.includes(role))
  } else {
    return true
  }
}
export function filterAsyncRoutes(routes, roles) {
  const res = []
  routes.forEach(route => {
    const tmp = { ...route }
    if (hasPermission(roles, tmp)) {
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, roles)
      }
      res.push(tmp)
    }
  })
  return res
}
const state = {
  routes: [],
  addRoutes: []
}
const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    state.routes = baseRoute.concat(routes)
  }
}
const actions = {
  generateRoutes({ commit }, roles) {
      commit('SET_ROUTES', roles)
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
qqjf-Web/src/store/modules/setting.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
import {getCache,setCache} from '@/utils/sessionStorage'
const state ={
    opened:getCache('SIDEBAR_OPENED')?JSON.parse(getCache('SIDEBAR_OPENED')):false
}
const mutations={
    TOGGLE_SIDEBAR:state=>{
        state.opened =!state.opened
        setCache('SIDEBAR_OPENED',state.opened)
    }
}
const actions={
    togglesidebar({ commit }) {
        commit('TOGGLE_SIDEBAR')
    }
}
export default{
    namespaced: true,
    state,
    mutations,
    actions
}
qqjf-Web/src/store/modules/tagsView.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,195 @@
const state = {
  visitedViews: [],
  cachedViews: []
};
const mutations = {
  ADD_VISITED_VIEW: (state, view) => {
    if (state.visitedViews.some(v => v.path === view.path)) return;
    state.visitedViews.push(
      Object.assign({}, view, {
        title: view.meta.title || 'no-name'
      })
    );
  },
  ADD_CACHED_VIEW: (state, view) => {
    if (state.cachedViews.includes(view.name)) return;
    if (!view.meta.noCache) {
      state.cachedViews.push(view.name);
    }
  },
  DEL_VISITED_VIEW: (state, view) => {
    for (const [i, v] of state.visitedViews.entries()) {
      if (v.path === view.path) {
        state.visitedViews.splice(i, 1);
        break;
      }
    }
  },
  DEL_CACHED_VIEW: (state, view) => {
    const index = state.cachedViews.indexOf(view.name);
    index > -1 && state.cachedViews.splice(index, 1);
  },
  DEL_OTHERS_VISITED_VIEWS: (state, view) => {
    state.visitedViews = state.visitedViews.filter(v => {
      return v.meta.affix || v.path === view.path;
    });
  },
  DEL_OTHERS_CACHED_VIEWS: (state, view) => {
    const index = state.cachedViews.indexOf(view.name);
    if (index > -1) {
      state.cachedViews = state.cachedViews.slice(index, index + 1);
    } else {
      // if index = -1, there is no cached tags
      state.cachedViews = [];
    }
  },
  DEL_ALL_VISITED_VIEWS: state => {
    // keep affix tags
    const affixTags = state.visitedViews.filter(tag => tag.meta.affix);
    state.visitedViews = affixTags;
  },
  DEL_ALL_CACHED_VIEWS: state => {
    state.cachedViews = [];
  },
  UPDATE_VISITED_VIEW: (state, view) => {
    for (let v of state.visitedViews) {
      if (v.path === view.path) {
        v = Object.assign(v, view);
        break;
      }
    }
  }
};
const actions = {
  addView({
    dispatch
  }, view) {
    dispatch('addVisitedView', view);
    dispatch('addCachedView', view);
  },
  addVisitedView({
    commit
  }, view) {
    commit('ADD_VISITED_VIEW', view);
  },
  addCachedView({
    commit
  }, view) {
    commit('ADD_CACHED_VIEW', view);
  },
  delView({
    dispatch,
    state
  }, view) {
    return new Promise(resolve => {
      dispatch('delVisitedView', view);
      dispatch('delCachedView', view);
      resolve({
        visitedViews: [...state.visitedViews],
        cachedViews: [...state.cachedViews]
      });
    });
  },
  delVisitedView({
    commit,
    state
  }, view) {
    return new Promise(resolve => {
      commit('DEL_VISITED_VIEW', view);
      resolve([...state.visitedViews]);
    });
  },
  delCachedView({
    commit,
    state
  }, view) {
    return new Promise(resolve => {
      commit('DEL_CACHED_VIEW', view);
      resolve([...state.cachedViews]);
    });
  },
  delOthersViews({
    dispatch,
    state
  }, view) {
    return new Promise(resolve => {
      dispatch('delOthersVisitedViews', view);
      dispatch('delOthersCachedViews', view);
      resolve({
        visitedViews: [...state.visitedViews],
        cachedViews: [...state.cachedViews]
      });
    });
  },
  delOthersVisitedViews({
    commit,
    state
  }, view) {
    return new Promise(resolve => {
      commit('DEL_OTHERS_VISITED_VIEWS', view);
      resolve([...state.visitedViews]);
    });
  },
  delOthersCachedViews({
    commit,
    state
  }, view) {
    return new Promise(resolve => {
      commit('DEL_OTHERS_CACHED_VIEWS', view);
      resolve([...state.cachedViews]);
    });
  },
  delAllViews({
    dispatch,
    state
  }, view) {
    return new Promise(resolve => {
      dispatch('delAllVisitedViews', view);
      dispatch('delAllCachedViews', view);
      resolve({
        visitedViews: [...state.visitedViews],
        cachedViews: [...state.cachedViews]
      });
    });
  },
  delAllVisitedViews({
    commit,
    state
  }) {
    return new Promise(resolve => {
      commit('DEL_ALL_VISITED_VIEWS');
      resolve([...state.visitedViews]);
    });
  },
  delAllCachedViews({
    commit,
    state
  }) {
    return new Promise(resolve => {
      commit('DEL_ALL_CACHED_VIEWS');
      resolve([...state.cachedViews]);
    });
  },
  updateVisitedView({
    commit
  }, view) {
    commit('UPDATE_VISITED_VIEW', view);
  }
};
export default {
  namespaced: true,
  state,
  mutations,
  actions
};
qqjf-Web/src/store/modules/user.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
import { login } from '@/api/register'
import {resetRouter } from '@/router';
import { getCache, setCache, removeAll } from '@/utils/sessionStorage'
// import { reject, resolve } from 'core-js/fn/promise'
import baserouter from '@/router/modules/base'
const state = {
    token: getCache(),
    name: '',
    avatar: '',
    introduction: '',
    roles: []
}
const mutations={
    SET_TOKEN: (state, token) => {
        state.token = token
    },
}
const actions={
    login({},userInfo){
        const {username,password}=userInfo
        return new Promise((resolve, reject) => {
            login({ userName: username, password: password }).then(res=>{
                // setCache('baserouter',baserouter)
                resolve(res)
            })
        })
    },
    logout(){
        return new Promise((resolve,reject)=>{
            removeAll()
            resetRouter();
            resolve()
        })
    }
}
export default {
    namespaced: true,
    state,
    mutations,
    actions
}
qqjf-Web/src/styles/elemen-ui.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
.el-menu {
    // background-color: unset !important;
    border-right: unset !important;
}
qqjf-Web/src/styles/index.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,705 @@
@import './variables.scss';
@import './sidebar.scss';
@import './elemen-ui.scss';
@import './transition.scss';
@import './innner-circles.scss';
body {
  height: 100%;
  margin: 0;
  -moz-osx-font-smoothing: grayscale;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
  overflow: hidden;
}
html {
  height: 100%;
  box-sizing: border-box;
}
#app {
  height: 100%;
}
@font-face {
  font-family: time_new_Roma;
  src: url(../assets//css/TimesNewRomanPSMT24163565.ttf);
}
p {
  margin: 0;
  padding: 0;
}
.height {
  height: 100%;
}
.height80px {
  height: 90px;
}
.height97 {
  height: 97%
}
.height99 {
  height: 99%;
}
.height94 {
  height: 94%;
}
.height92 {
  height: 92%;
}
.height82 {
  height: 82%;
}
.height74 {
  height: 74%;
}
.height57 {
  height: 57%;
}
.height65 {
  height: 65%;
}
.height30 {
  height: 30%;
}
.height45 {
  height: 45%;
}
.height48 {
  height: 48%;
}
.height250 {
  height: 250px;
}
.height-calc {
  height: calc(100% - 65px);
}
.height-calc55 {
  height: calc(100% - 55px);
}
.height-calc40 {
  height: calc(100% - 40px);
}
.applyheight {
  height: calc(100% - 120px);
}
.height-calc90 {
  height: calc(100% - 100px);
}
.height-calc190 {
  height: calc(100% - 190px);
}
.height-calc280 {
  height: calc(100% - 280px);
}
.height-calc300 {
  height: calc(100% - 300px);
}
.heightclacimport {
  height: calc(100% - 27px) !important;
}
.minheight {
  min-height: 1rem;
}
.width {
  width: 100%;
}
.width120 {
  width: 120px;
}
.width60 {
  width: 60px;
}
.width7rem {
  width: 7rem;
}
.width20 {
  width: 20%;
}
.width80 {
  width: 80%;
}
.width85 {
  width: 85%;
}
.widthimportant {
  width: 100% !important;
}
.width98 {
  width: 98%;
}
.width99 {
  width: 99%;
}
.width96 {
  width: 96%;
}
.width94 {
  width: 94%;
}
.width90 {
  width: 90%;
}
.width25 {
  width: 25%;
}
.width24 {
  width: 24%;
}
.width20 {
  width: 20%;
}
.width10 {
  width: 10%;
}
.width12 {
  width: 12%;
}
.width15 {
  width: 15%;
}
.width30 {
  width: 30%;
}
.width35 {
  width: 35%;
}
.width45 {
  width: 45%;
}
.width40 {
  width: 40%;
}
.width50 {
  width: 50%;
}
.width55 {
  width: 55%;
}
.width65 {
  width: 65%;
}
.width60 {
  width: 60%;
}
.width70 {
  width: 70%;
}
.width78 {
  width: 78%;
}
.inportantwidth70 {
  width: 70% !important;
}
.relative {
  position: relative;
}
.absolute {
  position: absolute;
}
.transformtopleft {
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
.transformtopleft12 {
  top: 12%;
  left: 50%;
  transform: translate(-50%, -50%);
}
.fixed {
  position: fixed;
}
.flex {
  display: flex;
}
.flex-sub {
  flex: 1;
}
.flex-auto {
  flex: auto;
}
.flex-direction {
  flex-direction: column;
}
.flex-column-reverse {
  flex-direction: column-reverse;
}
.flex-wrap {
  flex-wrap: wrap;
}
.align-start {
  align-items: flex-start;
}
.align-baseline {
  align-items: baseline;
}
.align-end {
  align-items: flex-end;
}
.align-center {
  align-items: center;
}
.justify-start {
  justify-content: flex-start;
}
.justify-end {
  justify-content: flex-end;
}
.justify-center {
  justify-content: center;
}
.justify-between {
  justify-content: space-between;
}
.justify-around {
  justify-content: space-around;
}
.margin-auto {
  margin: auto;
}
.margin4auto {
  margin: 4px auto;
}
.margin50 {
  margin: 0 25px 0 50px;
}
.margin-top10px {
  margin-top: 10px;
}
.margin-top2 {
  margin-top: 2%;
}
.margin-top4 {
  margin-top: 4%;
}
.margin-top15 {
  margin-top: 15%;
}
.margin-bottom {
  margin-bottom: 2%;
}
.margin-left {
  margin-left: 10px;
}
.margin-right5px {
  margin-right: 5px;
}
.margin-right {
  margin-right: 10px;
}
.margin-right15 {
  margin-right: 15px;
}
.margin-right40 {
  margin-right: 40px;
}
.margintopbot {
  margin: 10px auto;
}
.margin2 {
  margin: 2% auto;
}
.padding10 {
  padding: 10px;
}
.paddingtopbottom {
  padding: 10px 0;
}
.padding1016 {
  padding: 10px 16px;
}
.padding1020 {
  padding: 10px 20px;
}
.padding2010 {
  padding: 20px 10px;
}
.padding-top2 {
  padding-top: 2px;
}
.padding-top10 {
  padding-top: 10px;
}
.paddingbottom {
  padding-bottom: 6px;
}
.padding-right {
  padding-right: 10px;
}
.padding-left {
  padding-left: 10px;
}
.paddingleft1rem {
  padding-left: 1rem;
}
.overflow {
  overflow: hidden;
}
.overflowauto {
  overflow: auto;
}
.overflowy-auto {
  overflow: hidden;
  overflow-y: auto;
}
.relative {
  position: relative;
}
.absolute {
  position: absolute;
}
.fixed {
  position: fixed;
}
// åˆ†é¡µ
.elpagin {
  text-align: left;
  margin-top: 5px;
}
.boxshadow {
  box-shadow: 0px 5px 10px #eaedef;
}
.boxshadow4 {
  box-shadow: 0px 0px 4px #c2cbd4
}
.boxshadow69b0f7 {
  box-shadow: 0px 0px 4px #3b5371
}
.borderbottom {
  border-bottom: 1px solid #ebedef;
}
.borderbottom345 {
  border-bottom: 1px solid #c2cbd4;
}
.border {
  border: 1px solid #ebedef;
}
.border2 {
  border: 1px solid #91a2b3;
}
.borderdashed {
  border: 1px dashed #64a2e0;
}
.borderradius {
  border-radius: 4px;
}
.background-fff {
  background: #fff;
}
.backgroundF2F2F2 {
  background: #F2F2F2;
}
.backgroundrgb {
  background: rgb(7, 37, 73);
}
.backgroundecf5ff {
  background-color: #ecf5ff;
}
.color-973BA5 {
  color: #973BA5;
}
.colorF56C6C {
  color: #F56C6C;
}
.colorfff {
  color: #fff;
}
.color409EFF {
  color: #409EFF;
}
.color636972 {
  color: #636972;
}
.color909399 {
  color: #909399;
}
.fontweight400 {
  font-weight: 400;
}
.fontweight600 {
  font-weight: 600;
}
.fontsize1_2rem {
  font-size: 1.2rem;
}
.fontsize14 {
  font-size: 14px;
}
.fontsize2rem {
  font-size: 2rem;
}
.fontsize4rem {
  font-size: 4rem;
}
.fontsize6rem {
  font-size: 6rem;
}
.fontsiez1rem {
  font-size: 1rem;
}
.fontsizeinitial {
  font-size: initial;
}
.text-center {
  text-align: center;
}
.text-right {
  text-align: right;
}
.textalign {
  text-align: right;
}
.textindex2 {
  text-indent: 2rem;
}
.global-content {
  width: 100%;
  height: 100%;
  overflow: hidden;
}
.text-overflow {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap
}
.hover {
  &:hover {
    background-color: #ecf5ff;
  }
}
.bottom7 {
  bottom: 7px;
}
.right {
  right: 10px
}
.zindex {
  z-index: 10;
}
.pointer {
  cursor: pointer;
}
.search-bar{
    display: flex;
    .form-view{
        flex-grow: 1;
    }
    .btn-view{
        flex-shrink: 0;
    }
}
.default-form-width{
    width: 220px;
}
.subpage-style{
    box-sizing: border-box;
    padding: 8px;
    height: 100%;
    display: flex;
    flex-direction: column;
    background-color: #ffffff;
    .top-bar,.bottom-box{
        flex-shrink: 0;
    }
    .subpage-containter{
        flex-grow: 1;
        overflow: hidden;
    }
}
.pagination-box {
    display: flex;
    justify-content: flex-end;
    padding-top: 4px;
}
.table-top-action-row,.table-top-action-sides-row{
    padding-bottom: 4px;
}
.table-top-action-sides-row{
    display: flex;
    justify-content: space-between;
}
.project-table-list-box{
    display: flex;
    flex-direction: column;
    &>.table-top-action-row,&>.table-top-action-sides-row,&>.table-bottom-pagination{
        flex-shrink: 0;
    }
    &>.table-content{
        flex-grow: 1;
        overflow: hidden;
    }
}
.project-modal {
    .el-dialog__header,.el-dialog__footer{
        padding: 10px;
    }
    .el-dialog__headerbtn{
        top: 12px;
        right: 10px;
    }
    .el-dialog__header{
        border-bottom: 1px solid #efefef;
    }
    .el-dialog__footer {
        border-top: 1px solid #efefef;
    }
    .el-dialog__body{
        padding: 0;
    }
}
qqjf-Web/src/styles/innner-circles.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
.inner-circles-loader:not(:required) {
    position: relative;
    display: inline-block;
    width: 50px;
    height: 50px;
    margin-bottom: 10px;
    overflow: hidden;
    text-indent: -9999px;
    background: rgba(25, 165, 152, 0.5);
    border-radius: 50%;
    transform: translate3d(0, 0, 0);
  }
  .inner-circles-loader:not(:required)::before,
  .inner-circles-loader:not(:required)::after {
    position: absolute;
    top: 0;
    display: inline-block;
    width: 50px;
    height: 50px;
    content: "";
    border-radius: 50%;
  }
  .inner-circles-loader:not(:required)::before {
    left: 0;
    background: #c7efcf;
    transform-origin: 0 50%;
    animation: inner-circles-loader 3s infinite;
  }
  .inner-circles-loader:not(:required)::after {
    right: 0;
    background: #eef5db;
    transform-origin: 100% 50%;
    animation: inner-circles-loader 3s 0.2s reverse infinite;
  }
  @keyframes inner-circles-loader {
    0% {
      transform: rotate(0deg);
    }
    50% {
      transform: rotate(360deg);
    }
    100% {
      transform: rotate(0deg);
    }
  }
qqjf-Web/src/styles/sidebar.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
@import './variables.scss';
#app {
    .main-container {
        height: 100%;
        transition: margin-left .28s;
        margin-left: $sideBarWidth;
        position: relative;
    }
    .sidebar-container {
        position: fixed;
        height: 100%;
        width: $sideBarWidth !important;
        left: 0;
        top: 0;
        right: 0;
        bottom: 0;
        overflow: hidden;
        background: $menuBg;
        transition: all .28s;
        .scrollbar-wrapper {
            overflow-x: hidden !important;
        }
        .el-scrollbar {
            height: 100%;
        }
        .svg-icon {
            margin-right: 16px;
        }
    }
    .hidcontainer {
        .sidebar-container {
            width: 54px !important;
            transition: all .28s;
        }
        .main-container {
            margin-left: 54px;
        }
        .svg-icon {
            margin-right: 20px;
        }
    }
    ::-webkit-scrollbar {
        width:5px;
        height:10px;
      }
      /*外层轨道。可以用display:none让其不显示,也可以添加背景图片,颜色改变显示效果*/
      ::-webkit-scrollbar-track {
        width: 6px;
        background-color:#eee;
        -webkit-border-radius: 2em;
        -moz-border-radius: 2em;
        border-radius:2em;
      }
      /*滚动条的设置*/
      ::-webkit-scrollbar-thumb {
        background-color:#cccccc;
        background-clip:padding-box;
        min-height:28px;
        -webkit-border-radius: 2em;
        -moz-border-radius: 2em;
        border-radius:2em;
      }
      /*滚动条移上去的背景*/
      ::-webkit-scrollbar-thumb:hover {
          background-color:#c5cfe4;
      }
}
qqjf-Web/src/styles/transition.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
/* fade-transform */
.fade-transform-leave-active,
.fade-transform-enter-active {
  transition: all .5s;
}
.fade-transform-enter {
  opacity: 0;
  transform: translateX(-30px);
}
.fade-transform-leave-to {
  opacity: 0;
  transform: translateX(30px);
}
/* modal */
.modal-leave-active,
.modal-enter-active {
  transition: all .5s;
}
.modal-enter {
  opacity: 0;
  transform: translateY(-100%);
}
.modal-leave-to {
  opacity: 0;
  transform: translateY(100%);
}
qqjf-Web/src/styles/variables.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
// base color
$blue:#324157;
$light-blue:#3A71A8;
$red:#C03639;
$pink: #E65D6E;
$green: #30B08F;
$tiffany: #4AB7BD;
$yellow:#FEC171;
$panGreen: #30B08F;
// sidebar
$menuText:#bfcbd9;
$menuActiveText:#409EFF;
$subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951
$menuBg:#3a405a;
$menuHover:#263445;
$subMenuBg:#1f2d3d;
$subMenuHover:#001528;
$sideBarWidth: 180px;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
:export {
    menuText: $menuText;
    menuActiveText: $menuActiveText;
    subMenuActiveText: $subMenuActiveText;
    menuBg: $menuBg;
    menuHover: $menuHover;
    subMenuBg: $subMenuBg;
    subMenuHover: $subMenuHover;
    sideBarWidth: $sideBarWidth;
}
qqjf-Web/src/utils/auth.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
import Cookies from 'js-cookie'
const TokenKey = 'Admin-Token'
export function getToken() {
  return Cookies.get(TokenKey)
}
export function setToken(token) {
  return Cookies.set(TokenKey, token)
}
export function removeToken() {
  return Cookies.remove(TokenKey)
}
qqjf-Web/src/utils/axios.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
import request from './request'
import qs from 'qs';
let axios={}
/**
 * get方法,对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
axios.get = function (url, params = null) {
  return new Promise((resolve, reject) => {
    request
      .get(url, { params })
      .then(res => {
        resolve(res.data);
      })
      .catch(e => {
        reject(e);
      });
  });
}
/**
 * post方法,对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
axios.post = function (url, params) {
  return new Promise((resolve, reject) => {
    request
      .post(url, params)
      .then(res => {
        resolve(res.data);
      })
      .catch(e => {
        reject(e);
      });
  });
};
/**
 * put方法
 * @param {*} url
 * @param {*} params
 * @returns
 */
axios.put = function (url, params) {
  return new Promise((resolve, reject) => {
    request
      .put(url, params)
      .then(res => {
        resolve(res.data);
      })
      .catch(e => {
        reject(e);
      });
  });
};
export default axios
qqjf-Web/src/utils/date.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,156 @@
import dayjs from 'dayjs'
/**
 *  @description èŽ·å–å¹´æœˆæ—¥  æ—¶åˆ†ç§’
 *  @returns {string}  yyyy-MM-dd hh:mm:ss
 */
export function getDate(option) {
  const date = new Date();
  let str = date.getFullYear() + '-' + addZero(date.getMonth() + 1) + '-' + addZero(date.getDate());
  if (option && option.full) {
    str += ' ' + addZero(date.getHours()) + ':' + addZero(date.getMinutes()) + ':' + addZero(date.getSeconds());
  }
  return str;
}
/**
 *  @description èŽ·å–å¹´æœˆæ—¥  æ—¶åˆ†ç§’
 *  @returns {string}  yyyy-MM-dd hh:mm:ss
 */
export function getymdhms(option) {
  const date = new Date();
  let str =
    date.getFullYear() +
    '-' +
    addZero(date.getMonth() + 1) +
    '-' +
    addZero(date.getDate()) +
    ' ' +
    addZero(date.getHours()) +
    ':' +
    addZero(date.getMinutes()) +
    ':' +
    addZero(date.getSeconds());
  return str;
}
/**
 * @description  æ ¹æ®æ—¶é—´æˆ³èŽ·å–å¹´æœˆæ—¥
 * @param {*} date
 * @param {*} num
 * @returns
 */
export function getimestampDate(option) {
    let res = 'Invalid Date'
    try{
        res = dayjs(option).format('YYYY-MM-DD HH:mm:ss')
    }catch(e){
        //TODO handle the exception
    }
  return res;
}
/**
 *  @description  èŽ·å–æŒ‡å®šæ—¥æœŸç›¸éš”num天
 *  @param {String} date
 *  @param {String} num
 *  @returns {string}  yyyy-MM-dd
 */
export function getAroundDay(date, num) {
  var time = date ? new Date(date) : new Date();
  time.setDate(time.getDate() + num);
  return time.getFullYear() + '-' + addZero(time.getMonth() + 1) + '-' + addZero(time.getDate());
}
/**
 *  @description  èŽ·å–ä¸Šä¸ªæœˆ1号
 *  @param {String} date
 *  @param {String} num
 *  @returns {string}  yyyy-MM-dd
 */
export function getLastMonth(date, num) {
  const time = new Date();
  time.setTime(new Date(new Date().getFullYear(), new Date().getMonth() - 1, 1));
  return time.getFullYear() + '-' + addZero(time.getMonth() + 1) + '-' + addZero(time.getDate());
}
/**
 * @description èŽ·å– ä»Šå¤©å·¦å³å‡ å¤©çš„æ—¶é—´
 * @param {*} AddDayCount
 * @returns  {string}  yyyy-MM-dd
 */
//
export function GetDateStr(AddDayCount) {
  var dd = new Date();
  dd.setDate(dd.getDate() + AddDayCount); //获取AddDayCount天后的日期
  var y = dd.getFullYear();
  var m = dd.getMonth() + 1; //获取当前月份的日期
  if (m < 10) {
    m = '0' + m;
  }
  var d = dd.getDate();
  if (d < 10) {
    d = '0' + d;
  }
  return y + '-' + m + '-' + d;
}
/**
 *  @description èŽ·å– ä»Šå¤©å·¦å³å‡ å¤©çš„小时分钟秒
 * @param {*} AddDayCount
 * @returns
 */
export function GetTimeStr(AddDayCount) {
  var dd = new Date();
  dd.setDate(dd.getDate() + AddDayCount); //获取AddDayCount天后的日期
  let hours = dd.getHours();
  if (hours < 10) {
    hours = '0' + hours;
  }
  let min = dd.getMinutes();
  if (min < 10) {
    min = '0' + min;
  }
  let soc = dd.getSeconds();
  if (soc < 10) {
    soc = '0' + soc;
  }
  return hours + ':' + min + ':' + soc;
}
export function CoutDown(StartTime, EndTime) {
  let lefttime = parseInt((EndTime - StartTime) / 1000);
  let d = parseInt(lefttime / (24 * 60 * 60));
  let h = parseInt((lefttime / (60 * 60)) % 24);
  let m = parseInt((lefttime / 60) % 60);
  let s = parseInt(lefttime % 60);
  d = addZero(d);
  h = addZero(h);
  m = addZero(m);
  s = addZero(s);
  return {
    day: d,
    hours: h,
    minute: m,
    second: s
  };
}
export function coumdata(dataTime) {
  // let lefttime = parseInt((EndTime - StartTime) / 1000);
  let d = parseInt(dataTime / (24 * 60 * 60));
  let h = parseInt((dataTime / (60 * 60)) % 24);
  let m = parseInt((dataTime / 60) % 60);
  let s = parseInt(dataTime % 60);
  d = addZero(d);
  h = addZero(h);
  m = addZero(m);
  s = addZero(s);
  return {
    day: d,
    hours: h,
    minute: m,
    second: s
  };
}
const addZero = function (date) {
  return date > 9 ? date : '0' + date;
};
qqjf-Web/src/utils/debounce.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
/**
 * å‡½æ•°é˜²æŠ–
 * @param {Function} func
 * @param {number} delay
 * @param {boolean} immediate
 * @return {*}
 */
 export function debounce(func, delay, immediate = false) {
  let timer,
    context = this;
  return (...args) => {
    if (immediate) {
      func.apply(context, args);
      immediate = false;
      return;
    }
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(context, args);
    }, delay);
  };
}
qqjf-Web/src/utils/excel.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
export function exportTableList(tHeader, filterVal, list, name) {
    const data = formatJson(filterVal, list);
    exportExecel(tHeader, data, name);
  }
 function exportExecel(header, data, name) {
    require.ensure([], () => {
      const { export_json_to_excel } = require('@/vendor/Export2Excel');
      export_json_to_excel(header, data, name + '列表excel');
    });
  }
   function formatJson(filterVal, jsonData) {
    return jsonData.map(v => filterVal.map(j => v[j]));
  }
qqjf-Web/src/utils/getPageTitle.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
export default function getPageTitle(pageTitle) {
  debugger;
  if (pageTitle) {
    return `${pageTitle}-${title}`;
  }
  return title;
}
qqjf-Web/src/utils/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,357 @@
/**
 * Created by PanJiaChen on 16/11/18.
 */
/**
 * Parse the time to string
 * @param {(Object|string|number)} time
 * @param {string} cFormat
 * @returns {string | null}
 */
export function parseTime(time, cFormat) {
  if (arguments.length === 0 || !time) {
    return null
  }
  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
  let date
  if (typeof time === 'object') {
    date = time
  } else {
    if ((typeof time === 'string')) {
      if ((/^[0-9]+$/.test(time))) {
        // support "1548221490638"
        time = parseInt(time)
      } else {
        // support safari
        // https://stackoverflow.com/questions/4310953/invalid-date-in-safari
        time = time.replace(new RegExp(/-/gm), '/')
      }
    }
    if ((typeof time === 'number') && (time.toString().length === 10)) {
      time = time * 1000
    }
    date = new Date(time)
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  }
  const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
    const value = formatObj[key]
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }
    return value.toString().padStart(2, '0')
  })
  return time_str
}
/**
 * @param {number} time
 * @param {string} option
 * @returns {string}
 */
export function formatTime(time, option) {
  if (('' + time).length === 10) {
    time = parseInt(time) * 1000
  } else {
    time = +time
  }
  const d = new Date(time)
  const now = Date.now()
  const diff = (now - d) / 1000
  if (diff < 30) {
    return '刚刚'
  } else if (diff < 3600) {
    // less 1 hour
    return Math.ceil(diff / 60) + '分钟前'
  } else if (diff < 3600 * 24) {
    return Math.ceil(diff / 3600) + '小时前'
  } else if (diff < 3600 * 24 * 2) {
    return '1天前'
  }
  if (option) {
    return parseTime(time, option)
  } else {
    return (
      d.getMonth() +
      1 +
      '月' +
      d.getDate() +
      '日' +
      d.getHours() +
      '时' +
      d.getMinutes() +
      '分'
    )
  }
}
/**
 * @param {string} url
 * @returns {Object}
 */
export function getQueryObject(url) {
  url = url == null ? window.location.href : url
  const search = url.substring(url.lastIndexOf('?') + 1)
  const obj = {}
  const reg = /([^?&=]+)=([^?&=]*)/g
  search.replace(reg, (rs, $1, $2) => {
    const name = decodeURIComponent($1)
    let val = decodeURIComponent($2)
    val = String(val)
    obj[name] = val
    return rs
  })
  return obj
}
/**
 * @param {string} input value
 * @returns {number} output value
 */
export function byteLength(str) {
  // returns the byte length of an utf8 string
  let s = str.length
  for (var i = str.length - 1; i >= 0; i--) {
    const code = str.charCodeAt(i)
    if (code > 0x7f && code <= 0x7ff) s++
    else if (code > 0x7ff && code <= 0xffff) s += 2
    if (code >= 0xDC00 && code <= 0xDFFF) i--
  }
  return s
}
/**
 * @param {Array} actual
 * @returns {Array}
 */
export function cleanArray(actual) {
  const newArray = []
  for (let i = 0; i < actual.length; i++) {
    if (actual[i]) {
      newArray.push(actual[i])
    }
  }
  return newArray
}
/**
 * @param {Object} json
 * @returns {Array}
 */
export function param(json) {
  if (!json) return ''
  return cleanArray(
    Object.keys(json).map(key => {
      if (json[key] === undefined) return ''
      return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
    })
  ).join('&')
}
/**
 * @param {string} url
 * @returns {Object}
 */
export function param2Obj(url) {
  const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
  if (!search) {
    return {}
  }
  const obj = {}
  const searchArr = search.split('&')
  searchArr.forEach(v => {
    const index = v.indexOf('=')
    if (index !== -1) {
      const name = v.substring(0, index)
      const val = v.substring(index + 1, v.length)
      obj[name] = val
    }
  })
  return obj
}
/**
 * @param {string} val
 * @returns {string}
 */
export function html2Text(val) {
  const div = document.createElement('div')
  div.innerHTML = val
  return div.textContent || div.innerText
}
/**
 * Merges two objects, giving the last one precedence
 * @param {Object} target
 * @param {(Object|Array)} source
 * @returns {Object}
 */
export function objectMerge(target, source) {
  if (typeof target !== 'object') {
    target = {}
  }
  if (Array.isArray(source)) {
    return source.slice()
  }
  Object.keys(source).forEach(property => {
    const sourceProperty = source[property]
    if (typeof sourceProperty === 'object') {
      target[property] = objectMerge(target[property], sourceProperty)
    } else {
      target[property] = sourceProperty
    }
  })
  return target
}
/**
 * @param {HTMLElement} element
 * @param {string} className
 */
export function toggleClass(element, className) {
  if (!element || !className) {
    return
  }
  let classString = element.className
  const nameIndex = classString.indexOf(className)
  if (nameIndex === -1) {
    classString += '' + className
  } else {
    classString =
      classString.substr(0, nameIndex) +
      classString.substr(nameIndex + className.length)
  }
  element.className = classString
}
/**
 * @param {string} type
 * @returns {Date}
 */
export function getTime(type) {
  if (type === 'start') {
    return new Date().getTime() - 3600 * 1000 * 24 * 90
  } else {
    return new Date(new Date().toDateString())
  }
}
/**
 * @param {Function} func
 * @param {number} wait
 * @param {boolean} immediate
 * @return {*}
 */
export function debounce(func, wait, immediate) {
  let timeout, args, context, timestamp, result
  const later = function() {
    // æ®ä¸Šä¸€æ¬¡è§¦å‘æ—¶é—´é—´éš”
    const last = +new Date() - timestamp
    // ä¸Šæ¬¡è¢«åŒ…装函数被调用时间间隔 last å°äºŽè®¾å®šæ—¶é—´é—´éš” wait
    if (last < wait && last > 0) {
      timeout = setTimeout(later, wait - last)
    } else {
      timeout = null
      // å¦‚果设定为immediate===true,因为开始边界已经调用过了此处无需调用
      if (!immediate) {
        result = func.apply(context, args)
        if (!timeout) context = args = null
      }
    }
  }
  return function(...args) {
    context = this
    timestamp = +new Date()
    const callNow = immediate && !timeout
    // å¦‚果延时不存在,重新设定延时
    if (!timeout) timeout = setTimeout(later, wait)
    if (callNow) {
      result = func.apply(context, args)
      context = args = null
    }
    return result
  }
}
/**
 * This is just a simple version of deep copy
 * Has a lot of edge cases bug
 * If you want to use a perfect deep copy, use lodash's _.cloneDeep
 * @param {Object} source
 * @returns {Object}
 */
export function deepClone(source) {
  if (!source && typeof source !== 'object') {
    throw new Error('error arguments', 'deepClone')
  }
  const targetObj = source.constructor === Array ? [] : {}
  Object.keys(source).forEach(keys => {
    if (source[keys] && typeof source[keys] === 'object') {
      targetObj[keys] = deepClone(source[keys])
    } else {
      targetObj[keys] = source[keys]
    }
  })
  return targetObj
}
/**
 * @param {Array} arr
 * @returns {Array}
 */
export function uniqueArr(arr) {
  return Array.from(new Set(arr))
}
/**
 * @returns {string}
 */
export function createUniqueString() {
  const timestamp = +new Date() + ''
  const randomNum = parseInt((1 + Math.random()) * 65536) + ''
  return (+(randomNum + timestamp)).toString(32)
}
/**
 * Check if an element has a class
 * @param {HTMLElement} elm
 * @param {string} cls
 * @returns {boolean}
 */
export function hasClass(ele, cls) {
  return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
}
/**
 * Add class to element
 * @param {HTMLElement} elm
 * @param {string} cls
 */
export function addClass(ele, cls) {
  if (!hasClass(ele, cls)) ele.className += ' ' + cls
}
/**
 * Remove class from element
 * @param {HTMLElement} elm
 * @param {string} cls
 */
export function removeClass(ele, cls) {
  if (hasClass(ele, cls)) {
    const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
    ele.className = ele.className.replace(reg, ' ')
  }
}
qqjf-Web/src/utils/input.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
const MoneyTest = /((^[1-9]\d*)|^0)(\.\d{0,2}){0,1}$/;
// é‡‘额添加千分位
const comdify = function (n) {
  if(!n) return n;
  let str = n.split('.');
  let re = /\d{1,3}(?=(\d{3})+$)/g;
  let n1 = str[0].replace(re, "$&,");
  return str.length > 1 && str[1] ? `${n1}.${str[1]}` : `${n1}.00`;
};
//去除千分位中的‘,'
const delcommafy = function (num){
  if(!num) return num;
  num = num.toString();
  num = num.replace(/,/gi, '');
  return num;
};
const valdateFn = function (rule,val,cb) {
  setTimeout(() => {
    if(val) {
      let inputVal = delcommafy(val);
      if (rule.test(inputVal)) {
        cb()
      } else {
        cb('只能是数字金额,最多两位小数')
      }
    }
    cb()
  })
}
// éªŒè¯é‡‘额数字可以为负数
const moneyValid = function (rule,val,cb) {
  valdateFn(/((^-?[1-9]\d*)|^-?0)(\.\d{0,2}){0,1}$/,val,cb);
};
// éªŒè¯é‡‘额数字不可以为负数
const moneyNValid = function (rule,val,cb) {
  valdateFn(MoneyTest,val,cb);
};
// èŽ·å–è¾“å…¥æ¡†çš„å€¼
export function getInputValue (el) {
  let inputVal = el || '';
  return comdify(delcommafy(inputVal));
};
qqjf-Web/src/utils/request.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
import axios from 'axios';
import Vue from 'vue';
import {
  MessageBox,
  Message
} from 'element-ui';
import Loading from './vab';
import store from '@/store';
import qs from 'qs';
import {
  getStorage,
  setStorage
} from '@/utils/sessionStorage';
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // api çš„ base_url process.env.VUE_APP_BASE_API
  timeout: 50000 // è¯·æ±‚è¶…æ—¶æ—¶é—´
});
//请求
service.interceptors.request.use(config => {
  return config;
  error => {
    console.log(error);
    return Promise.reject(error);
  };
});
// //响应
service.interceptors.response.use(
  response => {
    const res = response.data;
    if (response.status === 200) {
      return Promise.resolve(response);
    } else {
      Message.error('接口请求错误');
      return Promise.reject(response);
    }
  },
  error => {
    if (error.response) {
      switch (error.response.status) {
        case 401:
          MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
              confirmButtonText: '重新登录',
              cancelButtonText: '取消',
              type: 'warning'
            })
            .then(() => {
              store.dispatch('user/logout').then(() => {
                window.location.href = '/';
              });
            })
            .catch(() => {
              if (!getStorage('accessToken')) {
                store.dispatch('user/logout').then(() => {
                  window.location.href = '/';
                });
              }
            });
          break;
        case 404:
          Message({
            message: '很抱歉,资源未找到!',
            type: 'error'
          });
          break;
        case 500:
          Message({
            message: '网络错误,请稍后再试!',
            type: 'error'
          });
          break;
        case 503:
          Message({
            message: '系统错误,请稍后再试!',
            type: 'error'
          });
          break;
        case 504:
          Message({
            message: '网络超时,请稍后再试!',
            type: 'error'
          });
          break;
      }
      Vue.prototype.$Loading();
      return Promise.reject(error);
    }
  }
);
export default service;
qqjf-Web/src/utils/sessionStorage.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
/**
 * è®¾ç½®sessionStorage
 * @param {string} key
 * @param {any} value
 */
 export function setCache(key, value) {
  if (value == undefined || value == null) {
    window.sessionStorage.setItem(key, value);
  } else {
    window.sessionStorage.setItem(key, JSON.stringify(value));
  }
}
/**
 * èŽ·å–sessionStorage
 * @param {string} key
 * @returns {any}
 */
export function getCache(key) {
  if (window.sessionStorage.getItem(key) == 'undefined' || window.sessionStorage.getItem(key) == null) {
    return undefined;
  }
  return JSON.parse(window.sessionStorage.getItem(key));
}
/**
 * æ¸…除指定sessionStorage
 * @param {string} key
 */
export function removeCache(key) {
  return window.sessionStorage.removeItem(key);
}
/**
 * æ¸…除所有sessionStorage
 */
export function removeAll(key) {
  return window.sessionStorage.clear();
}
qqjf-Web/src/utils/throttle.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
export function throttle(fun, delay) {
  let last, deferTimer;
  return function (args) {
    let that = this;
    let _args = arguments;
    let now = +new Date();
    if (last && now < last + delay) {
      clearTimeout(deferTimer);
      deferTimer = setTimeout(() => {
        last = now;
        fun.apply(that, _args);
      }, delay);
    } else {
      last = now;
      fun.apply(that, _args);
    }
  };
}
qqjf-Web/src/utils/vab.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
import { Loading } from "element-ui";
const install =(Vue,opts={})=>{
    Vue.prototype.$Loading=(lodi=false)=>{
        let loading= Loading.service({
            lock: true,
            text: '正在加载',
            spinner: "inner-circles-loader",
            background: "rgba(0,0,0,0.4)",
        });
        if (lodi==true) {
            Loading.service({
                lock: true,
                text: '正在加载',
                spinner: "inner-circles-loader",
                background: "rgba(0,0,0,0.4)",
            });
        }else{
            loading.close()
        }
    }
}
export default install
qqjf-Web/src/utils/validate.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
/**
 * Created by PanJiaChen on 16/11/18.
 */
/**
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path) {
  return /^(https?:|mailto:|tel:)/.test(path)
}
/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUsername(str) {
  const valid_map = ['admin', 'editor']
  return valid_map.indexOf(str.trim()) >= 0
}
/**
 * @param {string} url
 * @returns {Boolean}
 */
export function validURL(url) {
  const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return reg.test(url)
}
/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validLowerCase(str) {
  const reg = /^[a-z]+$/
  return reg.test(str)
}
/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUpperCase(str) {
  const reg = /^[A-Z]+$/
  return reg.test(str)
}
/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validAlphabets(str) {
  const reg = /^[A-Za-z]+$/
  return reg.test(str)
}
/**
 * @param {string} email
 * @returns {Boolean}
 */
export function validEmail(email) {
  const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  return reg.test(email)
}
/**
 * @param {string} str
 * @returns {Boolean}
 */
export function isString(str) {
  if (typeof str === 'string' || str instanceof String) {
    return true
  }
  return false
}
/**
 * @param {Array} arg
 * @returns {Boolean}
 */
export function isArray(arg) {
  if (typeof Array.isArray === 'undefined') {
    return Object.prototype.toString.call(arg) === '[object Array]'
  }
  return Array.isArray(arg)
}
qqjf-Web/src/vendor/Blob.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,162 @@
(function (view) {
  "use strict";
  view.URL = view.URL || view.webkitURL;
  if (view.Blob && view.URL) {
    try {
      new Blob;
      return;
    } catch (e) {}
  }
  // Internally we use a BlobBuilder implementation to base Blob off of
  // in order to support older browsers that only have BlobBuilder
  var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) {
    var
      get_class = function(object) {
        return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
      }
      , FakeBlobBuilder = function BlobBuilder() {
        this.data = [];
      }
      , FakeBlob = function Blob(data, type, encoding) {
        this.data = data;
        this.size = data.length;
        this.type = type;
        this.encoding = encoding;
      }
      , FBB_proto = FakeBlobBuilder.prototype
      , FB_proto = FakeBlob.prototype
      , FileReaderSync = view.FileReaderSync
      , FileException = function(type) {
        this.code = this[this.name = type];
      }
      , file_ex_codes = (
        "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "
        + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"
      ).split(" ")
      , file_ex_code = file_ex_codes.length
      , real_URL = view.URL || view.webkitURL || view
      , real_create_object_URL = real_URL.createObjectURL
      , real_revoke_object_URL = real_URL.revokeObjectURL
      , URL = real_URL
      , btoa = view.btoa
      , atob = view.atob
      , ArrayBuffer = view.ArrayBuffer
      , Uint8Array = view.Uint8Array
    ;
    FakeBlob.fake = FB_proto.fake = true;
    while (file_ex_code--) {
      FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;
    }
    if (!real_URL.createObjectURL) {
      URL = view.URL = {};
    }
    URL.createObjectURL = function(blob) {
      var
        type = blob.type
        , data_URI_header
      ;
      if (type === null) {
        type = "application/octet-stream";
      }
      if (blob instanceof FakeBlob) {
        data_URI_header = "data:" + type;
        if (blob.encoding === "base64") {
          return data_URI_header + ";base64," + blob.data;
        } else if (blob.encoding === "URI") {
          return data_URI_header + "," + decodeURIComponent(blob.data);
        } if (btoa) {
          return data_URI_header + ";base64," + btoa(blob.data);
        } else {
          return data_URI_header + "," + encodeURIComponent(blob.data);
        }
      } else if (real_create_object_URL) {
        return real_create_object_URL.call(real_URL, blob);
      }
    };
    URL.revokeObjectURL = function(object_URL) {
      if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) {
        real_revoke_object_URL.call(real_URL, object_URL);
      }
    };
    FBB_proto.append = function(data/*, endings*/) {
      var bb = this.data;
      // decode data to a binary string
      if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {
        var
          str = ""
          , buf = new Uint8Array(data)
          , i = 0
          , buf_len = buf.length
        ;
        for (; i < buf_len; i++) {
          str += String.fromCharCode(buf[i]);
        }
        bb.push(str);
      } else if (get_class(data) === "Blob" || get_class(data) === "File") {
        if (FileReaderSync) {
          var fr = new FileReaderSync;
          bb.push(fr.readAsBinaryString(data));
        } else {
          // async FileReader won't work as BlobBuilder is sync
          throw new FileException("NOT_READABLE_ERR");
        }
      } else if (data instanceof FakeBlob) {
        if (data.encoding === "base64" && atob) {
          bb.push(atob(data.data));
        } else if (data.encoding === "URI") {
          bb.push(decodeURIComponent(data.data));
        } else if (data.encoding === "raw") {
          bb.push(data.data);
        }
      } else {
        if (typeof data !== "string") {
          data += ""; // convert unsupported types to strings
        }
        // decode UTF-16 to binary string
        bb.push(unescape(encodeURIComponent(data)));
      }
    };
    FBB_proto.getBlob = function(type) {
      if (!arguments.length) {
        type = null;
      }
      return new FakeBlob(this.data.join(""), type, "raw");
    };
    FBB_proto.toString = function() {
      return "[object BlobBuilder]";
    };
    FB_proto.slice = function(start, end, type) {
      var args = arguments.length;
      if (args < 3) {
        type = null;
      }
      return new FakeBlob(
        this.data.slice(start, args > 1 ? end : this.data.length)
        , type
        , this.encoding
      );
    };
    FB_proto.toString = function() {
      return "[object Blob]";
    };
    FB_proto.close = function() {
      this.size = this.data.length = 0;
    };
    return FakeBlobBuilder;
  }(view));
  view.Blob = function Blob(blobParts, options) {
    var type = options ? (options.type || "") : "";
    var builder = new BlobBuilder();
    if (blobParts) {
      for (var i = 0, len = blobParts.length; i < len; i++) {
        builder.append(blobParts[i]);
      }
    }
    return builder.getBlob(type);
  };
}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this));
qqjf-Web/src/vendor/Export2Excel.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,139 @@
/* eslint-disable */
require('script-loader!file-saver');
require('./Blob.js');
require('script-loader!xlsx/dist/xlsx.core.min');
function generateArray(table) {
  var out = [];
  var rows = table.querySelectorAll('tr');
  var ranges = [];
  for (var R = 0; R < rows.length; ++R) {
    var outRow = [];
    var row = rows[R];
    var columns = row.querySelectorAll('td');
    for (var C = 0; C < columns.length; ++C) {
      var cell = columns[C];
      var colspan = cell.getAttribute('colspan');
      var rowspan = cell.getAttribute('rowspan');
      var cellValue = cell.innerText;
      if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
      //Skip ranges
      ranges.forEach(function (range) {
        if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
          for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
        }
      });
      //Handle Row Span
      if (rowspan || colspan) {
        rowspan = rowspan || 1;
        colspan = colspan || 1;
        ranges.push({s: {r: R, c: outRow.length}, e: {r: R + rowspan - 1, c: outRow.length + colspan - 1}});
      }
      ;
      //Handle Value
      outRow.push(cellValue !== "" ? cellValue : null);
      //Handle Colspan
      if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
    }
    out.push(outRow);
  }
  return [out, ranges];
};
function datenum(v, date1904) {
  if (date1904) v += 1462;
  var epoch = Date.parse(v);
  return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}
function sheet_from_array_of_arrays(data, opts) {
  var ws = {};
  var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}};
  for (var R = 0; R != data.length; ++R) {
    for (var C = 0; C != data[R].length; ++C) {
      if (range.s.r > R) range.s.r = R;
      if (range.s.c > C) range.s.c = C;
      if (range.e.r < R) range.e.r = R;
      if (range.e.c < C) range.e.c = C;
      var cell = {v: data[R][C]};
      if (cell.v == null) continue;
      var cell_ref = XLSX.utils.encode_cell({c: C, r: R});
      if (typeof cell.v === 'number') cell.t = 'n';
      else if (typeof cell.v === 'boolean') cell.t = 'b';
      else if (cell.v instanceof Date) {
        cell.t = 'n';
        cell.z = XLSX.SSF._table[14];
        cell.v = datenum(cell.v);
      }
      else cell.t = 's';
      ws[cell_ref] = cell;
    }
  }
  if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
  return ws;
}
function Workbook() {
  if (!(this instanceof Workbook)) return new Workbook();
  this.SheetNames = [];
  this.Sheets = {};
}
function s2ab(s) {
  var buf = new ArrayBuffer(s.length);
  var view = new Uint8Array(buf);
  for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
  return buf;
}
export function export_table_to_excel(id) {
  var theTable = document.getElementById(id);
  var oo = generateArray(theTable);
  var ranges = oo[1];
  /* original data */
  var data = oo[0];
  var ws_name = "SheetJS";
  var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
  /* add ranges to worksheet */
  // ws['!cols'] = ['apple', 'banan'];
  ws['!merges'] = ranges;
  /* add worksheet to workbook */
  wb.SheetNames.push(ws_name);
  wb.Sheets[ws_name] = ws;
  var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
  saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx")
}
function formatJson(jsonData) {
  // console.log(jsonData)
}
export function export_json_to_excel(th, jsonData, defaultTitle) {
  /* original data */
  var data = jsonData;
  data.unshift(th);
  var ws_name = "SheetJS";
  var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
  /* add worksheet to workbook */
  wb.SheetNames.push(ws_name);
  wb.Sheets[ws_name] = ws;
  var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
  var title = defaultTitle || '列表'
  saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx")
}
qqjf-Web/src/views/Didproject/components/classify.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
<template>
  <div class="width99 padding-top2 margintopbot flex justify-between align-center">
    <div
      class="didproject-title flex justify-around align-center border borderradius overflow pointer"
      v-for="(item, index) in titlelist"
      :key="index"
    >
      <div class="height width35 flex align-center justify-center overflow padding10">
        <svg-icon class="fontsize4rem text-center" :style="'color:' + item.color" :icon-class="item.icon" />
      </div>
      <div class="heigth width55 padding10 overflow">
        <p class="fontsiez1rem">{{ item.titel }}</p>
        <p class="text-center fontsize2rem fontweight600 color409EFF margin-top15">
          <countTo :startVal="startVal" :endVal="item.mun" :duration="3000"></countTo>
        </p>
      </div>
    </div>
  </div>
</template>
<script>
import countTo from 'vue-count-to';
import { GetStorageOverviewData } from '@/api/Didproject';
export default {
  data() {
    return {
      startVal: 0,
      titlelist: [
        {
          icon: 'documentation',
          titel: '库位总数',
          mun: 0,
          color: '#40C9C6'
        },
        {
          icon: 'storage',
          titel: '有货库位',
          mun: 0,
          color: '#F4516C'
        },
        {
          icon: 'him',
          titel: '带件器具',
          mun: 0,
          color: '#36A3F7'
        },
        {
          icon: 'clipboard',
          titel: '空器具数',
          mun: 0,
          color: '#34BFA3'
        },
        {
          icon: 'table',
          titel: '制件总数',
          mun: 1,
          color: '#ffc637'
        }
      ],
      cleartime: null
    };
  },
  components: { countTo },
  mounted() {
    this.GetStorageOverviewData();
    this.cleartime = setInterval(() => {
      this.GetStorageOverviewData();
    }, 60000);
  },
  methods: {
    //立库总览和制件总览
    GetStorageOverviewData() {
      // no ç¼–号;title æ ‡é¢˜ï¼›value æ•°é‡
      GetStorageOverviewData().then(res => {
        let data = res.data || [];
        this.titlelist.forEach(item => {
          data.forEach(element => {
            if (item.titel == element.titel) {
              item.mun = element.value;
            }
          });
        });
      });
    }
  },
  beforeDestroy() {
    if (this.cleartime) {
      clearInterval(this.cleartime);
      this.cleartime = null;
    }
  }
};
</script>
<style lang="scss" scoped>
.didproject-title {
  width: 18%;
  padding: 0 0;
  box-shadow: 0 0 4px #c1c9d0;
  background: #f0f2f5;
  transition: all 0.3s;
  &:hover {
    box-shadow: 0 0 4px #99b7e2;
  }
}
</style>
qqjf-Web/src/views/Didproject/components/didinquer.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
<template>
  <div class="flex align-center justify-end">
    <div id="topinquer" class="flex align-center">
      <div class="flex align-center margin-right15">
        <label>所属仓库:</label>
        <el-select v-model="iqnuer.enable" size="mini" clearable placeholder="请选择">
          <el-option v-for="item in enableList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
        </el-select>
      </div>
      <el-button type="primary" size="mini">查询</el-button>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      iqnuer: {},
      enableList: []
    };
  },
  props: {}
};
</script>
<style lang="scss" scoped>
#topinquer {
  ::v-deep .el-select {
    // width: 100px;
  }
}
</style>
qqjf-Web/src/views/Didproject/components/didnav.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
<template>
  <div class="width99 padding-top2 margintopbot flex justify-between align-center">
    <div
      class="didproject-title flex justify-around align-center border borderradius overflow pointer"
      v-for="(item, index) in titlelist"
      :key="index"
    >
      <div class="height width35 flex align-center justify-center overflow padding10">
        <svg-icon class="fontsize4rem text-center" :style="'color:' + item.color" :icon-class="item.icon" />
      </div>
      <div class="heigth width55 padding10 overflow">
        <p class="fontsiez1rem">{{ item.titel }}</p>
        <p class="text-center fontsize2rem fontweight600 color409EFF margin-top15">
          <countTo :startVal="startVal" :endVal="item.mun" :duration="3000"></countTo>
        </p>
      </div>
    </div>
  </div>
</template>
<script>
import countTo from 'vue-count-to';
import { GetHomeNumData, GetHomeBarItemData } from '@/api/Didproject';
export default {
  data() {
    return {
      startVal: 0,
      titlelist: [
        {
          icon: 'in-storage',
          titel: '今日入库零件数',
          mun: 0,
          color: '#40C9C6'
        },
        {
          icon: 'skill',
          titel: '今日出库零件数',
          mun: 0,
          color: '#F4516C'
        },
        {
          icon: 'example',
          titel: '今日入库器具数',
          mun: 0,
          color: '#36A3F7'
        },
        {
          icon: 'trade',
          titel: '今日出库器具数',
          mun: 0,
          color: '#34BFA3'
        },
        {
          icon: 'record-chart',
          titel: '超期零件数量',
          mun: 1,
          color: '#ffc637'
        }
      ],
      cleartime: null
    };
  },
  components: { countTo },
  mounted() {
    this.GetHomeNumData();
    this.cleartime = setInterval(() => {
      this.GetHomeNumData();
    }, 60000);
  },
  methods: {
    //今日出入库数据
    GetHomeNumData() {
      if (this.cleartime) {
        clearInterval(this.cleartime);
        this.cleartime = null;
      }
      // no ç¼–号;title æ ‡é¢˜ï¼›value æ•°é‡
      GetHomeNumData().then(res => {
        let data = res.data || [];
        this.titlelist.forEach(item => {
          data.forEach(element => {
            if (item.titel == element.titel) {
              item.mun = element.value;
            }
          });
        });
      });
    }
  },
  beforeDestroy() {
    if (this.cleartime) {
      clearInterval(this.cleartime);
      this.cleartime = null;
    }
  }
};
</script>
<style lang="scss" scoped>
.didproject-title {
  width: 18%;
  padding: 0px 0;
  box-shadow: 0 0 4px #c1c9d0;
  background: #f0f2f5;
  transition: all 0.3s;
  &:hover {
    box-shadow: 0 0 4px #99b7e2;
  }
}
</style>
qqjf-Web/src/views/Didproject/components/lineEcharts.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,215 @@
<template>
  <div class="chart-wrapper" ref="didline"></div>
</template>
<script>
import resize from '@/mixins/resize';
const echarts = require('echarts');
export default {
  name: 'placePie',
  props: {
    titleechart: {
      type: String,
      default: ''
    },
    linelist: {
      type: Object,
      default: () => {}
    },
    colorList: {
      type: Array,
      default: () => []
    }
  },
  mixins: [resize],
  data() {
    return {};
  },
  mounted() {
    this.initEchart();
  },
  methods: {
    initEchart() {
      const colorList = ['#ffc637', '#fc7293', '#8477e9', '#2599f0', '#31c3ea', '#17d8b9', '#e8bdf3'];
      let _this = this;
      let serieslist = [];
      let data = this.linelist.data;
      if (data) {
        data.forEach((item, index) => {
          serieslist.push({
            name: item.name,
            type: 'bar',
            data: item.xdata,
            barWidth: 15,
            barGap: 1, //柱间距离
            label: {
              //图形上的文本标签
              normal: {
                show: true,
                position: 'top',
                textStyle: {
                  color: '#a8aab0',
                  fontStyle: 'normal',
                  fontFamily: '微软雅黑',
                  fontSize: 14
                }
              }
            },
            itemStyle: {
              normal: {
                show: true,
                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                  {
                    offset: 0,
                    color: this.colorList[index]
                  },
                  {
                    offset: 1,
                    color: this.colorList[index]
                  }
                ]),
                barBorderRadius: 50,
                borderWidth: 0
              }
            }
          });
        });
      }
      this.myChart = echarts.init(this.$refs.didline);
      this.myChart.setOption(
        {
          title: {
            text: this.linelist && this.linelist.data ? this.titleechart : '暂无数据',
            textStyle: {
              fontSize: 22
            },
            subtextStyle: {
              fontSize: 22,
              fontWeight: 'bold'
            },
            left: '45%',
            x: 'center',
            y: 0,
            itemGap: 10
          },
          tooltip: {
            //提示框组件
            trigger: 'axis',
            // formatter: '{b}<br />{a0}: {c0}<br />{a1}: {c1}',
            axisPointer: {
              type: 'shadow',
              label: {
                backgroundColor: '#6a7985'
              }
            },
            textStyle: {
              // color: '#fff',
              fontStyle: 'normal',
              fontFamily: '微软雅黑',
              fontSize: 12
            }
          },
          grid: {
            left: '1%',
            right: '1%',
            bottom: '1%',
            top: '15%',
            //    padding:'0 0 10 0',
            containLabel: true
          },
          legend: {
            //图例组件,颜色和名字
            right: '1%',
            top: '0%',
            itemGap: 16,
            itemWidth: 18,
            itemHeight: 10,
            data: this.linelist.legend,
            textStyle: {
              color: '#a8aab0',
              fontStyle: 'normal',
              fontFamily: '微软雅黑',
              fontSize: 12
            }
          },
          xAxis: [
            {
              type: 'category',
              //    boundaryGap: true,//坐标轴两边留白
              data: this.linelist.xdata,
              // data: Axdata,
              axisLabel: {
                interval: 0, //设置为 1,表示『隔一个标签显示一个标签』
                margin: 10,
                textStyle: {
                  fontSize: 12
                }
              },
              axisLine: { show: true, lineStyle: { color: '#636972', width: 2 } },
              splitLine: {
                show: false,
                lineStyle: { color: '#2b3442', width: 1 }
              },
              axisTick: {
                show: false
              }
            }
          ],
          yAxis: [
            {
              type: 'value',
              splitNumber: 5,
              axisLabel: {
                textStyle: {
                  fontSize: 12
                }
              },
              axisLine: {
                lineStyle: {
                  color: '#636972',
                  width: 1
                }
              },
              axisTick: {
                show: false
              },
              splitLine: {
                show: true,
                lineStyle: {
                  color: '#636972'
                }
              }
            }
          ],
          dataZoom: [
            {
              type: 'inside',
              startValue: 0,
              endValue: 10
            }
          ],
          series: serieslist
        },
        true
      );
      // this.myChart.getZr().on('click', function (res) {
      //   const { href } = _this.$router.resolve({
      //     path: '/output'
      //   });
      //   window.open(href, '_blank');
      // });
    }
  },
  watch: {
    linelist: {
      handler() {
        this.initEchart();
      },
      deep: true
    }
  }
};
</script>
qqjf-Web/src/views/Didproject/components/notice.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
<template>
  <div class="main-home-notice el-alert--warning is-light" v-if="visible" @click.stop="onClose">
    <div class="left-icon"><i class="el-icon-warning"></i></div>
    <div class="notice-view">
      <auto-scroll :step-speed="4000" dir="horizontal">
        <div class="notice-item" v-for="(item, index) in notices" :key="'notice-item-' + index">
          {{ index + 1 }}、零件号:{{item.itemName}},零件名称:{{item.itemDes}},超限。目前库存<span class="blue-f">{{item.itemNum}}</span>件,下限<span class="red-f">{{item.minStorage}}</span>件,上限<span class="red-f">{{item.maxStorage}}</span>件。
        </div>
      </auto-scroll>
    </div>
  </div>
</template>
<script>
import AutoScroll from '@/components/autoscroll/index.vue';
export default {
  name: 'mainHomeNotice',
  components: { AutoScroll },
  props: {
    notices: {
      type: Array,
      default: function () {
        return [];
      }
    },
    visible: {
      type: Boolean,
      default: false
    }
  },
  methods: {
    onClose() {
      this.$emit('update:visible', false);
    }
  }
};
</script>
<style lang="scss" scoped>
.main-home-notice {
  $leftWidth: 36px;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  box-sizing: border-box;
  z-index: 20;
    font-size: 20px;
  height: 40px;
  padding-left: $leftWidth;
  cursor: default;
  .left-icon {
    position: absolute;
    top: 0;
    left: 0;
    height: 100%;
    width: $leftWidth;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .notice-view {
    height: 100%;
    display: flex;
    align-items: center;
  }
  .notice-item {
    height: 100%;
    display: flex;
    align-items: center;
    margin-right: 20px;
    &:last-child {
      margin-right: 0;
    }
        .blue-f{
            color:#409eff;
        }
        .red-f{
            color:#ff0000;
        }
  }
}
</style>
qqjf-Web/src/views/Didproject/components/pieEcharts.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,130 @@
<template>
  <div class="chart-wrapper" ref="placePie"></div>
</template>
<script>
import resize from '@/mixins/resize';
const echarts = require('echarts');
export default {
  name: 'placePie',
  props: {
    chartData: {
      type: Object
    }
  },
  mixins: [resize],
  data() {
    return {};
  },
  mounted() {
    this.initEchart();
  },
  methods: {
    initEchart() {
      let _this = this;
      const colorList = ['#8477e9', '#ffc637', '#fc7293', '#2599f0', '#31c3ea', '#17d8b9', '#e8bdf3'];
      this.myChart = echarts.init(this.$refs.placePie);
      this.myChart.setOption(
        {
          color: colorList,
          title: {
            text: '库位类型:' + this.chartData.titel,
            top: '0%',
            left: '10%',
            textAlign: 'left',
            textStyle: {
              fontSize: 14,
              fontWeight: '400'
            }
          },
          tooltip: {
            trigger: 'item',
            formatter: '{a} <br/>{b} : {c}<br/>',
            // + '占比:' + '{d}' + '%'
            position: function (pos, params, dom, rect, size) {
              var obj = { bottom: '10%' };
              obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 5;
              return obj;
            }
          },
          legend: {
            show: this.chartData.list.length > 0,
            bottom: '10%', //å»¶Y轴居中
            right: '0',
            type: 'scroll',
            align: 'right',
            orient: 'vertival',
            itemHeight: 11,
            itemWidth: 11,
            pageTextStyle: {
              color: '#556677'
            },
            pageIconColor: '#556677',
            color: '#556677',
            fontSize: 14,
            data: this.chartData.list.map(item => item.name)
          },
          series: [
            {
              name: this.chartData.titel,
              type: 'pie',
              radius: ['65%', '80%'],
              center: ['50%', '50%'],
              data: this.chartData.list,
              // roseType: 'radius', //area
              label: {
                show: true,
                position: 'center',
                fontSize: 14,
                color: '#556677',
                formatter: function (params) {
                  let sum = _this.chartData.list[0].value + _this.chartData.list[1].value;
                  let val_1 = _this.chartData.list[0].value / sum;
                  val_1 = JSON.stringify(val_1) != 'null' ? JSON.stringify(val_1 * 100).slice(0, 5) : 0;
                  let val_2 = _this.chartData.list[1].value / sum;
                  val_2 = JSON.stringify(val_2) != 'null' ? JSON.stringify(val_2 * 100).slice(0, 5) : 0;
                  return (
                    _this.chartData.list[0].name +
                    ':' +
                    _this.chartData.list[0].value +
                    // val_1 +
                    // '%' +
                    '\n\n' +
                    _this.chartData.list[1].name +
                    ':' +
                    _this.chartData.list[1].value +
                    // val_2 +
                    // '%' +
                    '\n\n使用率:' +
                    _this.chartData.placeRate
                  );
                }
              },
              labelLine: {
                show: false,
                length: 10,
                length2: 5,
                smooth: false
              }
            }
          ]
        },
        true
      );
    }
  },
  watch: {
    chartData: {
      handler() {
        this.initEchart();
      },
      deep: true
    }
  }
};
</script>
qqjf-Web/src/views/Didproject/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,263 @@
<template>
  <div id="Didproject" class="global-content">
    <div class="width height overflowy-auto">
      <div class="height250 overflow">
        <div class="flex justify-end align-centent">
          <el-date-picker
            v-model="daterange"
            size="mini"
            type="daterange"
            value-format="yyyy-MM-dd"
            range-separator="至"
            :clearable="false"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
          >
          </el-date-picker>
          <el-button class="margin-left margin-right" type="primary" size="mini" @click="derive">导出</el-button>
        </div>
        <did-nav />
        <classify />
      </div>
      <!-- height-calc280  -->
      <div class="width margin-top10px overflowy-auto">
        <div class="margintopbot paddingtopbottom width overflow">
          <p class="fontsize2rem text-center">货位使用实时图</p>
          <div class="flex flex-wrap">
            <div
              class="did-echarts margin-top10px margin-right width30"
              v-for="(item, index) in chartData"
              :key="index + 'pieechart'"
            >
              <pie-echarts class="width height" :chartData="item" />
            </div>
          </div>
        </div>
        <div class="margintopbot width overflow">
          <p class="fontsize2rem text-center">零件出入库统计</p>
          <div class="width margintopbot flex justify-end">
            <el-date-picker
              v-model="datatime"
              size="mini"
              type="datetimerange"
              value-format="yyyy-MM-dd HH:mm:ss"
              range-separator="至"
              start-placeholder="开始日期"
              end-placeholder="结束日期"
            >
            </el-date-picker>
            <el-button class="margin-left margin-right" type="primary" size="mini" @click="goodsinquer">查询</el-button>
            <el-button class="margin-left margin-right" type="primary" size="mini" @click="linkTo">跳转</el-button>
          </div>
          <div class="width98 margintopbot echart-height">
            <line-echart
              titleechart="零件数量统计"
              :linelist="BarItemlinelist"
              :colorList="barcolorList"
              class="width height"
            />
          </div>
          <div class="width98 margintopbot echart-height">
            <line-echart
              titleechart="器具出入库统计"
              :linelist="Containerlinelist"
              :colorList="concolorList"
              class="width height"
            />
          </div>
        </div>
      </div>
    </div>
    <top-notice :visible.sync="noticeVisible" :notices="noticeData"></top-notice>
  </div>
</template>
<script>
import DidInquer from './components/didinquer';
import DidNav from './components/didnav';
import Classify from './components/classify.vue';
import PieEcharts from './components/pieEcharts';
import LineEchart from './components/lineEcharts';
import {
  GetHomePieData,
  GetHomeBarItemData,
  GetHomeBarContainerData,
  GetHomeNumDataByDate,
  GetWarnings
} from '@/api/Didproject';
import { getDate, GetDateStr, GetTimeStr, getimestampDate, getymdhms } from '@/utils/date';
const { Didproject } = require('@/components/tableContainer/tableHead');
import { exportTableList } from '@/utils/excel';
import TopNotice from './components/notice.vue';
// import { SearchPermission, AddOrUpdateRoleVsPermission, GetUserRoleAllPermission } from '@/api/role-auth';
export default {
  components: { DidInquer, DidNav, PieEcharts, LineEchart, Classify, TopNotice },
  data() {
    return {
      daterange: [GetDateStr(0), GetDateStr(0)],
      datatime: [GetDateStr(-15) + ' 00:00:00', getDate() + ' ' + GetTimeStr(0)],
      chartData: [],
      BarItemlinelist: {}, //零件出入数量
      Containerlinelist: {}, //出入库数量
      clearIntervaltime: null,
      BarItemlineshow: false,
      Containerline: false,
      barcolorList: ['#ffc637', '#fc7293', '#8477e9', '#2599f0', '#31c3ea', '#17d8b9', '#e8bdf3'],
      concolorList: ['#31c3ea', '#17d8b9', '#2599f0', '#e8bdf3', '#ffc637', '#fc7293', '#8477e9'],
      noticeVisible: false,
      noticeData: []
    };
  },
  mounted() {
    this.getWarnings(() => {
      this.GetHomePieData();
      this.GetHomeBarItemData();
      this.GetHomeBarContainerData();
      this.clearIntervaltime = setInterval(() => {
        this.GetHomePieData();
      }, 60000);
    });
  },
  methods: {
    //时间查询
    goodsinquer() {
      this.GetHomeBarItemData();
      this.GetHomeBarContainerData();
    },
    //各类型库位使用统计
    GetHomePieData() {
      //placeType åº“位类型;placeTotalNum æ€»åº“位数;placeFullNum å·²ç”¨åº“位数;placeRate ä½¿ç”¨çŽ‡ï¼›
      GetHomePieData().then(res => {
        if (res.code == 0) {
          let data = res.data;
          let pielist = [];
          data.forEach((element, index) => {
            pielist.push({ titel: '', placeRate: '', list: [] });
            for (let i in element) {
              if (i == 'placeVal' || i == 'placeOtherVal') {
                pielist[index].list.push({
                  name:
                    i == 'placeOtherVal'
                      ? '未用库位数'
                      : i == 'placeVal'
                      ? '已用库位数'
                      : i == 'placeRate'
                      ? '使用率'
                      : i,
                  value: element[i]
                });
              } else if (i == 'placeType') {
                pielist[index].titel = element[i];
              } else if (i == 'placeRate') {
                pielist[index].placeRate = element[i];
              }
            }
          });
          this.chartData = pielist;
          console.log(this.chartData);
        }
      });
    },
    //获取零件的出入库数量
    GetHomeBarItemData() {
      let time = {
        startTime: this.datatime ? this.datatime[0] : '',
        endTime: this.datatime ? this.datatime[1] : ''
      };
      this.BarItemlineshow = false;
      GetHomeBarItemData(time).then(res => {
        this.BarItemlinelist = res.data;
        this.BarItemlineshow = true;
      });
    },
    //获取器具的出入库数量
    GetHomeBarContainerData() {
      let time = {
        startTime: this.datatime ? this.datatime[0] : '',
        endTime: this.datatime ? this.datatime[1] : ''
      };
      this.$Loading(true);
      this.Containerline = false;
      GetHomeBarContainerData(time).then(res => {
        this.Containerlinelist = res.data;
        this.Containerline = true;
        this.$Loading();
      });
    },
    //跳转大屏
    linkTo() {
      const { href } = this.$router.resolve({
        path: '/output'
      });
      window.open(href, '_blank');
    },
    //导出
    derive() {
      let tabledata = [];
      let tHeader = [];
      let filterVal = [];
      Didproject.forEach(item => {
        tHeader.push(item.columnDescription);
        filterVal.push(item.columnName);
      });
      this.$Loading(true);
      GetHomeNumDataByDate({ stDate: this.daterange[0], edDate: this.daterange[1] }).then(res => {
        if (res.code == 0) {
          let data = res.data;
          data.forEach((element, index) => {
            tabledata.push({
              time: getimestampDate(element.time)
            });
            element.homeNumDataEntityList.forEach(item => {
              Didproject.forEach(vl => {
                if (item.titel == vl.columnDescription) {
                  tabledata[index][vl.columnName] = item.value;
                }
              });
            });
          });
          exportTableList(tHeader, filterVal, tabledata, '库存数据' + getymdhms());
          this.$Loading(false);
        }
      });
    },
    getWarnings(callback) {
      GetWarnings()
        .then(d => {
          if (d.code === 0) {
            this.noticeData = d.data || [];
            this.noticeVisible = true;
            callback(true);
          } else {
            callback(false);
          }
          console.log('kklkljj', d);
        })
        .catch(() => {
          callback(false);
        });
    }
  },
  beforeDestroy() {
    if (this.clearIntervaltime) {
      clearInterval(this.clearIntervaltime);
      this.clearIntervaltime = null;
    }
  }
};
</script>
<style lang="scss" scoped>
#Didproject {
  position: relative;
  .did-echarts {
    height: 200px;
  }
  .echart-height {
    height: 300px;
    margin: 1% auto 2%;
    overflow: hidden;
  }
}
</style>
qqjf-Web/src/views/Home/components/lefttop.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
<template>
  <div class="width">
    <p class="colorfff fontsiez1rem padding10">{{ navobj.titel }}</p>
    <div class="width flex justify-around">
      <div
        class="colorfff borderdashed borderradius padding1016"
        v-for="(item, index) in navobj.list"
        :key="index + 'navobj'"
      >
        <p class="margin4auto">{{ item.titel }}</p>
        <count-to :startVal="0" :endVal="item.value" :duration="3000"></count-to>
      </div>
    </div>
  </div>
</template>
<script>
import countTo from 'vue-count-to';
import { GetStorageOverviewData } from '@/api/Didproject';
export default {
  data() {
    return {
      startVal: 0,
      cleartime: null
    };
  },
  props: {
    navobj: {
      type: Object,
      default: () => {}
    }
  },
  components: { countTo },
  mounted() {
    this.GetStorageOverviewData();
    this.cleartime = setInterval(() => {
      this.GetStorageOverviewData();
    }, 60000);
  },
  methods: {
    //立库总览和制件总览
    GetStorageOverviewData() {
      // no ç¼–号;title æ ‡é¢˜ï¼›value æ•°é‡
      GetStorageOverviewData().then(res => {
        let data = res.data || [];
        this.navobj.list.forEach(item => {
          data.forEach(element => {
            if (item.titel == element.titel) {
              item.value = element.value;
            }
          });
        });
      });
    }
  },
  beforeDestroy() {
    if (this.cleartime) {
      clearInterval(this.cleartime);
      this.cleartime = null;
    }
  }
};
</script>
<style></style>
qqjf-Web/src/views/Home/components/meterEchart.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,273 @@
<template>
  <div class="chart-wrapper" ref="sourmeterLine"></div>
</template>
<script>
import resize from '@/mixins/resize';
const echarts = require('echarts');
export default {
  name: 'sourmeterLine',
  props: {
    chartData: {
      type: Object,
      default: () => {}
    },
    colorList: {
      type: Array,
      default: () => []
    },
    colors: {
      type: String,
      default: '#636972'
    },
        yTotals:{
            type:Number,
            default:-1
        }
  },
  mixins: [resize],
  data() {
    return {};
  },
  mounted() {
    this.initEchart();
  },
  methods: {
    initEchart() {
      // åŸºäºŽå‡†å¤‡å¥½çš„dom,初始化echarts实例
      let serieslist = [];
      let data = this.chartData.data;
      if (data) {
        data.forEach((element, index) => {
                    let nObj = {
            name: element.name,
            type: index == 0 ? 'line' : 'bar',
            smooth: true,
            yAxisIndex: index,
            // symbol: index == 1 ? 'circle' : '',
            symbolSize: 12,
            // ä¿®æ”¹çš„æ˜¯çº¿çš„颜色
            lineStyle: {
              color: {
                type: 'linear',
                x: 0,
                y: 1,
                x2: 0,
                y2: 0,
                // 0% å¤„的颜色                           // 100% å¤„的颜色
                colorStops: [
                  { offset: 0, color: '#66d4fa' },
                  { offset: 0.25, color: '#66d4fa' },
                  { offset: 0.75, color: '#66d4fa' },
                  { offset: 1, color: '#66d4fa' }
                ],
                global: false // ç¼ºçœä¸º false
              },
              width: 10
            },
            //修改柱状图颜色
            itemStyle: {
              normal: {
                // barBorderRadius: 5,
                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                  { offset: 0, color: '#00CA69' },
                  { offset: 1, color: '#3EACE5' }
                ])
              }
            },
            areaStyle: {
              normal: {
                color: new echarts.graphic.LinearGradient(
                  0,
                  0,
                  0,
                  1,
                  [
                    {
                      offset: 0,
                      color: 'rgba(236, 99, 123, 0)'
                    },
                    {
                      offset: 1,
                      color: 'rgba(102, 212, 250,.0)'
                    }
                  ],
                  false
                ),
                shadowColor: '#636972',
                shadowBlur: 1
              }
            },
            data: element.xdata
          }
                    console.log('nObj',nObj)
          serieslist.push(nObj);
        });
      }
      this.myChart = echarts.init(this.$refs.sourmeterLine);
      let splitNumber = 5; // åˆ†å‰²æ®µ
            let thisOpt = {
                title: {
                    show: true,
                    text: '任务节拍分析',
                    x: 'center',
                    y: '0%',
                    textAlign: null, //水平对齐方式,默认根据x设置自动调整,可选为: left' | 'right' | 'center
                    textStyle: {
                        //主标题文本样式{"fontSize": 18,"fontWeight": "bolder",}
                        color: this.colors,
                        fontWeight: 'normal',
                        fontSize: 50,
                        fontFamily: 'time_new_Roma'
                    }
                },
                color: this.colorList,
                legend: {
                    right: '0%',
                    top: '0%',
                    textStyle: {
                        color: this.colors,
                        fontSize: 36
                    }
                },
                tooltip: {
                    trigger: 'axis',
                    textStyle: {
                        fontSize: 36
                    },
                    axisPointer: {
                        type: 'shadow'
                    },
                    formatter: '{b}<br />{a0}: {c0}%<br />{a1}: {c1}'
                },
                grid: {
                    left: '1%',
                    right: '1%',
                    bottom: '1%',
                    top: '15%',
                    //    padding:'0 0 10 0',
                    containLabel: true
                },
                xAxis: [
                    {
                        type: 'category',
                        axisLabel: {
                            interval: 0, //设置为 1,表示『隔一个标签显示一个标签』
                            textStyle: {
                                fontSize: 36
                            },
                            width:100,
                            overflow:'truncate'
                        },
                        axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
                        splitLine: {show: false},
                        data: this.chartData.xdata
                    }
                ],
                yAxis: [
                    {
                        type: 'value',
                        splitNumber: splitNumber,
                        position: 'left',
                        // min: function (value) {
                        //   return value.min - 10;
                        // },
                        axisLabel: {
                            textStyle: {
                                fontSize: 36
                            },
                            formatter: '{value}%'
                        },
                        axisLine: {
                            lineStyle: {
                                color: this.colors,
                                width: 10
                            }
                        },
                        axisTick: {
                            show: false
                        },
                        splitLine: {
                            show: false,
                            lineStyle: {
                                color: this.colors,
                                width: 10
                            }
                        }
                    },
                    {
                        type: 'value',
                        splitNumber: splitNumber,
                        position: 'right',
                        min: function (value) {
                            let max = value.max;
                            let min = value.min;
                            let minimum = max - ((max - min) * 3) / 2;
                            if (minimum > 0) {
                                return minimum;
                            } else {
                                return 0;
                            }
                        },
                        axisLabel: {
                            textStyle: {
                                fontSize: 36
                            },
                            formatter: '{value}'
                        },
                        axisLine: {
                            lineStyle: {
                                color: this.colors,
                                width: 10
                            }
                        },
                        axisTick: {
                            show: false
                        },
                        splitLine: {
                            show: true,
                            lineStyle: {
                                color: this.colors,
                                width: 10
                            }
                        }
                    }
                ],
                dataZoom: [
                    {
                        type: 'inside',
                        startValue: 0,
                        endValue: 7
                    }
                ],
                series: serieslist
            }
            console.log('serieslist',serieslist)
            thisOpt.dataZoom[0].endValue = thisOpt.xAxis[0].data.length - 1;
            thisOpt.yAxis[0].max = 100
            if (this.yTotals>0) {
                thisOpt.yAxis[1].max = this.yTotals
            }
            console.log(thisOpt)
      this.myChart.setOption(
        thisOpt,
        true
      );
    }
  },
  watch: {
    chartData: {
      handler() {
        this.initEchart();
      },
      deep: true
    }
  }
};
</script>
qqjf-Web/src/views/Home/components/movablerateechart.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,206 @@
<template>
  <div class="chart-wrapper" ref="movablerateLine"></div>
</template>
<script>
import resize from '@/mixins/resize';
const echarts = require('echarts');
export default {
  name: 'movablerateLine',
  props: {
    echarttitle: {
      type: String,
      default: ''
    },
    chartData: {
      type: Object,
      default: () => {}
    },
    colorList: {
      type: Array,
      default: () => []
    },
    colors: {
      type: String,
      default: '#636972'
    }
  },
  mixins: [resize],
  data() {
    return {};
  },
  mounted() {
    this.initEchart();
  },
  methods: {
    initEchart() {
      // åŸºäºŽå‡†å¤‡å¥½çš„dom,初始化echarts实例
      let serieslist = [];
      let data = this.chartData.data;
      if (data) {
        data.forEach((element, index) => {
          serieslist.push({
            name: element.name,
            type: 'line',
            smooth: false, //true:圆滑,false:折现
            barMaxWidth: 30,
            // ä¿®æ”¹çš„æ˜¯çº¿çš„颜色
            lineStyle: {
              width: 10,
              color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
                {
                  offset: 0,
                  color: this.colorList[index]
                },
                {
                  offset: 1,
                  color: this.colorList[index]
                }
              ])
              // shadowColor: 'rgba(0,0,0, 0.3)',
              // shadowBlur: 10,
              // shadowOffsetY: 20
            },
            data: element.xdata
            // label: {
            //   show: true,
            //   position: 'top',
            //   distance: 10,
            //   fontSize: 18,
            //   color: this.colors
            // }
          });
        });
      }
      this.myChart = echarts.init(this.$refs.movablerateLine);
      this.myChart.setOption(
        {
          title: {
            show: true,
            text: this.echarttitle,
            x: 'center',
            y: '0%',
            textAlign: null, //水平对齐方式,默认根据x设置自动调整,可选为: left' | 'right' | 'center
            textStyle: {
              //主标题文本样式{"fontSize": 18,"fontWeight": "bolder",}
              color: this.colors,
              fontWeight: 'normal',
              fontSize: 50
            }
          },
          color: this.colorList,
          legend: {
            right: 10,
            top: '15%',
            textStyle: {
              color: this.colors,
              fontSize: 24
            }
          },
          tooltip: {
            trigger: 'axis',
            position: function (pos, params, dom, rect, size) {
              var obj = { bottom: '5%' };
              obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 5;
              return obj;
            },
            axisPointer: {
              type: 'shadow'
            },
            textStyle: {
              fontSize: 36
            }
          },
          grid: {
            left: '1%',
            right: '4%',
            bottom: '1%',
            top: '30%',
            //    padding:'0 0 10 0',
            containLabel: true
          },
          xAxis: [
            {
              type: 'category',
              axisLabel: {
                interval: 0, //设置为 1,表示『隔一个标签显示一个标签』
                margin: 10,
                textStyle: {
                  fontSize: 36
                }
              },
              axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
              splitLine: {
                show: false,
                lineStyle: { color: this.colors, width: 1 }
              },
              axisTick: {
                show: false
              },
              data: this.chartData.xdata
            }
          ],
          yAxis: [
            {
              type: 'value',
              splitNumber: 5,
              min: function (value) {
                let max = value.max;
                let min = value.min;
                let minimum = max - ((max - min) * 3) / 2;
                if (minimum > 0) {
                  return minimum;
                } else {
                  return 0;
                }
              },
              axisLabel: {
                textStyle: {
                  fontSize: 36
                },
                formatter: '{value} %'
              },
              axisLine: {
                lineStyle: {
                  color: this.colors,
                  width: 10
                }
              },
              axisTick: {
                show: false
              },
              splitLine: {
                show: true,
                lineStyle: {
                  color: this.colors,
                  width: 10
                }
              }
            }
          ],
          dataZoom: [
            {
              type: 'inside',
              startValue: 10,
              endValue: 20
            }
          ],
          series: serieslist
        },
        true
      );
    }
  },
  watch: {
    chartData: {
      handler() {
        this.initEchart();
      },
      deep: true
    }
  }
};
</script>
qqjf-Web/src/views/Home/components/product.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,202 @@
<template>
  <div class="chart-wrapper" ref="product"></div>
</template>
<script>
import resize from '@/mixins/resize';
const echarts = require('echarts');
export default {
  name: 'product',
  props: {
    echarttitle: {
      type: String,
      default: ''
    },
    chartData: {
      type: Object,
      default: () => {}
    },
    colors: {
      type: String,
      default: '#636972'
    },
    colorList: {
      type: Array,
      default: () => []
    }
  },
  mixins: [resize],
  data() {
    return {};
  },
  mounted() {
    this.initEchart();
  },
  methods: {
    initEchart() {
      // åŸºäºŽå‡†å¤‡å¥½çš„dom,初始化echarts实例
      let serieslist = [];
      let data = this.chartData.data;
      if (data) {
        data.forEach((element, index) => {
          serieslist.push({
            name: element.name,
            type: 'line',
            smooth: true,
            barMaxWidth: 30,
            // ä¿®æ”¹çš„æ˜¯çº¿çš„颜色
            lineStyle: {
              width: 10,
              color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
                {
                  offset: 0,
                  color: this.colorList[index]
                },
                {
                  offset: 1,
                  color: this.colorList[index]
                }
              ])
              // shadowColor: 'rgba(0,0,0, 0.3)',
              // shadowBlur: 10,
              // shadowOffsetY: 20
            },
            data: element.xdata
            // label: {
            //   show: true,
            //   position: 'top',
            //   distance: 10,
            //   fontSize: 18,
            //   color: this.colors
            // }
          });
        });
      }
      this.myChart = echarts.init(this.$refs.product);
      this.myChart.setOption(
        {
          title: {
            show: true,
            text: '在制品资金分析',
            x: 'center',
            y: '0%',
            textAlign: null, //水平对齐方式,默认根据x设置自动调整,可选为: left' | 'right' | 'center
            textStyle: {
              //主标题文本样式{"fontSize": 18,"fontWeight": "bolder",}
              color: this.colors,
              fontWeight: 'normal',
              fontSize: 50
            }
          },
          color: this.colorList,
          legend: {
            right: '1%',
            top: '10%',
            textStyle: {
              fontSize: 36,
              color: this.colors
            }
          },
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'shadow'
            },
            textStyle: {
              fontSize: 36
            }
          },
          grid: {
            left: '2%',
            right: '1%',
            bottom: '2%',
            top: '20%',
            //    padding:'0 0 10 0',
            containLabel: true
          },
          xAxis: [
            {
              type: 'category',
              axisLabel: {
                interval: 0, //设置为 1,表示『隔一个标签显示一个标签』
                margin: 10,
                textStyle: {
                  fontSize: 36
                }
              },
              axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
              splitLine: {
                show: false,
                lineStyle: { color: this.colors, width: 1 }
              },
              axisTick: {
                show: false
              },
              data: this.chartData.xdata
            }
          ],
          yAxis: [
            {
              name: '金额(百万元)',
              nameTextStyle: { fontSize: 36 },
              type: 'value',
              splitNumber: 5,
              min: function (value) {
                let max = value.max;
                let min = value.min;
                let minimum = max - ((max - min) * 3) / 2;
                if (minimum > 0) {
                  return minimum;
                } else {
                  return 0;
                }
              },
              axisLabel: {
                textStyle: {
                  fontSize: 36
                }
              },
              axisLine: {
                lineStyle: {
                  color: this.colors,
                  width: 10
                }
              },
              axisTick: {
                show: false
              },
              splitLine: {
                show: true,
                lineStyle: {
                  color: this.colors,
                  width: 10
                }
              }
            }
          ],
          dataZoom: [
            {
              type: 'inside',
              startValue: 10,
              endValue: 20
            }
          ],
          series: serieslist
        },
        true
      );
    }
  },
  watch: {
    chartData: {
      handler() {
        this.initEchart();
      },
      deep: true
    }
  }
};
</script>
qqjf-Web/src/views/Home/components/rateequipment.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,204 @@
<template>
  <div class="chart-wrapper" ref="movablerateLine"></div>
</template>
<script>
import resize from '@/mixins/resize';
const echarts = require('echarts');
export default {
  name: 'movablerateLine',
  props: {
    echarttitle: {
      type: String,
      default: ''
    },
    chartData: {
      type: Object,
      default: () => {}
    },
    colors: {
      type: String,
      default: '#636972'
    },
    colorList: {
      type: Array,
      default: () => []
    }
  },
  mixins: [resize],
  data() {
    return {};
  },
  mounted() {
    this.initEchart();
  },
  methods: {
    initEchart() {
      // åŸºäºŽå‡†å¤‡å¥½çš„dom,初始化echarts实例
      let serieslist = [];
      let data = this.chartData.data;
      if (data) {
        data.forEach((element, index) => {
          serieslist.push({
            name: element.name,
            type: 'line',
            smooth: false,
            barMaxWidth: 30,
            // ä¿®æ”¹çš„æ˜¯çº¿çš„颜色
            lineStyle: {
              width: 10,
              color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
                {
                  offset: 0,
                  color: this.colorList[index]
                },
                {
                  offset: 1,
                  color: this.colorList[index]
                }
              ])
              // shadowColor: 'rgba(0,0,0, 0.3)',
              // shadowBlur: 10,
              // shadowOffsetY: 20
            },
            data: element.xdata
            // label: {
            //   show: true,
            //   position: 'top',
            //   distance: 10,
            //   fontSize: 18,
            //   color: this.colors
            // }
          });
        });
      }
      this.myChart = echarts.init(this.$refs.movablerateLine);
      this.myChart.setOption(
        {
          title: {
            show: true,
            text: this.echarttitle,
            x: 'center',
            y: '0%',
            textAlign: null, //水平对齐方式,默认根据x设置自动调整,可选为: left' | 'right' | 'center
            textStyle: {
              //主标题文本样式{"fontSize": 18,"fontWeight": "bolder",}
              color: this.colors,
              fontWeight: 'normal',
              fontSize: 50
            }
          },
          color: this.colorList,
          legend: {
            right: 10,
            top: '15%',
            textStyle: {
              color: this.colors,
              fontSize: 36
            }
          },
          tooltip: {
            trigger: 'axis',
            position: function (pos, params, dom, rect, size) {
              var obj = { bottom: '5%' };
              obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 5;
              return obj;
            },
            axisPointer: {
              type: 'shadow'
            },
            textStyle: {
              fontSize: 36
            }
          },
          grid: {
            left: '1%',
            right: '4%',
            bottom: '1%',
            top: '30%',
            //    padding:'0 0 10 0',
            containLabel: true
          },
          xAxis: [
            {
              type: 'category',
              axisLabel: {
                interval: 0, //设置为 1,表示『隔一个标签显示一个标签』
                margin: 10,
                textStyle: {
                  fontSize: 36
                }
              },
              axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
              splitLine: {
                show: false,
                lineStyle: { color: this.colors, width: 10 }
              },
              axisTick: {
                show: false
              },
              data: this.chartData.xdata
            }
          ],
          yAxis: [
            {
              type: 'value',
              splitNumber: 5,
              min: function (value) {
                let max = value.max;
                let min = value.min;
                let minimum = max - ((max - min) * 3) / 2;
                if (minimum > 0) {
                  return minimum;
                } else {
                  return 0;
                }
              },
              axisLabel: {
                textStyle: {
                  fontSize: 36
                },
                formatter: '{value} %'
              },
              axisLine: {
                lineStyle: {
                  color: this.colors,
                  width: 10
                }
              },
              axisTick: {
                show: false
              },
              splitLine: {
                show: true,
                lineStyle: {
                  color: this.colors,
                  width: 10
                }
              }
            }
          ],
          dataZoom: [
            {
              type: 'inside',
              startValue: 1,
              endValue: 20
            }
          ],
          series: serieslist
        },
        true
      );
    }
  },
  watch: {
    chartData: {
      handler() {
        this.initEchart();
      },
      deep: true
    }
  }
};
</script>
qqjf-Web/src/views/Home/components/sourceEchart.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
<template>
  <div class="chart-wrapper" ref="sourcePie"></div>
</template>
<script>
import resize from '@/mixins/resize';
const echarts = require('echarts');
export default {
  name: 'sourcePie',
  props: {
    chartData: {
      type: Object
    },
    titleechart: {
      type: String,
      default: ''
    },
    colors: {
      type: String,
      default: '#636972'
    }
  },
  mixins: [resize],
  data() {
    return {};
  },
  mounted() {
    this.initEchart();
  },
  methods: {
    initEchart() {
      var colorList = ['#569ada', '#f47b2a', '#a1a1a1', '#ffc61f', '#3a6cc6', '#6cae3f', '#1e5c94'];
      // åŸºäºŽå‡†å¤‡å¥½çš„dom,初始化echarts实例
      let seriesData = [];
      if (this.chartData.data) {
        this.chartData.data.forEach(element => {
          seriesData.push({
            name: element.name,
            value: element.data
          });
        });
      }
      this.myChart = echarts.init(this.$refs.sourcePie);
      this.myChart.setOption(
        {
          title: {
            show: true, //显示策略,默认值true,可选为:true(显示) | false(隐藏)
            text: this.titleechart, //主标题文本,'\n'指定换行
            x: 'center', //水平安放位置,默认为'left',可选为:'center' | 'left' | 'right' | {number}(x坐标,单位px)
            y: '2%', //垂直安放位置,默认为top,可选为:'top' | 'bottom' | 'center' | {number}(y坐标,单位px)
            textAlign: null, //水平对齐方式,默认根据x设置自动调整,可选为: left' | 'right' | 'center
            textStyle: {
              //主标题文本样式{"fontSize": 18,"fontWeight": "bolder",}
              color: this.colors,
              fontWeight: 'normal',
              fontSize: 50
            }
          },
          tooltip: {
            trigger: 'item',
            borderWidth: 1,
            padding: 5,
            formatter: function (parms) {
              var str = parms.marker + '' + parms.data.name + '</br>' + '占比:' + parms.percent + '%';
              return str;
            }
          },
          legend: [
            {
              type: 'plain',
              bottom: '12%',
              itemGap: 20,
              textStyle: {
                fontSize: 24,
                color: this.colors
              },
              data: this.chartData.legend
            }
          ],
          series: [
            {
              type: 'pie',
              center: ['50%', '40%'],
              radius: ['35%', '50%'],
              label: {
                show: true,
                position: 'outside',
                textStyle: {
                  fontSize: 28,
                  color: this.colors
                }
              },
              labelLine: {
                show: true,
                normal: {
                  length: 20,
                  length2: 30,
                  lineStyle: {
                    width: 1
                  }
                }
              },
              data: seriesData
            }
          ]
        },
        true
      );
    }
  },
  watch: {
    chartData: {
      handler() {
        this.initEchart();
      },
      deep: true
    }
  }
};
</script>
qqjf-Web/src/views/Home/components/tasktimeecharts.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,210 @@
<template>
  <div class="chart-wrapper" ref="tasktimeecharts"></div>
</template>
<script>
import resize from '@/mixins/resize';
const echarts = require('echarts');
export default {
  name: 'tasktimeecharts',
  props: {
    chartData: {
      type: Object,
      default: () => {}
    },
    colorList: {
      type: Array,
      default: () => []
    },
    colors: {
      type: String,
      default: '#636972'
    }
  },
  mixins: [resize],
  data() {
    return {};
  },
  mounted() {
    this.initEchart();
  },
  methods: {
    initEchart() {
      // åŸºäºŽå‡†å¤‡å¥½çš„dom,初始化echarts实例
      let serieslist = [];
      let data = this.chartData.data;
      if (data) {
        data.forEach((element, index) => {
          serieslist.push({
            name: element.name,
            type: 'line',
            smooth: true,
            // ä¿®æ”¹çš„æ˜¯çº¿çš„颜色
            lineStyle: {
              width: 10
            },
            // areaStyle: {
            //   normal: {
            //     barBorderRadius: [5, 5, 0, 0],
            //     color: new echarts.graphic.LinearGradient(
            //       0,
            //       0,
            //       0,
            //       1,
            //       [
            //         {
            //           offset: 0,
            //           color: this.colorList[index]
            //           // color: 'rgba(236, 99, 123, .5)'
            //         },
            //         {
            //           offset: 1,
            //           color: 'rgba(102, 212, 250,0)'
            //         }
            //       ],
            //       false
            //     ),
            //     shadowColor: '#636972',
            //     shadowBlur: 1
            //   }
            // },
            data: element.xdata
            // label: {
            //   show: true,
            //   position: 'top',
            //   distance: 10,
            //   fontSize: 18,
            //   color: this.colors
            // }
          });
        });
      }
      this.myChart = echarts.init(this.$refs.tasktimeecharts);
      this.myChart.setOption(
        {
          title: {
            show: true,
            text: '出入库任务平均时长(分钟)',
            x: 'center',
            y: '2%',
            textAlign: null, //水平对齐方式,默认根据x设置自动调整,可选为: left' | 'right' | 'center
            textStyle: {
              //主标题文本样式{"fontSize": 18,"fontWeight": "bolder",}
              color: this.colors,
              fontWeight: 'normal',
              fontSize: 50
            }
          },
          // color: this.colorList,
          legend: {
            right: '1%',
            top: '10%',
            textStyle: {
              color: this.colors,
              fontSize: 36
            }
          },
          tooltip: {
            trigger: 'axis',
            // formatter: '{b0}: {c0}<br />{b1}: {c1}<br />{b2}: {c2}',
            axisPointer: {
              type: 'shadow'
            },
            textStyle: {
              fontSize: 36
            }
          },
          grid: {
            left: '2%',
            right: '1%',
            bottom: '1%',
            top: '20%',
            //    padding:'0 0 10 0',
            containLabel: true
          },
          xAxis: [
            {
              type: 'category',
              axisLabel: {
                interval: 0, //设置为 1,表示『隔一个标签显示一个标签』
                margin: 10,
                textStyle: {
                  fontSize: 36
                }
              },
              axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
              splitLine: {
                show: false,
                lineStyle: { color: this.colors, width: 1 }
              },
              axisTick: {
                show: false
              },
              data: this.chartData.xdata
            }
          ],
          yAxis: [
            {
              name: '时间(分钟)',
              nameTextStyle: { fontSize: 24 },
              type: 'value',
              splitNumber: 5,
              min: function (value) {
                let max = value.max;
                let min = value.min;
                let minimum = max - ((max - min) * 3) / 2;
                if (minimum > 0) {
                  return minimum;
                } else {
                  return 0;
                }
              },
              axisLabel: {
                textStyle: {
                  fontSize: 36
                }
              },
              axisLine: {
                lineStyle: {
                  color: this.colors,
                  width: 10
                }
              },
              axisTick: {
                show: false
              },
              splitLine: {
                show: true,
                lineStyle: {
                  color: this.colors,
                  width: 10
                }
              }
            }
          ],
          dataZoom: [
            {
              type: 'inside',
              startValue: 10,
              endValue: 20
            }
          ],
          series: serieslist
        },
        true
      );
    }
  },
  watch: {
    chartData: {
      handler() {
        this.initEchart();
      },
      deep: true
    }
  }
};
</script>
qqjf-Web/src/views/Home/components/turnoverEchart.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,207 @@
<template>
  <div class="chart-wrapper" ref="turnoverLine"></div>
</template>
<script>
import resize from '@/mixins/resize';
const echarts = require('echarts');
export default {
  name: 'turnoverLine',
  props: {
    chartData: {
      type: Object,
      default: () => {}
    },
    colorList: {
      type: Array,
      default: () => []
    },
    colors: {
      type: String,
      default: '#636972'
    }
  },
  mixins: [resize],
  data() {
    return {};
  },
  mounted() {
    this.initEchart();
  },
  methods: {
    initEchart() {
      // åŸºäºŽå‡†å¤‡å¥½çš„dom,初始化echarts实例
      let serieslist = [];
      let data = this.chartData.data;
      if (data) {
        data.forEach((element, index) => {
          serieslist.push({
            name: element.name,
            type: 'bar',
            showBackground: false,
            barBorderRadius: 30,
            yAxisIndex: 0,
            barMaxWidth: 30,
            itemStyle: {
              normal: {
                color: new echarts.graphic.LinearGradient(
                  0,
                  1,
                  1,
                  0,
                  [
                    {
                      offset: 0,
                      color: this.colorList[index]
                    },
                    {
                      offset: 1,
                      color: this.colorList[index]
                    }
                  ],
                  false
                ),
                barBorderRadius: 10
              },
              barBorderRadius: 4
            },
            data: element.xdata,
            label: {
              show: true,
              position: 'top',
              distance: 10,
              fontSize: 36,
              color: this.colors
            }
          });
        });
      }
      this.myChart = echarts.init(this.$refs.turnoverLine);
      this.myChart.setOption(
        {
          title: {
            show: true,
            text: data ? '制件周转时间' : '暂无数据',
            x: 'center',
            y: data ? '2%' : 'center',
            textAlign: null, //水平对齐方式,默认根据x设置自动调整,可选为: left' | 'right' | 'center
            textStyle: {
              //主标题文本样式{"fontSize": 18,"fontWeight": "bolder",}
              color: this.colors,
              fontWeight: 'normal',
              fontSize: 50
            }
          },
          color: this.colorList,
          legend: {
            right: '1%',
            top: '10%',
            textStyle: {
              color: this.colors,
              fontSize: 36
            }
          },
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'shadow'
            },
            textStyle: {
              fontSize: 36
            }
          },
          grid: {
            left: '5%',
            right: '1%',
            bottom: '1%',
            top: '20%',
            //    padding:'0 0 10 0',
            containLabel: true
          },
          xAxis: [
            {
              type: 'category',
              axisLabel: {
                interval: 0, //设置为 1,表示『隔一个标签显示一个标签』
                margin: 10,
                textStyle: {
                  fontSize: 16
                }
              },
              axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
              splitLine: {
                show: false,
                lineStyle: { color: this.colors, width: 10 }
              },
              axisTick: {
                show: false
              },
              data: this.chartData.xdata
            }
          ],
          yAxis: [
            {
              name: '周转天数(天)',
              nameTextStyle: { fontSize: 28 },
              type: 'value',
              splitNumber: 5,
              min: function (value) {
                let max = value.max;
                let min = value.min;
                let minimum = max - ((max - min) * 3) / 2;
                if (minimum > 0) {
                  return minimum;
                } else {
                  return 0;
                }
              },
              axisLabel: {
                textStyle: {
                  fontSize: 36
                }
              },
              axisLine: {
                lineStyle: {
                  color: this.colors,
                  width: 10
                }
              },
              axisTick: {
                show: false
              },
              splitLine: {
                show: true,
                lineStyle: {
                  color: this.colors,
                  width: 10
                }
              }
            }
          ],
          dataZoom: [
            {
              type: 'inside',
              startValue: 10,
              endValue: 20
            }
          ],
          series: serieslist
        },
        true
      );
    }
  },
  watch: {
    chartData: {
      handler() {
        this.initEchart();
      },
      deep: true
    }
  }
};
</script>
qqjf-Web/src/views/Home/components/warehouseechart.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,235 @@
<template>
  <div class="chart-wrapper" ref="warehouseLine"></div>
</template>
<script>
import resize from '@/mixins/resize';
const echarts = require('echarts');
export default {
  name: 'warehouseLine',
  props: {
    chartData: {
      type: Object,
      default: () => {}
    },
    colorList: {
      type: Array,
      default: () => []
    },
    colors: {
      type: String,
      default: '#636972'
    }
  },
  mixins: [resize],
  data() {
    return {};
  },
  mounted() {
    this.initEchart();
  },
  methods: {
    initEchart() {
      // åŸºäºŽå‡†å¤‡å¥½çš„dom,初始化echarts实例
      let serieslist = [];
      let data = this.chartData.data;
      if (data) {
        // data.forEach(element => {
        serieslist.push(
          {
            name: data[0].name,
            type: 'bar',
            showBackground: false,
            barBorderRadius: 30,
            yAxisIndex: 0,
            barMaxWidth: 30,
            itemStyle: {
              normal: {
                color: new echarts.graphic.LinearGradient(
                  0,
                  1,
                  1,
                  0,
                  [
                    {
                      offset: 0,
                      color: '#A71A2B'
                    },
                    {
                      offset: 1,
                      color: '#A71A2B'
                    }
                  ],
                  false
                ),
                barBorderRadius: 10
              },
              // color: '#A71A2B',
              barBorderRadius: 4
            },
            data: data[0].xdata,
            label: {
              show: true,
              position: 'top',
              distance: 10,
              fontSize: 18,
              color: this.colors
            }
          }
          // {
          //   name: data[1].name,
          //   type: 'line',
          //   smooth: true,
          //   barMaxWidth: 30,
          //   // ä¿®æ”¹çš„æ˜¯çº¿çš„颜色
          //   lineStyle: {
          //     color: {
          //       type: 'linear',
          //       x: 0,
          //       y: 1,
          //       x2: 0,
          //       y2: 0,
          //       // 0% å¤„的颜色                           // 100% å¤„的颜色
          //       colorStops: [
          //         { offset: 0, color: '#f8d470' },
          //         { offset: 0.25, color: '#f8d470' },
          //         { offset: 0.75, color: '#f8d470' },
          //         { offset: 1, color: '#f8d470' }
          //       ],
          //       global: false // ç¼ºçœä¸º false
          //     },
          //     width: 10
          //   },
          //   data: data[1].xdata
          // }
        );
      }
      this.myChart = echarts.init(this.$refs.warehouseLine);
      this.myChart.setOption(
        {
          title: {
            show: true,
            text: '货格利用率',
            x: 'center',
            y: '2%',
            textAlign: null, //水平对齐方式,默认根据x设置自动调整,可选为: left' | 'right' | 'center
            textStyle: {
              //主标题文本样式{"fontSize": 18,"fontWeight": "bolder",}
              color: this.colors,
              fontWeight: 'normal',
              fontSize: 50
            }
          },
          color: this.colorList,
          legend: {
            right: '1%',
            top: '10%',
            textStyle: {
              color: this.colors,
              fontSize: 36
            }
          },
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'shadow'
            },
            textStyle: {
              fontSize: 36
            }
          },
          grid: {
            left: '1%',
            right: '1%',
            bottom: '1%',
            top: '20%',
            //    padding:'0 0 10 0',
            containLabel: true
          },
          xAxis: [
            {
              type: 'category',
              axisLabel: {
                interval: 0, //设置为 1,表示『隔一个标签显示一个标签』
                margin: 10,
                textStyle: {
                  fontSize: 36
                }
              },
              axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
              splitLine: {
                show: false,
                lineStyle: { color: this.colors, width: 10 }
              },
              axisTick: {
                show: false
              },
              data: this.chartData.xdata
            }
          ],
          yAxis: [
            {
              type: 'value',
              splitNumber: 5,
              min: function (value) {
                let max = value.max;
                let min = value.min;
                let minimum = max - ((max - min) * 3) / 2;
                if (minimum > 0) {
                  return minimum;
                } else {
                  return 0;
                }
              },
              axisLabel: {
                textStyle: {
                  fontSize: 36
                },
                formatter: '{value} %'
              },
              axisLine: {
                lineStyle: {
                  color: this.colors,
                  width: 10
                }
              },
              axisTick: {
                show: false
              },
              splitLine: {
                show: true,
                lineStyle: {
                  color: this.colors,
                  wdith: 10
                }
              }
            }
          ],
          dataZoom: [
            {
              type: 'inside',
              startValue: 10,
              endValue: 20
            }
          ],
          series: serieslist
        },
        true
      );
    }
  },
  watch: {
    chartData: {
      handler() {
        this.initEchart();
      },
      deep: true
    }
  }
};
</script>
qqjf-Web/src/views/Home/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,296 @@
<template>
  <div id="Homes" class="global-content">
    <div class="box-top flex justify-between overflow">
      <div class="top-left">
        <left-top :navobj="topleftobj" />
        <div class="width flex align-center applyheight margin2">
          <class-echart titleechart="零件来源分布" colors="#fff" :chartData="chartData" class="width height" />
          <class-echart titleechart="器具来源分布" colors="#fff" :chartData="applianceData" class="width height" />
        </div>
      </div>
      <div class="top-centent">
        <p class="colorfff padding10 fontsize2rem text-center pointer" @click="clickFullscreen">
          æ™ºèƒ½åŒ–冲压立体库数据中心
        </p>
      </div>
      <div class="top-right">
        <div class="width height48 overflow margin-top10px">
          <movablerate-echart
            colors="#fff"
            class="width height"
            echarttitle="堆垛机"
            :chartData="movalData"
            :colorList="colorList"
          />
        </div>
        <div class="width height48 overflow margin-top10px">
          <movablerate-echart
            colors="#fff"
            class="width height"
            echarttitle="RGV"
            :chartData="rgvdata"
            :colorList="colorList"
          />
        </div>
      </div>
    </div>
    <div class="box-bottom flex justify-between overflow">
      <div class="height width25">
        <tasktime-echart class="width height" colors="#fff" :chartData="tasktimeData" :colorList="colorList" />
      </div>
      <div class="height width25">
        <task-echart class="width height" colors="#fff" :chartData="taskData" :colorList="taskcolorList" />
      </div>
      <div class="height width25">
        <warehouse-echart class="width height" colors="#fff" :chartData="wareData" :colorList="taskcolorList" />
      </div>
      <div class="height width25">
        <turnover-echart class="width height" colors="#fff" :chartData="turnoverData" :colorList="taskcolorList" />
      </div>
    </div>
  </div>
</template>
<script>
import screenfull from 'screenfull';
import { GetDateStr } from '@/utils/date';
import LeftTop from './components/lefttop.vue';
import ClassEchart from './components/sourceEchart.vue'; //制件分类
import TaskEchart from './components/meterEchart.vue'; //任务节拍分析
import MovablerateEchart from './components/movablerateechart.vue'; //设备可动
import TasktimeEchart from './components/tasktimeecharts.vue'; //平均时长
import WarehouseEchart from './components/warehouseechart.vue'; //货格利用率
import TurnoverEchart from './components/turnoverEchart.vue'; //制件周转
import {
  GetStockClassificationData,
  GetInOutAverageTime,
  GetTaskBeatAnalysis,
  GetPartTurnover,
  GetStorageVailability,
  GetDevMovable
} from '@/api/reportforms';
export default {
  data() {
    return {
      topleftobj: {
        titel: '立库总览',
        list: [
          {
            titel: '库位总数',
            value: 0
          },
          {
            titel: '有货库位',
            value: 0
          },
          {
            titel: '带件器具',
            value: 0
          },
          {
            titel: '空器具数',
            value: 0
          },
          {
            titel: '制件总数',
            value: 0
          }
        ]
      },
      toprightobj: {
        titel: '制件总览',
        list: [
          {
            titel: '制件总数',
            value: 100
          },
          {
            titel: '制件种类',
            value: 100
          },
          {
            titel: '今日入库',
            value: 100
          },
          {
            titel: '今日出库',
            value: 100
          }
        ]
      },
      pickertime: [GetDateStr(-15), GetDateStr(0)],
      chartData: {},
      applianceData: {},
      tasktimeData: {},
      taskData: {},
      turnoverData: {},
      wareData: {},
      movalData: {},
      rgvdata: {},
      taskcolorList: ['#0090FF', '#36CE9E', '#FFC005', '#FF515A', '#8B5CFF', '#00CA69'],
      colorList: [
        '#0090FF',
        '#36CE9E',
        '#FFC005',
        '#FF515A',
        '#8B5CFF',
        '#00CA69',
        '#F3A43B',
        '#D7504B',
        '#C6E579',
        '#F0805A',
        '#26C0C0',
        '#660077',
        '#FFCCCC',
        '#550088',
        '#FFFFBB',
        '#99FFFF',
        '#CC00CC',
        '#CC00CC',
        '#C63300',
        '#9955FF',
        '#66FF66',
        '#B5C334',
        '#FCCE10',
        '#27727B',
        '#FE8463',
        '#FAD860',
        '#F3A43B',
        '#D7504B',
        '#C6E579',
        '#F0805A',
        '#26C0C0',
        '#660077',
        '#FFCCCC',
        '#550088',
        '#FFAA33',
        '#CC00CC',
        '#FF77FF',
        '#C63300',
        '#F4E001',
        '#66FF66'
      ]
    };
  },
  components: { LeftTop, ClassEchart, MovablerateEchart, TasktimeEchart, TaskEchart, TurnoverEchart, WarehouseEchart },
  mounted() {
    this.$nextTick(() => {
      this.clickFullscreen();
    });
    this.GetStockClassificationData();
    this.applianceDataficationData();
    this.GetInOutAverageTime();
    this.GetTaskBeatAnalysis();
    this.GetPartTurnover();
    this.GetStorageVailability();
    this.GetDevMovable();
    this.GetRGVDevMovable();
  },
  methods: {
    clickFullscreen() {
      screenfull.toggle();
    },
    //零件来源
    GetStockClassificationData() {
      GetStockClassificationData({ type: 1 }).then(res => {
        this.chartData = res;
      });
    },
    //器具来源
    applianceDataficationData() {
      GetStockClassificationData({ type: 2 }).then(res => {
        this.applianceData = res;
      });
    },
    //平均时长
    GetInOutAverageTime() {
      let startTime = this.pickertime ? this.pickertime[0] : '';
      let endTime = this.pickertime ? this.pickertime[1] : '';
      GetInOutAverageTime({ startTime: startTime, endTime: endTime }).then(res => {
        this.tasktimeData = res;
      });
    },
    //任务节拍
    GetTaskBeatAnalysis() {
      GetTaskBeatAnalysis({ startTime: this.pickertime }).then(res => {
        this.taskData = res;
      });
    },
    //货格利用率
    GetStorageVailability() {
      let objtimes = {
        startTime: this.pickertime ? this.pickertime[0] : '',
        endTime: this.pickertime ? this.pickertime[1] : ''
      };
      GetStorageVailability(objtimes).then(res => {
        this.wareData = res;
      });
    },
    //制件周转·1
    GetPartTurnover() {
      let intimers = {
        year: '',
        month: '',
        stWeek: '',
        edWeek: ''
      };
      GetPartTurnover(intimers).then(res => {
        this.turnoverData = res;
      });
    },
    //堆垛机
    GetDevMovable() {
      let objtimes = {
        startTime: this.pickertime ? this.pickertime[0] : '',
        endTime: this.pickertime ? this.pickertime[1] : '',
        type: 1
      };
      GetDevMovable(objtimes).then(res => {
        this.movalData = res;
      });
    },
    //RGV
    GetRGVDevMovable() {
      let objtimes = {
        startTime: this.pickertime ? this.pickertime[0] : '',
        endTime: this.pickertime ? this.pickertime[1] : '',
        type: 2
      };
      GetDevMovable(objtimes).then(res => {
        this.rgvdata = res;
      });
    }
  }
};
</script>
<style lang="scss" scoped>
#Homes {
  background-color: #1c456b;
  // background: url('../../assets/home/homebg1.jpg') no-repeat;
  // background-size: 100% 100%;
  overflow: hidden;
  .box-top {
    width: 100%;
    height: 64%;
    .top-left {
      width: 28%;
      height: 100%;
    }
    .top-centent {
      width: 42%;
      height: 100%;
    }
    .top-right {
      width: 28%;
      height: 100%;
    }
  }
  .box-bottom {
    width: 100%;
    height: 34%;
    margin-top: 10px;
  }
}
</style>
qqjf-Web/src/views/basicInfo/base/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
<template>
  <router-view />
</template>
<script>
export default {};
</script>
<style></style>
qqjf-Web/src/views/basicInfo/base/stacker/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,159 @@
<template>
  <!-- è®¾å¤‡ç®¡ç† -->
  <div id="stacker" class="global-content">
    <!-- ç­›é€‰ -->
    <base-inquer :dele="false" byfilter="设备名" :filterList="filterList" @addmodal="addmodal" @inquer="inquer" />
    <!-- table -->
    <div class="table">
      <table-container
        :wipelist="wipelist"
        :tableHead="tableHead"
        :tableData="tableData"
        :editShow="true"
        :delShow="false"
        :currentPage="page"
        :pageSize="pageSize"
        :totle="totle"
        @edit="edit"
        @del="del"
        @CurrentChange="CurrentChange"
        @SizeChange="SizeChange"
      />
    </div>
    <transition name="modal">
      <modal v-if="addmodalShow" :modabg="true" @cancel="addmodalShow = false">
        <p slot="title">设备管理-{{ title }}</p>
        <div class="height" slot="centent">
          <stacker-edit @cancel="addmodalShow = false" :rowitem="rowitem" @addsubmit="addsubmit" />
        </div>
      </modal>
    </transition>
  </div>
</template>
<script>
import { TableContainer, Modal } from '@/components/index';
import baseInquer from '../../components/baseinquer';
import stackerEdit from '../../components/stackerEdit';
const { stacker } = require('@/components/tableContainer/tableHead');
import { DeviceSearch, UserDelete } from '@/api/stacker';
export default {
  data() {
    return {
      title: '',
      tableData: [],
      modalShow: false,
      addmodalShow: false,
      wipelist: [],
      inuqerobg: {},
      filterList: [
        {
          value: '设备名',
          label: '设备名'
        },
        {
          value: '设备类型',
          label: '设备类型'
        }
      ],
      rowitem: {},
      totle: 0,
      page: 1,
      pageSize: 20
    };
  },
  components: { TableContainer, baseInquer, Modal, stackerEdit },
  computed: {
    tableHead() {
      return stacker;
    }
  },
  mounted() {
    this.DeviceSearch();
  },
  methods: {
    //查询
    inquer(e) {
      this.inuqerobg = e;
      this.DeviceSearch();
    },
    //搜索用户
    DeviceSearch() {
      this.$Loading(true);
      const { è®¾å¤‡å: deviceName, è®¾å¤‡ç±»åž‹: deviceType } = this.inuqerobg;
      DeviceSearch(this.page + '&onePageNum=' + this.pageSize, { deviceName, deviceType }).then(res => {
        if (res.code == 0) {
          this.tableData = res.data;
          this.totle = res.num;
        }
        this.$Loading();
      });
    },
    CurrentChange(e) {
      console.log(e);
      this.page = e;
      this.DeviceSearch();
    },
    //页数
    SizeChange(e) {
      this.pageSize = e;
      this.DeviceSearch();
    },
    //编辑
    edit(row) {
      this.addmodalShow = true;
      this.rowitem = { ...row };
      this.title = '编辑';
    },
    //删除
    del(row) {
      console.log(row);
      const { USERNAME } = { ...row };
      this.$confirm('此操作将永久删除, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          // UserDelete({ userName: USERNAME }).then(res => {
          //   this.$message({
          //     type: 'success',
          //     message: '删除成功!'
          //   });
          //   this.DeviceSearch();
          // });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
    },
    //新建
    addmodal() {
      this.rowitem = {};
      this.addmodalShow = true;
      this.title = '新建';
    },
    //新增修改后
    addsubmit() {
      this.addmodalShow = false;
      this.modalShow = false;
      this.DeviceSearch();
    }
  }
};
</script>
<style lang="scss" scoped>
#stacker {
  .table {
    width: 100%;
    margin-top: 10px;
    height: calc(100% - 40px);
    overflow: hidden;
  }
}
</style>
qqjf-Web/src/views/basicInfo/base/warning/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,204 @@
<template>
  <!-- æŠ¥è­¦ä¿¡æ¯ -->
  <div id="warning" class="global-content">
    <!-- ç­›é€‰ -->
    <base-inquer
      :add="false"
      :dele="false"
      :allderive="true"
      byfilter="故障名称"
      :filterList="filterList"
      @addmodal="addmodal"
      @inquer="inquer"
      @allderive="allderive"
    />
    <!-- table -->
    <div class="table">
      <table-container
        :wipelist="wipelist"
        :tableHead="tableHead"
        :tableData="tableData"
        :editShow="true"
        :delShow="true"
        :currentPage="page"
        :pageSize="pageSize"
        :totle="totle"
        @edit="edit"
        @del="del"
        @CurrentChange="CurrentChange"
        @SizeChange="SizeChange"
      />
    </div>
    <transition name="modal">
      <modal v-if="addmodalShow" :modabg="true" @cancel="addmodalShow = false">
        <p slot="title">设备报警信息-{{ title }}</p>
        <div class="height" slot="centent">
          <warning-edit @cancel="addmodalShow = false" :rowitem="rowitem" @addsubmit="addsubmit" />
        </div>
      </modal>
    </transition>
  </div>
</template>
<script>
import { TableContainer, Modal } from '@/components/index';
import baseInquer from '../../components/baseinquer';
import warningEdit from '../../components/warningEdit';
const { warning } = require('@/components/tableContainer/tableHead');
import { getimestampDate, getymdhms } from '@/utils/date';
import { AlertSearch, AlertDelete, GetAllAlarmInfo } from '@/api/warning';
import { exportTableList } from '@/utils/excel';
import XLSX from 'xlsx';
export default {
  data() {
    return {
      title: '',
      tableData: [],
      modalShow: false,
      addmodalShow: false,
      wipelist: [],
      inuqerobg: {},
      filterList: [
        {
          value: '故障名称',
          label: '故障名称'
        },
        {
          value: '故障描述',
          label: '故障描述'
        },
        {
          value: '故障设备',
          label: '故障设备'
        },
        {
          value: '故障编号',
          label: '故障编号'
        }
      ],
      rowitem: {},
      totle: 0,
      page: 1,
      pageSize: 20
    };
  },
  components: { TableContainer, baseInquer, Modal, warningEdit },
  computed: {
    tableHead() {
      return warning;
    }
  },
  mounted() {
    this.AlertSearch();
  },
  methods: {
    //查询
    inquer(e) {
      this.inuqerobg = e;
      this.AlertSearch();
    },
    //搜索报警信息
    AlertSearch() {
      this.$Loading(true);
      const { æ•…障名称: alertName, æ•…障描述: alertDes, æ•…障设备: deviceName, æ•…障编号: alertCode } = this.inuqerobg;
      AlertSearch(this.page + '&onePageNum=' + this.pageSize, { alertName, alertDes, deviceName, alertCode }).then(
        res => {
          if (res.code == 0) {
            let data = res.data;
            data.forEach(item => {
              item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
              item.createTime = item.createTime ? getimestampDate(item.createTime) : '';
            });
            console.log(data);
            this.tableData = data;
            this.totle = res.num;
          }
          this.$Loading();
        }
      );
    },
    CurrentChange(e) {
      console.log(e);
      this.page = e;
      this.AlertSearch();
    },
    //页数
    SizeChange(e) {
      this.pageSize = e;
      this.AlertSearch();
    },
    //编辑
    edit(row) {
      this.addmodalShow = true;
      this.rowitem = { ...row };
      this.title = '编辑';
    },
    //删除
    del(row) {
      console.log(row);
      const { USERNAME } = { ...row };
      this.$confirm('此操作将永久删除, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          // AlertDelete({ userName: USERNAME }).then(res => {
          //   this.$message({
          //     type: 'success',
          //     message: '删除成功!'
          //   });
          //   this.AlertSearch();
          // });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
    },
    //新建
    addmodal() {
      this.rowitem = {};
      this.addmodalShow = true;
      this.title = '新建';
    },
    //新增修改后
    addsubmit() {
      this.addmodalShow = false;
      this.modalShow = false;
      this.AlertSearch();
    },
    //全部导出
    allderive() {
      const { æ•…障名称: alertName, æ•…障描述: alertDes, æ•…障设备: deviceName, æ•…障编号: alertCode } = this.inuqerobg;
      this.$Loading(true);
      GetAllAlarmInfo({ alertName, alertDes, deviceName, alertCode }).then(res => {
        let tHeader = [];
        let filterVal = [];
        this.tableHead.forEach(item => {
          tHeader.push(item.columnDescription);
          filterVal.push(item.columnName);
        });
        exportTableList(tHeader, filterVal, res, '报警信息' + getymdhms());
        this.$Loading();
      });
    }
  }
};
</script>
<style lang="scss" scoped>
#warning {
  .table {
    width: 100%;
    margin-top: 10px;
    height: calc(100% - 40px);
    overflow: hidden;
  }
}
</style>
qqjf-Web/src/views/basicInfo/components/baseinquer.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,172 @@
<template>
  <div id="base" class="flex align-center justify-between">
    <div class="">
      <el-button-group>
        <el-button v-if="add" type="primary" size="mini" icon="el-icon-plus" @click="$emit('addmodal')">新建</el-button>
        <el-button v-if="dele" type="primary" size="mini" icon="el-icon-delete">删除</el-button>
        <el-button
          v-if="derive"
          style="margin-left: 10px"
          type="primary"
          size="mini"
          icon="el-icon-download"
          @click="$emit('derive')"
          >导出</el-button
        >
        <el-button
          v-if="allderive"
          style="margin-left: 10px"
          type="primary"
          size="mini"
          icon="el-icon-download"
          @click="$emit('allderive')"
          >全部导出</el-button
        >
      </el-button-group>
    </div>
    <div class="width80 flex align-center justify-end">
      <div class="flex width align-center justify-end margin-right">
        <div v-if="basetimeshow" id="basetimeer" class="flex align-center margin-right width35">
          <label style="width: 6rem" class="textalign color909399 fontsizeinitial">起止时间:</label>
          <el-date-picker
            size="mini"
            v-model="timepick"
            value-format="yyyy-MM-dd HH:mm:ss"
            type="datetimerange"
            range-separator="至"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
          >
          </el-date-picker>
        </div>
        <div v-if="taskshow" id="basetimeer" class="flex align-center margin-right width35">
          <label style="width: 6rem" class="textalign color909399 fontsizeinitial">任务类型:</label>
          <el-select v-model="inquers.taskType" slot="prepend">
            <el-option
              v-for="(item, index) in taskList"
              :label="item.label"
              :value="item.value"
              :key="index"
            ></el-option>
          </el-select>
        </div>
        <el-input id="baseinquer" size="mini" clearable v-model="inquers[filter]" class="width30">
          <el-select @change="selchange" v-model="filter" slot="prepend">
            <el-option
              v-for="(item, index) in filterList"
              :label="item.label"
              :value="item.value"
              :key="index"
            ></el-option>
          </el-select>
        </el-input>
      </div>
      <el-button type="primary" size="mini" @click="inquer">查询</el-button>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      inquers: { timepick: null, taskType: '全部' },
      timepick: null,
      applytime: [],
      taskList: [
        {
          label: '全部',
          value: '全部'
        },
        {
          label: '移库',
          value: '移库'
        }
      ],
      filter: '',
      visible: false,
      value1: ''
    };
  },
  props: {
    advanced: {
      type: Boolean,
      default: false
    },
    basetimeshow: {
      type: Boolean,
      default: false
    },
    add: {
      type: Boolean,
      default: true
    },
    dele: {
      type: Boolean,
      default: false
    },
    derive: {
      type: Boolean,
      default: false
    },
    allderive: {
      type: Boolean,
      default: false
    },
    byfilter: {
      type: String,
      default: ''
    },
    filterList: {
      type: Array,
      default: () => []
    },
    taskshow: {
      type: Boolean,
      default: false
    }
  },
  mounted() {
    this.filter = this.byfilter;
  },
  methods: {
    inquer() {
      this.inquers.timepick = this.timepick;
      this.$emit('inquer', this.inquers);
    },
    selchange() {
      this.inquers = { timepick: null, taskType: '全部' };
    }
  },
  watch: {
    byfilter: {
      handler(nvl, ovl) {
        this.filter = nvl;
      }
    }
  }
};
</script>
<style lang="scss" scoped>
#base {
  ::v-deep .el-input-group__append,
  ::v-deep .el-input-group__prepend {
    width: 60px;
  }
  ::v-deep .el-date-editor--datetimerange.el-input,
  .el-date-editor--datetimerange.el-input__inner {
    width: 74%;
  }
}
#baseinquer {
  ::v-deep .el-select {
    width: 100px;
  }
}
#basetimeer {
  ::v-deep .el-range-editor.el-input__inner {
    padding: 3px;
  }
}
</style>
qqjf-Web/src/views/basicInfo/components/stackerEdit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
<template>
  <div class="storageEdit height overflow">
    <div class="centent-form overflowy-auto">
      <el-form
        class="margin-auto width90"
        ref="registerForm"
        :model="registerForm"
        size="mini"
        :rules="rules"
        label-position="left"
        label-width="120px"
      >
        <el-form-item label="设备名:" prop="deviceName">
          <el-input v-model="registerForm.deviceName" clearable></el-input>
        </el-form-item>
        <el-form-item label="设备类型:" prop="placeType">
          <el-input v-model="registerForm.deviceType" clearable></el-input>
        </el-form-item>
        <el-form-item label="设备号:" prop="isFull">
          <el-input v-model="registerForm.deviceId" clearable></el-input>
        </el-form-item>
        <!-- <el-form-item label="锁定:" prop="isLock">
          <el-input v-model="registerForm.isLock" clearable></el-input>
        </el-form-item> -->
      </el-form>
    </div>
    <div class="palteEdit-button text-right margin-right15 margin-top2">
      <el-button type="primary" size="mini" class="form-buttom" @click="submitForm('registerForm')">提交</el-button>
      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">取消</el-button>
    </div>
  </div>
</template>
<script>
import { DeviceAddOrUpdate } from '@/api/stacker';
export default {
  data() {
    return {
      registerForm: {},
      usernameList: [],
      rules: {
        deviceName: { required: true, message: '请输设备名', trigger: 'change' },
        deptDes: { required: true, message: '请输入部门描述', trigger: 'change' },
        enable: { required: true, message: '请选择是否启用', trigger: 'change' }
      }
    };
  },
  props: {
    rowitem: {
      type: Object,
      default: {}
    }
  },
  mounted() {
    if (JSON.stringify(this.rowitem) != '{}') {
      this.registerForm = this.rowitem;
    }
  },
  methods: {
    submitForm(registerForm) {
      this.$refs[registerForm].validate(valid => {
        if (valid) {
          DeviceAddOrUpdate(this.registerForm).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '提交成功'
              });
              this.$emit('addsubmit');
            } else {
              this.$message({
                type: 'warning',
                message: '提交失败'
              });
            }
          });
        } else {
        }
      });
    }
  },
  watch: {}
};
</script>
<style lang="scss" scoped>
.storageEdit {
  width: 98%;
  padding: 1%;
  .show-pwd {
    position: absolute;
    right: 10px;
    top: 3px;
    font-size: 16px;
    color: #889aa4;
    cursor: pointer;
    user-select: none;
  }
  .centent-form {
    height: 92%;
    width: 100%;
    margin: auto;
  }
  .storageEdit-button {
  }
  ::v-deep .el-form-item__content {
    width: 60%;
  }
  ::v-deep .el-select {
    width: 100%;
  }
}
</style>
qqjf-Web/src/views/basicInfo/components/warningEdit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,144 @@
<template>
  <div class="warningEdit height overflow">
    <div class="centent-form overflowy-auto">
      <el-form
        class="margin-auto width90"
        ref="registerForm"
        :model="registerForm"
        size="mini"
        label-position="left"
        label-width="120px"
      >
        <el-form-item label="故障编号:" prop="alertCode">
          <el-input disabled v-model="registerForm.alertCode" clearable></el-input>
        </el-form-item>
        <el-form-item label="故障设备:" prop="placeType">
          <!-- <el-input v-model="registerForm.deviceName" clearable></el-input> -->
          <el-select size="mini" clearable v-model="registerForm.deviceName" placeholder="请选择">
            <el-option
              v-for="(item, index) in deviceNameList"
              :key="'deviceName' + index"
              :label="item.deviceName"
              :value="item.deviceName"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="故障名称:" prop="isFull">
          <el-input v-model="registerForm.alertName" clearable></el-input>
        </el-form-item>
        <el-form-item label="故障描述:" prop="isFull">
          <el-input
            type="textarea"
            :autosize="{ minRows: 2, maxRows: 6 }"
            v-model="registerForm.alertDes"
            clearable
          ></el-input>
        </el-form-item>
        <!-- <el-form-item label="锁定:" prop="isLock">
          <el-input v-model="registerForm.isLock" clearable></el-input>
        </el-form-item> -->
      </el-form>
    </div>
    <div class="palteEdit-button text-right margin-right15 margin-top2">
      <el-button type="primary" size="mini" class="form-buttom" @click="submitForm('registerForm')">提交</el-button>
      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">取消</el-button>
    </div>
  </div>
</template>
<script>
import { CarAddOrUpdate, AlertGetCode } from '@/api/warning';
import { DeviceSearch } from '@/api/stacker';
export default {
  data() {
    return {
      registerForm: {
        alertCode: ''
      },
      deviceNameList: []
    };
  },
  props: {
    rowitem: {
      type: Object,
      default: {}
    }
  },
  mounted() {
    if (JSON.stringify(this.rowitem) != '{}') {
      this.registerForm = this.rowitem;
    } else {
      this.AlertGetCode();
    }
    this.DeviceSearch();
  },
  methods: {
    //获取编号
    AlertGetCode() {
      AlertGetCode().then(res => {
        this.registerForm.alertCode = res;
      });
    },
    //获取设备
    DeviceSearch() {
      DeviceSearch('1&onePageNum=999').then(res => {
        if (res.code == 0) {
          this.deviceNameList = res.data || [];
        }
      });
    },
    submitForm(registerForm) {
      this.$refs[registerForm].validate(valid => {
        if (valid) {
          CarAddOrUpdate(this.registerForm).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '提交成功'
              });
              this.$emit('addsubmit');
            } else {
              this.$message({
                type: 'warning',
                message: '提交失败'
              });
            }
          });
        } else {
        }
      });
    }
  },
  watch: {}
};
</script>
<style lang="scss" scoped>
.warningEdit {
  width: 98%;
  padding: 1%;
  .show-pwd {
    position: absolute;
    right: 10px;
    top: 3px;
    font-size: 16px;
    color: #889aa4;
    cursor: pointer;
    user-select: none;
  }
  .centent-form {
    height: 92%;
    width: 100%;
    margin: auto;
  }
  .warningEdit-button {
  }
  ::v-deep .el-form-item__content {
    width: 60%;
  }
  ::v-deep .el-select {
    width: 100%;
  }
}
</style>
qqjf-Web/src/views/basicInfo/equipmenttask/avroRecord/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,202 @@
<template>
  <!-- å †åž›æœºä»»åŠ¡ -->
  <div id="piler" class="global-content">
    <!-- ç­›é€‰ -->
    <base-inquer
      :add="false"
      :dele="false"
      :derive="true"
      :taskshow="true"
      :basetimeshow="true"
      byfilter="零件号"
      :filterList="filterList"
      @addmodal="addmodal"
      @inquer="inquer"
      @derive="derive"
    />
    <!-- table -->
    <div class="table">
      <table-container
        :wipelist="wipelist"
        :tableHead="tableHead"
        :tableData="tableData"
        :editShow="true"
        :delShow="true"
        :operation="false"
        :currentPage="page"
        :pageSize="pageSize"
        :totle="totle"
        @edit="edit"
        @del="del"
        @CurrentChange="CurrentChange"
        @SizeChange="SizeChange"
      />
    </div>
  </div>
</template>
<script>
import { TableContainer } from '@/components/index';
import baseInquer from '../../components/baseinquer';
const { avroRecord } = require('@/components/tableContainer/tableHead');
import { getimestampDate, getymdhms } from '@/utils/date';
import { SrmTaskSearch, SearchAll } from '@/api/avroRecord';
import { exportTableList } from '@/utils/excel';
export default {
  data() {
    return {
      title: '',
      tableData: [],
      modalShow: false,
      addmodalShow: false,
      wipelist: [],
      inuqerobg: { taskType: '全部' },
      filterList: [
        {
          value: '零件号',
          label: '零件号'
        }
      ],
      rowitem: {},
      totle: 0,
      page: 1,
      pageSize: 20
    };
  },
  components: { TableContainer, baseInquer },
  computed: {
    tableHead() {
      return avroRecord;
    }
  },
  mounted() {
    this.SrmTaskSearch();
  },
  methods: {
    //查询
    inquer(e) {
      this.inuqerobg = e;
      this.page = 1;
      this.SrmTaskSearch();
    },
    //导出
    derive() {
      let tHeader = [];
      let filterVal = [];
      this.tableHead.forEach(item => {
        tHeader.push(item.columnDescription);
        filterVal.push(item.columnName);
      });
      this.$Loading(true);
      const { é›¶ä»¶å·: itemName, taskType } = this.inuqerobg;
      SearchAll({
        itemName,
        taskType,
        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
      }).then(res => {
        if (res.code == 0) {
          let data = res.data;
          data.forEach(item => {
            item.isReleased = item.isReleased == 1 ? '是' : item.isReleased == 0 ? '否' : item.isReleased;
            item.hasFinished = item.hasFinished == 1 ? '是' : item.hasFinished == 0 ? '否' : item.hasFinished;
            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
            item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
          });
          exportTableList(tHeader, filterVal, data, '堆垛机任务' + getymdhms());
        }
        this.$Loading();
      });
    },
    //搜索报警信息
    SrmTaskSearch() {
      this.$Loading(true);
      const { é›¶ä»¶å·: itemName, taskType } = this.inuqerobg;
      SrmTaskSearch(this.page + '&onePageNum=' + this.pageSize, {
        itemName,
        taskType,
        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
      }).then(res => {
        if (res.code == 0) {
          let data = res.data;
          data.forEach(item => {
            item.isReleased = item.isReleased == 1 ? '是' : item.isReleased == 0 ? '否' : item.isReleased;
            item.hasFinished = item.hasFinished == 1 ? '是' : item.hasFinished == 0 ? '否' : item.hasFinished;
            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
            item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
          });
          this.tableData = res.data;
          this.totle = res.num;
        }
        this.$Loading();
      });
    },
    CurrentChange(e) {
      console.log(e);
      this.page = e;
      this.SrmTaskSearch();
    },
    //页数
    SizeChange(e) {
      this.pageSize = e;
      this.SrmTaskSearch();
    },
    //编辑
    edit(row) {
      this.addmodalShow = true;
      this.rowitem = { ...row };
      this.title = '编辑';
    },
    //删除
    del(row) {
      console.log(row);
      const { USERNAME } = { ...row };
      this.$confirm('此操作将永久删除, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          // AlertDelete({ userName: USERNAME }).then(res => {
          //   this.$message({
          //     type: 'success',
          //     message: '删除成功!'
          //   });
          //   this.SrmTaskSearch();
          // });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
    },
    //新建
    addmodal() {
      this.rowitem = {};
      this.addmodalShow = true;
      this.title = '新建';
    },
    //新增修改后
    addsubmit() {
      this.addmodalShow = false;
      this.modalShow = false;
      this.SrmTaskSearch();
    }
  }
};
</script>
<style lang="scss" scoped>
#piler {
  .table {
    width: 100%;
    margin-top: 10px;
    height: calc(100% - 40px);
    overflow: hidden;
  }
}
</style>
qqjf-Web/src/views/basicInfo/equipmenttask/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
<template>
  <router-view />
</template>
<script>
export default {};
</script>
<style></style>
qqjf-Web/src/views/basicInfo/equipmenttask/piler/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,236 @@
<template>
  <!-- å †åž›æœºä»»åŠ¡ -->
  <div id="piler" class="global-content">
    <!-- ç­›é€‰ -->
    <base-inquer
      :add="false"
      :dele="false"
      :derive="true"
      :basetimeshow="true"
      byfilter="设备名称"
      :filterList="filterList"
      @addmodal="addmodal"
      @inquer="inquer"
      @derive="derive"
    />
    <!-- table -->
    <div class="table">
      <table-container
        :wipelist="wipelist"
        :tableHead="tableHead"
        :tableData="tableData"
        :editShow="true"
        :delShow="true"
        :operation="false"
        :currentPage="page"
        :pageSize="pageSize"
        :totle="totle"
        @edit="edit"
        @del="del"
        @CurrentChange="CurrentChange"
        @SizeChange="SizeChange"
      />
    </div>
  </div>
</template>
<script>
import { TableContainer } from '@/components/index';
import baseInquer from '../../components/baseinquer';
const { piler } = require('@/components/tableContainer/tableHead');
import { getimestampDate, getymdhms } from '@/utils/date';
import { SrmTaskSearch } from '@/api/equipmenttask';
import { exportTableList } from '@/utils/excel';
export default {
  data() {
    return {
      title: '',
      tableData: [],
      modalShow: false,
      addmodalShow: false,
      wipelist: [],
      inuqerobg: {},
      filterList: [
        {
          value: '设备名称',
          label: '设备名称'
        },
        {
          value: '任务类型',
          label: '任务类型'
        },
        {
          value: '器具规格类型',
          label: '器具规格类型'
        },
        {
          value: '目标位置',
          label: '目标位置'
        },
        {
          value: '起始位置',
          label: '起始位置'
        }
      ],
      rowitem: {},
      totle: 0,
      page: 1,
      pageSize: 20
    };
  },
  components: { TableContainer, baseInquer },
  computed: {
    tableHead() {
      return piler;
    }
  },
  mounted() {
    this.SrmTaskSearch();
  },
  methods: {
    //查询
    inquer(e) {
      console.log(e);
      this.inuqerobg = e;
      this.page = 1;
      this.SrmTaskSearch();
    },
    //导出
    derive() {
      let tHeader = [];
      let filterVal = [];
      this.tableHead.forEach(item => {
        tHeader.push(item.columnDescription);
        filterVal.push(item.columnName);
      });
      this.$Loading(true);
      const {
        è®¾å¤‡åç§°: devName,
        ä»»åŠ¡ç±»åž‹: taskType,
        å™¨å…·è§„格类型: palletType,
        ç›®æ ‡ä½ç½®: toPlace,
        èµ·å§‹ä½ç½®: sourcePlace
      } = this.inuqerobg;
      SrmTaskSearch('1&onePageNum=99999999', {
        devName,
        taskType,
        palletType,
        toPlace,
        sourcePlace,
        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
      }).then(res => {
        if (res.code == 0) {
          let data = res.data;
          data.forEach(item => {
            item.isReleased = item.isReleased == 1 ? '是' : item.isReleased == 0 ? '否' : item.isReleased;
            item.hasFinished = item.hasFinished == 1 ? '是' : item.hasFinished == 0 ? '否' : item.hasFinished;
            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
            item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
          });
          exportTableList(tHeader, filterVal, data, '堆垛机任务' + getymdhms());
        }
        this.$Loading();
      });
    },
    //搜索报警信息
    SrmTaskSearch() {
      this.$Loading(true);
      const {
        è®¾å¤‡åç§°: devName,
        ä»»åŠ¡ç±»åž‹: taskType,
        å™¨å…·è§„格类型: palletType,
        ç›®æ ‡ä½ç½®: toPlace,
        èµ·å§‹ä½ç½®: sourcePlace
      } = this.inuqerobg;
      SrmTaskSearch(this.page + '&onePageNum=' + this.pageSize, {
        devName,
        taskType,
        palletType,
        toPlace,
        sourcePlace,
        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
      }).then(res => {
        if (res.code == 0) {
          let data = res.data;
          data.forEach(item => {
            item.isReleased = item.isReleased == 1 ? '是' : item.isReleased == 0 ? '否' : item.isReleased;
            item.hasFinished = item.hasFinished == 1 ? '是' : item.hasFinished == 0 ? '否' : item.hasFinished;
            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
            item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
          });
          this.tableData = res.data;
          this.totle = res.num;
        }
        this.$Loading();
      });
    },
    CurrentChange(e) {
      console.log(e);
      this.page = e;
      this.SrmTaskSearch();
    },
    //页数
    SizeChange(e) {
      this.pageSize = e;
      this.SrmTaskSearch();
    },
    //编辑
    edit(row) {
      this.addmodalShow = true;
      this.rowitem = { ...row };
      this.title = '编辑';
    },
    //删除
    del(row) {
      console.log(row);
      const { USERNAME } = { ...row };
      this.$confirm('此操作将永久删除, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          // AlertDelete({ userName: USERNAME }).then(res => {
          //   this.$message({
          //     type: 'success',
          //     message: '删除成功!'
          //   });
          //   this.SrmTaskSearch();
          // });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
    },
    //新建
    addmodal() {
      this.rowitem = {};
      this.addmodalShow = true;
      this.title = '新建';
    },
    //新增修改后
    addsubmit() {
      this.addmodalShow = false;
      this.modalShow = false;
      this.SrmTaskSearch();
    }
  }
};
</script>
<style lang="scss" scoped>
#piler {
  .table {
    width: 100%;
    margin-top: 10px;
    height: calc(100% - 40px);
    overflow: hidden;
  }
}
</style>
qqjf-Web/src/views/basicInfo/equipmenttask/rgvtask/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,217 @@
<template>
  <!-- RGV任务 -->
  <div id="rgvtask" class="global-content">
    <!-- ç­›é€‰ -->
    <base-inquer
      :add="false"
      :dele="false"
      :derive="true"
      :basetimeshow="true"
      byfilter="设备名称"
      :filterList="filterList"
      @addmodal="addmodal"
      @inquer="inquer"
      @derive="derive"
    />
    <!-- table -->
    <div class="table">
      <table-container
        :wipelist="wipelist"
        :tableHead="tableHead"
        :tableData="tableData"
        :editShow="true"
        :delShow="true"
        :operation="false"
        :currentPage="page"
        :pageSize="pageSize"
        :totle="totle"
        @edit="edit"
        @del="del"
        @CurrentChange="CurrentChange"
        @SizeChange="SizeChange"
      />
    </div>
  </div>
</template>
<script>
import { TableContainer } from '@/components/index';
import baseInquer from '../../components/baseinquer';
const { rgvtask } = require('@/components/tableContainer/tableHead');
import { getimestampDate, getymdhms } from '@/utils/date';
import { RgvTaskSearch } from '@/api/equipmenttask';
import { exportTableList } from '@/utils/excel';
export default {
  data() {
    return {
      title: '',
      tableData: [],
      modalShow: false,
      addmodalShow: false,
      wipelist: [],
      inuqerobg: {},
      filterList: [
        {
          value: '设备名称',
          label: '设备名称'
        },
        {
          value: '目标位置',
          label: '目标位置'
        },
        {
          value: '起始位置',
          label: '起始位置'
        },
        {
          value: '任务类型',
          label: '任务类型'
        }
      ],
      rowitem: {},
      totle: 0,
      page: 1,
      pageSize: 20
    };
  },
  components: { TableContainer, baseInquer },
  computed: {
    tableHead() {
      return rgvtask;
    }
  },
  mounted() {
    this.RgvTaskSearch();
  },
  methods: {
    //查询
    inquer(e) {
      this.page = 1;
      this.inuqerobg = e;
      this.RgvTaskSearch();
    },
    //导出
    derive() {
      let tHeader = [];
      let filterVal = [];
      this.tableHead.forEach(item => {
        tHeader.push(item.columnDescription);
        filterVal.push(item.columnName);
      });
      this.$Loading(true);
      const { è®¾å¤‡åç§°: devName, ç›®æ ‡ä½ç½®: toPlace, èµ·å§‹ä½ç½®: sourcePlace, ä»»åŠ¡ç±»åž‹: taskType } = this.inuqerobg;
      RgvTaskSearch('1&onePageNum=99999999', {
        devName,
        toPlace,
        sourcePlace,
        taskType,
        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
      }).then(res => {
        if (res.code == 0) {
          let data = res.data;
          data.forEach(item => {
            item.isReleased = item.isReleased == 1 ? '是' : item.isReleased == 0 ? '否' : item.isReleased;
            item.hasFinished = item.hasFinished == 1 ? '是' : item.hasFinished == 0 ? '否' : item.hasFinished;
            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
            item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
          });
          exportTableList(tHeader, filterVal, data, 'RGV任务' + getymdhms());
        }
        this.$Loading();
      });
    },
    //搜索报警信息
    RgvTaskSearch() {
      this.$Loading(true);
      const { è®¾å¤‡åç§°: devName, ç›®æ ‡ä½ç½®: toPlace, èµ·å§‹ä½ç½®: sourcePlace, ä»»åŠ¡ç±»åž‹: taskType } = this.inuqerobg;
      RgvTaskSearch(this.page + '&onePageNum=' + this.pageSize, {
        devName,
        toPlace,
        sourcePlace,
        taskType,
        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
      }).then(res => {
        if (res.code == 0) {
          let data = res.data;
          data.forEach(item => {
            item.isReleased = item.isReleased == 1 ? '是' : item.isReleased == 0 ? '否' : item.isReleased;
            item.hasFinished = item.hasFinished == 1 ? '是' : item.hasFinished == 0 ? '否' : item.hasFinished;
            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
            item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
          });
          this.tableData = res.data;
          this.totle = res.num;
        }
        this.$Loading();
      });
    },
    CurrentChange(e) {
      console.log(e);
      this.page = e;
      this.RgvTaskSearch();
    },
    //页数
    SizeChange(e) {
      this.pageSize = e;
      this.RgvTaskSearch();
    },
    //编辑
    edit(row) {
      this.addmodalShow = true;
      this.rowitem = { ...row };
      this.title = '编辑';
    },
    //删除
    del(row) {
      console.log(row);
      const { USERNAME } = { ...row };
      this.$confirm('此操作将永久删除, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          // AlertDelete({ userName: USERNAME }).then(res => {
          //   this.$message({
          //     type: 'success',
          //     message: '删除成功!'
          //   });
          //   this.RgvTaskSearch();
          // });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
    },
    //新建
    addmodal() {
      this.rowitem = {};
      this.addmodalShow = true;
      this.title = '新建';
    },
    //新增修改后
    addsubmit() {
      this.addmodalShow = false;
      this.modalShow = false;
      this.RgvTaskSearch();
    }
  }
};
</script>
<style lang="scss" scoped>
#rgvtask {
  .table {
    width: 100%;
    margin-top: 10px;
    height: calc(100% - 40px);
    overflow: hidden;
  }
}
</style>
qqjf-Web/src/views/basicInfo/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
<template>
  <keep-alive>
    <router-view />
  </keep-alive>
</template>
<script>
export default {};
</script>
<style></style>
qqjf-Web/src/views/dataview/classified.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
<template>
  <!-- åˆ†ç±»ç»Ÿè®¡ -->
  <div id="classified" class="global-content backgroundrgb">
    <div class="width80 height margin-auto overflow flex">
      <div class="width50 height overflow">
        <classified-echart titleechart="零件来源分布" colors="#fff" :chartData="chartData" class="width height" />
      </div>
      <div class="width50 height overflow">
        <classified-echart titleechart="器具来源分布" colors="#fff" :chartData="applianceData" class="width height" />
      </div>
    </div>
  </div>
</template>
<script>
import { GetStockClassificationData } from '@/api/reportforms';
import classifiedEchart from '@/views/Home/components/sourceEchart.vue';
export default {
  data() {
    return {
      chartData: {},
      applianceData: {}
    };
  },
  components: { classifiedEchart },
  computed: {},
  mounted() {
    this.GetStockClassificationData();
    this.applianceDataficationData();
  },
  methods: {
    //零件来源
    GetStockClassificationData() {
      GetStockClassificationData({ type: 1 }).then(res => {
        this.chartData = res;
      });
    },
    //器具来源
    applianceDataficationData() {
      GetStockClassificationData({ type: 2 }).then(res => {
        this.applianceData = res;
      });
    }
  }
};
</script>
<style lang="scss" scoped></style>
qqjf-Web/src/views/dataview/components/lineEcharts.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,179 @@
<template>
  <div class="chart-wrapper" ref="outputline"></div>
</template>
<script>
import resize from '@/mixins/resize';
const echarts = require('echarts');
export default {
  name: 'placePie',
  props: {
    titleechart: {
      type: String,
      default: ''
    },
    linelist: {
      type: Object,
      default: () => {}
    },
    colorList: {
      type: Array,
      default: () => []
    },
    colors: {
      type: String,
      default: '#636972'
    }
  },
  mixins: [resize],
  data() {
    return {};
  },
  mounted() {
    this.initEchart();
  },
  methods: {
    initEchart() {
      let serieslist = [];
      let data = this.linelist.data;
      if (data) {
        data.forEach((item, index) => {
          serieslist.push({
            name: item.name,
            type: 'bar',
            smooth: true,
            data: item.xdata,
            // ä¿®æ”¹çš„æ˜¯çº¿çš„颜色
            lineStyle: {
              width: 10
            }
          });
        });
      }
      this.myChart = echarts.init(this.$refs.outputline);
      this.myChart.setOption(
        {
          title: {
            text: this.linelist && this.linelist.data ? this.titleechart : '暂无数据',
            textStyle: {
              color: this.colors,
              fontWeight: 'normal',
              fontSize: 50
            },
            left: '45%',
            x: 'center',
            y: 0,
            itemGap: 10
          },
          tooltip: {
            //提示框组件
            trigger: 'axis',
            // formatter: '{b0}: {c0}<br />{b1}: {c1}',
            axisPointer: {
              type: 'shadow'
            },
            textStyle: {
              fontSize: 36
            }
          },
          grid: {
            left: '1%',
            right: '1%',
            bottom: '1%',
            top: '27%',
            //    padding:'0 0 10 0',
            containLabel: true
          },
          legend: {
            //图例组件,颜色和名字
            right: '1%',
            top: '15%',
            itemGap: 16,
            itemWidth: 18,
            itemHeight: 10,
            data: this.linelist.legend,
            textStyle: {
              fontStyle: 'normal',
              fontFamily: '微软雅黑',
              color: this.colors,
              fontSize: 28
            }
          },
          xAxis: [
            {
              type: 'category',
              //    boundaryGap: true,//坐标轴两边留白
              data: this.linelist.xdata,
              // data: Axdata,
              axisLabel: {
                interval: 0, //设置为 1,表示『隔一个标签显示一个标签』
                margin: 10,
                textStyle: {
                  fontSize: 28
                }
              },
              axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
              splitLine: {
                show: false,
                lineStyle: { color: this.colors, width: 10 }
              },
              axisTick: {
                show: false
              }
            }
          ],
          yAxis: [
            {
              type: 'value',
              splitNumber: 5,
              axisLabel: {
                textStyle: {
                  fontSize: 36
                }
              },
              axisLine: {
                lineStyle: {
                  color: this.colors,
                  width: 10
                }
              },
              axisTick: {
                show: false
              },
              splitLine: {
                show: true,
                lineStyle: {
                  color: this.colors,
                  width: 10
                }
              }
            }
          ],
          dataZoom: [
            {
              type: 'inside',
              startValue: 10,
              endValue: 15
            }
          ],
          series: serieslist
        },
        true
      );
    }
  },
  watch: {
    linelist: {
      handler() {
        this.initEchart();
      },
      deep: true
    }
  }
};
</script>
qqjf-Web/src/views/dataview/movablerate.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,135 @@
<template>
  <!-- è®¾å¤‡å¯åŠ¨çŽ‡ -->
  <div id="movablerate" class="global-content backgroundrgb">
    <div class="width80 height margin-auto overflow">
      <div class="width margintopbot flex align-center justify-end">
        <label class="color909399 fontsiez1rem">查询日期:</label>
        <el-date-picker
          class="margin-right"
          v-model="pickertime"
          size="mini"
          type="daterange"
          value-format="yyyy-MM-dd"
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
        >
        </el-date-picker>
        <el-button class="margin-right" type="primary" size="mini" @click="inquer">查询</el-button>
      </div>
      <div class="height-calc overflowy-auto">
        <div class="width height48 overflow margin-top10px">
          <movablerate-echart
            class="width height"
            colors="#fff"
            echarttitle="堆垛机-设备可动率"
            :chartData="chartData"
            :colorList="colorList"
          />
        </div>
        <div class="width height48 overflow margin-top10px">
          <movablerate-echart
            class="width height"
            colors="#fff"
            echarttitle="RGV-设备可动率"
            :chartData="rgvdata"
            :colorList="colorList"
          />
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import { GetDevMovable } from '@/api/reportforms';
import { GetDateStr } from '@/utils/date';
import MovablerateEchart from '@/views/Home/components/movablerateechart.vue';
export default {
  data() {
    return {
      pickertime: [GetDateStr(-15), GetDateStr(0)],
      chartData: {},
      rgvdata: {},
      colorList: [
        '#0090FF',
        '#36CE9E',
        '#FFC005',
        '#FF515A',
        '#8B5CFF',
        '#00CA69',
        '#F3A43B',
        '#D7504B',
        '#C6E579',
        '#F0805A',
        '#26C0C0',
        '#660077',
        '#FFCCCC',
        '#550088',
        '#FFFFBB',
        '#99FFFF',
        '#CC00CC',
        '#CC00CC',
        '#C63300',
        '#9955FF',
        '#66FF66',
        '#B5C334',
        '#FCCE10',
        '#27727B',
        '#FE8463',
        '#FAD860',
        '#F3A43B',
        '#D7504B',
        '#C6E579',
        '#F0805A',
        '#26C0C0',
        '#660077',
        '#FFCCCC',
        '#550088',
        '#FFAA33',
        '#CC00CC',
        '#FF77FF',
        '#C63300',
        '#F4E001',
        '#66FF66'
      ]
    };
  },
  components: { MovablerateEchart },
  computed: {},
  mounted() {
    this.GetDevMovable();
    this.GetRGVDevMovable();
  },
  methods: {
    inquer() {
      this.GetDevMovable();
      this.GetRGVDevMovable();
    },
    //堆垛机
    GetDevMovable() {
      let objtimes = {
        startTime: this.pickertime ? this.pickertime[0] : '',
        endTime: this.pickertime ? this.pickertime[1] : '',
        type: 1
      };
      GetDevMovable(objtimes).then(res => {
        this.chartData = res;
      });
    },
    //RGV
    GetRGVDevMovable() {
      let objtimes = {
        startTime: this.pickertime ? this.pickertime[0] : '',
        endTime: this.pickertime ? this.pickertime[1] : '',
        type: 2
      };
      GetDevMovable(objtimes).then(res => {
        this.rgvdata = res;
      });
    }
  }
};
</script>
<style lang="scss" scoped></style>
qqjf-Web/src/views/dataview/output.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,129 @@
<template>
  <!-- åˆ†ç±»ç»Ÿè®¡ -->
  <div id="Ouptput" class="global-content backgroundrgb">
    <div class="width80 height margin-auto overflow">
      <div class="margintopbot height width overflow">
        <!-- <p class="fontsize2rem text-center">零件出入库统计</p> -->
        <div class="width margintopbot flex justify-end">
          <el-date-picker
            v-model="datatime"
            size="mini"
            type="datetimerange"
            value-format="yyyy-MM-dd HH:mm:ss"
            range-separator="至"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
          >
          </el-date-picker>
          <!-- <el-date-picker
            size="mini"
            v-model="datatime"
            type="date"
            :clearable="false"
            value-format="yyyy-MM-dd"
            placeholder="选择日期"
          >
          </el-date-picker> -->
          <el-button class="margin-left margin-right" type="primary" size="mini" @click="goodsinquer">查询</el-button>
        </div>
        <!-- <div class="width98 height82 margintopbot echart-height">
          <line-echart
            titleechart="出入库任务"
            :linelist="BarItemlinelist"
            :colorList="barcolorList"
            class="width height"
            colors="#fff"
          />
        </div> -->
        <div class="width98 height45 margintopbot echart-height">
          <line-echart
            titleechart="零件数量统计"
            :linelist="BarItemlinelist"
            :colorList="barcolorList"
            colors="#fff"
            class="width height"
          />
        </div>
        <div class="width98 height45 margintopbot echart-height">
          <line-echart
            titleechart="器具出入库统计"
            :linelist="Containerlinelist"
            :colorList="concolorList"
            colors="#fff"
            class="width height"
          />
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import { GetInOutCountByHour } from '@/api/output';
import { GetHomeBarItemData, GetHomeBarContainerData } from '@/api/Didproject';
import LineEchart from './components/lineEcharts.vue';
import { getDate, GetDateStr, GetTimeStr } from '@/utils/date';
export default {
  data() {
    return {
      datatime: [GetDateStr(-15) + ' 00:00:00', getDate() + ' ' + GetTimeStr(0)],
      BarItemlinelist: {}, //零件出入数量
      Containerlinelist: {}, //出入库数量
      barcolorList: ['#ffc637', '#fc7293', '#8477e9', '#2599f0', '#31c3ea', '#17d8b9', '#e8bdf3'],
      concolorList: ['#31c3ea', '#17d8b9', '#2599f0', '#e8bdf3', '#ffc637', '#fc7293', '#8477e9']
    };
  },
  components: { LineEchart },
  computed: {},
  mounted() {
    this.GetHomeBarItemData();
    this.GetHomeBarContainerData();
  },
  methods: {
    //时间查询
    goodsinquer() {
      this.GetHomeBarItemData();
      this.GetHomeBarContainerData();
    },
    //获取零件的出入库数量
    GetHomeBarItemData() {
      let time = {
        startTime: this.datatime ? this.datatime[0] : '',
        endTime: this.datatime ? this.datatime[1] : ''
      };
      this.BarItemlineshow = false;
      GetHomeBarItemData(time).then(res => {
        this.BarItemlinelist = res.data;
        this.BarItemlineshow = true;
      });
    },
    //获取器具的出入库数量
    GetHomeBarContainerData() {
      let time = {
        startTime: this.datatime ? this.datatime[0] : '',
        endTime: this.datatime ? this.datatime[1] : ''
      };
      this.$Loading(true);
      this.Containerline = false;
      GetHomeBarContainerData(time).then(res => {
        this.Containerlinelist = res.data;
        this.Containerline = true;
        this.$Loading();
      });
    }
    //获取零件的出入库数量
    // GetInOutCountByHour() {
    //   let time = {
    //     startTime: this.datatime + ' 00:00:00',
    //     endTime: this.datatime + ' 23:59:59'
    //   };
    //   GetInOutCountByHour(time).then(res => {
    //     // this.BarItemlinelist = res.data;
    //   });
    // }
  }
};
</script>
<style lang="scss" scoped></style>
qqjf-Web/src/views/dataview/product.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
<template>
  <!-- åœ¨åˆ¶å“èµ„金分析 -->
  <div id="product" class="global-content backgroundrgb">
    <div class="width80 height margin-auto overflow">
      <div class="width margintopbot flex align-center justify-end">
        <label class="color909399 fontsiez1rem">查询日期:</label>
        <el-date-picker
          class="margin-right"
          v-model="pickertime"
          size="mini"
          type="daterange"
          value-format="yyyy-MM-dd"
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
        >
        </el-date-picker>
        <el-button class="margin-right" type="primary" size="mini" @click="inquer">查询</el-button>
      </div>
      <div class="width height-calc90 overflow margin-top2">
        <product-echart class="width height" colors="#fff" :chartData="chartData" :colorList="colorList" />
      </div>
    </div>
  </div>
</template>
<script>
import { GetStorageCapitalAnalysis } from '@/api/reportforms';
import { GetDateStr } from '@/utils/date';
import resize from '@/mixins/resize';
import ProductEchart from '@/views/Home/components/product.vue';
const echarts = require('echarts');
export default {
  data() {
    return {
      pickertime: [GetDateStr(-15), GetDateStr(0)],
      chartData: {},
      rgvdata: {},
      colorList: ['#9effff', '#9E87FF', '#73DD39', '#73DDFF', '#fe9a', '#fe9a8b', '#F3A43B']
    };
  },
  mixins: [resize],
  components: { ProductEchart },
  computed: {},
  mounted() {
    this.GetStorageCapitalAnalysis();
  },
  methods: {
    inquer() {
      this.GetStorageCapitalAnalysis();
    },
    //堆垛机
    GetStorageCapitalAnalysis() {
      let objtimes = {
        startTime: this.pickertime ? this.pickertime[0] : '',
        endTime: this.pickertime ? this.pickertime[1] : ''
      };
      GetStorageCapitalAnalysis(objtimes).then(res => {
        this.chartData = res;
      });
    }
  }
};
</script>
<style lang="scss" scoped></style>
qqjf-Web/src/views/dataview/rateequipment.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,141 @@
<template>
  <!-- è®¾å¤‡åˆ©ç”¨çއ -->
  <div id="rateequipment" class="global-content backgroundrgb">
    <div class="width90 height margin-auto overflow">
      <div class="width margintopbot flex align-center justify-end">
        <label class="color909399 fontsiez1rem">查询日期:</label>
        <el-date-picker
          class="margin-right"
          v-model="pickertime"
          size="mini"
          type="daterange"
          value-format="yyyy-MM-dd"
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
        >
        </el-date-picker>
        <el-button class="margin-right" type="primary" size="mini" @click="inquer">查询</el-button>
      </div>
      <div class="height-calc overflowy-auto">
        <div class="width height48 overflow margin-top10px">
          <rateequipment-echart
            class="width height"
            colors="#fff"
            echarttitle="堆垛机-设备利用率"
            :chartData="chartData"
            :colorList="colorList"
          />
        </div>
        <div class="width height48 overflow margin-top10px">
          <rateequipment-echart
            class="width height"
            colors="#fff"
            echarttitle="RGV-设备利用率"
            :chartData="rgvdata"
            :colorList="colorList"
          />
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import { GetDevAvailability } from '@/api/reportforms';
import { GetDateStr } from '@/utils/date';
import resize from '@/mixins/resize';
import RateequipmentEchart from '@/views/Home/components/rateequipment.vue';
export default {
  data() {
    return {
      pickertime: [GetDateStr(-15), GetDateStr(0)],
      chartData: {},
      rgvdata: {},
      colorList: [
        '#0090FF',
        '#36CE9E',
        '#FFC005',
        '#FF515A',
        '#8B5CFF',
        '#00CA69',
        '#F3A43B',
        '#D7504B',
        '#C6E579',
        '#F0805A',
        '#26C0C0',
        '#660077',
        '#FFCCCC',
        '#550088',
        '#FFFFBB',
        '#99FFFF',
        '#CC00CC',
        '#CC00CC',
        '#C63300',
        '#9955FF',
        '#66FF66',
        '#B5C334',
        '#FCCE10',
        '#27727B',
        '#FE8463',
        '#FAD860',
        '#F3A43B',
        '#D7504B',
        '#C6E579',
        '#F0805A',
        '#26C0C0',
        '#660077',
        '#FFCCCC',
        '#550088',
        '#FFAA33',
        '#CC00CC',
        '#FF77FF',
        '#C63300',
        '#F4E001',
        '#66FF66'
      ]
    };
  },
  mixins: [resize],
  components: { RateequipmentEchart },
  computed: {},
  mounted() {
    this.GetDevAvailability();
    this.GetRGVDevMovable();
  },
  methods: {
    inquer() {
      this.GetDevAvailability();
      this.GetRGVDevMovable();
    },
    //堆垛机
    GetDevAvailability() {
      let objtimes = {
        startTime: this.pickertime ? this.pickertime[0] : '',
        endTime: this.pickertime ? this.pickertime[1] : '',
        type: 1
      };
      GetDevAvailability(objtimes).then(res => {
        this.chartData = res;
      });
    },
    //RGV
    GetRGVDevMovable() {
      let objtimes = {
        startTime: this.pickertime ? this.pickertime[0] : '',
        endTime: this.pickertime ? this.pickertime[1] : '',
        type: 2
      };
      GetDevAvailability(objtimes).then(res => {
        this.rgvdata = res;
      });
    }
  }
};
</script>
<style lang="scss" scoped>
#rateequipment {
}
</style>
qqjf-Web/src/views/dataview/statelibrary.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,117 @@
<template>
  <!-- ç«‹åº“总览 -->
  <div id="statelibrary" class="global-content backgroundrgb">
    <h3 class="text-center colorfff fontsize2rem absolute transformtopleft12" style="font-size: 80px">立库总览</h3>
    <div
      class="
        width80
        padding10
        borderradius
        margintopbot
        absolute
        transformtopleft
        flex flex-wrap
        justify-around
        align-center
      "
    >
      <div
        class="didproject-title width45 flex justify-around align-center borderdashed borderradius overflow pointer"
        v-for="(item, index) in titlelist"
        :style="'margin-top:' + item.margin"
        :key="index"
      >
        <div class="heigth padding10 overflow">
          <p class="text-center fontweight600 colorfff margin-top15" style="font-size: 50px">
            <countTo :startVal="startVal" :endVal="item.mun" :duration="3000"></countTo>
          </p>
          <p class="color409EFF" style="font-size: 50px">{{ item.titel }}</p>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import countTo from 'vue-count-to';
import { GetStorageOverviewData } from '@/api/Didproject';
export default {
  data() {
    return {
      startVal: 0,
      titlelist: [
        {
          titel: '库位总数',
          mun: 0,
          color: '#40C9C6'
        },
        {
          titel: '有货库位',
          mun: 0,
          color: '#F4516C'
        },
        {
          titel: '带件器具',
          mun: 0,
          color: '#36A3F7',
          margin: '1%'
        },
        {
          titel: '空器具数',
          mun: 0,
          color: '#34BFA3',
          margin: '1%'
        }
        // {
        //   titel: '制件总数',
        //   mun: 1,
        //   color: '#ffc637'
        // }
      ],
      cleartime: null
    };
  },
  components: { countTo },
  computed: {},
  mounted() {
    this.GetStorageOverviewData();
    this.cleartime = setInterval(() => {
      this.GetStorageOverviewData();
    }, 60000);
  },
  methods: {
    //跳转
    linkto() {
      const { href } = this.$router.resolve({
        path: '/statelibrary'
      });
      window.open(href, '_blank');
    },
    //立库总览和制件总览
    GetStorageOverviewData() {
      // no ç¼–号;title æ ‡é¢˜ï¼›value æ•°é‡
      GetStorageOverviewData().then(res => {
        let data = res.data || [];
        this.titlelist.forEach(item => {
          data.forEach(element => {
            if (item.titel == element.titel) {
              item.mun = element.value;
            }
          });
        });
      });
    }
  },
  beforeDestroy() {
    if (this.cleartime) {
      clearInterval(this.cleartime);
      this.cleartime = null;
    }
  }
};
</script>
<style lang="scss" scoped>
#statelibrary {
}
</style>
qqjf-Web/src/views/dataview/taskbeat.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
<template>
  <!-- ä»»åŠ¡èŠ‚æ‹ -->
  <div id="Taskbeat" class="global-content backgroundrgb">
    <div class="width80 height margin-auto overflow">
      <div class="width margintopbot flex align-center justify-end">
        <label class="colorfff fontsiez1rem">查询日期:</label>
        <el-date-picker
          class="margin-right"
          size="mini"
          value-format="yyyy-MM-dd"
          v-model="pickertime"
          type="date"
          placeholder="选择日期"
        >
        </el-date-picker>
        <el-button class="margin-right" type="primary" size="mini" @click="inquer">查询</el-button>
      </div>
      <div class="width height-calc90 overflow margin-top2">
        <task-echart class="width height" colors="#fff" :chartData="chartData" :colorList="colorList" :yTotals="yMax" />
        <!-- <div class="width height" ref="taskbeatEcharts"></div> -->
      </div>
    </div>
  </div>
</template>
<script>
import { GetTaskBeatAnalysis } from '@/api/reportforms';
import { GetDateStr } from '@/utils/date';
import TaskEchart from '@/views/Home/components/meterEchart.vue';
export default {
  data() {
    return {
      pickertime: GetDateStr(-1),
      chartData: {},
            yMax:-1,
      colorList: ['#0090FF', '#36CE9E', '#FFC005', '#FF515A', '#8B5CFF', '#00CA69']
    };
  },
  components: { TaskEchart },
  computed: {},
  mounted() {
    this.GetTaskBeatAnalysis();
  },
  methods: {
    inquer() {
      this.GetTaskBeatAnalysis();
    },
    GetTaskBeatAnalysis() {
      GetTaskBeatAnalysis({ startTime: this.pickertime }).then(res => {
                this.yMax = res.maxNum
                let stepTotal = 0;
                res.data[1].xdata = res.data[1].xdata.map((mapObj,mapIndex)=>{
                    stepTotal = stepTotal + Number(mapObj);
                    let rateVal = (this.yMax>0?Number((stepTotal/this.yMax*100).toFixed(2)):0)
                    res.data[0].xdata[mapIndex] = rateVal
                    return mapObj
                })
        this.chartData = res;
      });
    }
  }
};
</script>
<style lang="scss" scoped>
#Taskbeat {
}
</style>
qqjf-Web/src/views/dataview/tasktime.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
<template>
  <!-- ä»»åŠ¡å¹³å‡æ—¶é•¿-->
  <div id="tasktime" class="global-content backgroundrgb">
    <div class="width80 height margin-auto overflow">
      <div class="width margintopbot flex align-center justify-end">
        <label class="colorfff fontsiez1rem">查询日期:</label>
        <el-date-picker
          class="margin-right"
          v-model="pickertime"
          size="mini"
          type="daterange"
          value-format="yyyy-MM-dd"
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
        >
        </el-date-picker>
        <el-button class="margin-right" type="primary" size="mini" @click="inquer">查询</el-button>
      </div>
      <div class="width height-calc90 overflow margin-top2">
        <tasktime-echart class="width height" colors="#fff" :chartData="chartData" :colorList="colorList" />
      </div>
    </div>
  </div>
</template>
<script>
import { GetInOutAverageTime } from '@/api/reportforms';
import { GetDateStr } from '@/utils/date';
import TasktimeEchart from '@/views/Home/components/tasktimeecharts.vue';
export default {
  data() {
    return {
      pickertime: [GetDateStr(-15), GetDateStr(0)],
      chartData: {},
      colorList: [
        '#0090FF',
        '#36CE9E',
        '#FFC005',
        '#FF515A',
        '#8B5CFF',
        '#00CA69',
        '#F3A43B',
        '#D7504B',
        '#C6E579',
        '#F0805A',
        '#26C0C0',
        '#660077',
        '#FFCCCC',
        '#550088',
        '#FFFFBB',
        '#99FFFF',
        '#CC00CC',
        '#CC00CC',
        '#C63300',
        '#9955FF',
        '#66FF66',
        '#B5C334',
        '#FCCE10',
        '#27727B',
        '#FE8463',
        '#FAD860',
        '#F3A43B',
        '#D7504B',
        '#C6E579',
        '#F0805A',
        '#26C0C0',
        '#660077',
        '#FFCCCC',
        '#550088',
        '#FFAA33',
        '#CC00CC',
        '#FF77FF',
        '#C63300',
        '#F4E001',
        '#66FF66'
      ]
    };
  },
  components: { TasktimeEchart },
  computed: {},
  mounted() {
    this.GetInOutAverageTime();
  },
  methods: {
    inquer() {
      this.GetInOutAverageTime();
    },
    GetInOutAverageTime() {
      console.log(this.pickertime);
      let startTime = this.pickertime ? this.pickertime[0] : '';
      let endTime = this.pickertime ? this.pickertime[1] : '';
      GetInOutAverageTime({ startTime: startTime, endTime: endTime }).then(res => {
        this.chartData = res;
      });
    }
  }
};
</script>
<style lang="scss" scoped>
#tasktime {
}
</style>
qqjf-Web/src/views/dataview/turnover.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,138 @@
<template>
  <!-- åˆ¶ä»¶å‘¨è½¬ -->
  <div id="turnover" class="global-content backgroundrgb">
    <div class="width80 height margin-auto overflow">
      <div class="width margintopbot flex align-center justify-end">
        <div class="flex width12 align-center margin-right15 justify-end">
          <label class="colorfff fontsiez1rem">年:</label>
          <el-date-picker v-model="intimers.year" size="mini" value-format="yyyy" type="year" placeholder="选择年">
          </el-date-picker>
        </div>
        <div class="flex width20 margin-right15 align-center justify-end">
          <label class="colorfff fontsiez1rem">月:</label>
          <el-date-picker
            v-model="intimers.month"
            type="monthrange"
            size="mini"
            value-format="MM"
            format="MM"
            range-separator="至"
            start-placeholder="开始月份"
            end-placeholder="结束月份"
          >
          </el-date-picker>
        </div>
        <div class="flex width15 align-center margin-right15 justify-end">
          <label class="colorfff width40 fontsiez1rem">开始周:</label>
          <el-select style="width: 55%" v-model="intimers.stWeek" size="mini" clearable placeholder="请选择周">
            <el-option
              v-for="(item, index) in startweeklist"
              :key="index + 'startweek'"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
        </div>
        <div class="flex width15 align-center margin-right15 justify-end">
          <label class="colorfff width40 fontsiez1rem">结束周:</label>
          <el-select style="width: 55%" v-model="intimers.edWeek" size="mini" clearable placeholder="请选择周">
            <el-option
              v-for="(item, index) in endweeklist"
              :key="index + 'endtweek'"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
        </div>
        <el-button class="margin-right" type="primary" size="mini" @click="inquer">查询</el-button>
      </div>
      <div class="width height-calc90 overflow margin-top2">
        <turnover-echart class="width height" colors="#fff" :chartData="chartData" :colorList="colorList" />
        <!-- <div class="width height" ref="taskbeatEcharts"></div> -->
      </div>
    </div>
  </div>
</template>
<script>
import { GetPartTurnover } from '@/api/reportforms';
import TurnoverEchart from '@/views/Home/components/turnoverEchart.vue';
export default {
  data() {
    return {
      intimers: {
        year: '',
        month: null,
        stWeek: '',
        edWeek: ''
      },
      startweeklist: [
        {
          label: '第一周',
          value: 1
        },
        {
          label: '第二周',
          value: 2
        },
        {
          label: '第三周',
          value: 3
        },
        {
          label: '第四周',
          value: 4
        }
      ],
      endweeklist: [
        {
          label: '第一周',
          value: 1
        },
        {
          label: '第二周',
          value: 2
        },
        {
          label: '第三周',
          value: 3
        },
        {
          label: '第四周',
          value: 4
        }
      ],
      chartData: {},
      colorList: ['#0090FF', '#36CE9E', '#FFC005', '#FF515A', '#8B5CFF', '#00CA69']
    };
  },
  components: { TurnoverEchart },
  computed: {},
  mounted() {
    this.GetPartTurnover();
  },
  methods: {
    inquer() {
      this.GetPartTurnover();
    },
    GetPartTurnover() {
      const { year, stWeek, edWeek } = this.intimers;
      let stMonth = this.intimers.month ? this.intimers.month[0] : '';
      let edMonth = this.intimers.month ? this.intimers.month[1] : '';
      GetPartTurnover({ year, stWeek, edWeek, stMonth: stMonth, edMonth: edMonth }).then(res => {
        this.chartData = res;
      });
    }
  }
};
</script>
<style lang="scss" scoped>
#turnover {
  ::v-deep .el-input__inner {
    // width: 80%;
  }
}
</style>
qqjf-Web/src/views/dataview/warehouse.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
<template>
  <!-- è´§æ ¼åˆ©ç”¨çއ -->
  <div id="warehouse" class="global-content backgroundrgb">
    <div class="width80 height margin-auto overflow">
      <div class="width margintopbot flex align-center justify-end">
        <label class="colorfff fontsiez1rem">查询日期:</label>
        <el-date-picker
          class="margin-right"
          v-model="pickertime"
          size="mini"
          type="daterange"
          value-format="yyyy-MM-dd"
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
        >
        </el-date-picker>
        <el-button class="margin-right" type="primary" size="mini" @click="inquer">查询</el-button>
      </div>
      <div class="width height-calc90 overflow margin-top2">
        <warehouse-echart class="width height" colors="#fff" :chartData="chartData" :colorList="colorList" />
        <!-- <div class="width height" ref="taskbeatEcharts"></div> -->
      </div>
    </div>
  </div>
</template>
<script>
import { GetStorageVailability } from '@/api/reportforms';
import { GetDateStr } from '@/utils/date';
import WarehouseEchart from '@/views/Home/components/warehouseechart.vue';
export default {
  data() {
    return {
      pickertime: [GetDateStr(-15), GetDateStr(0)],
      chartData: {},
      colorList: ['#0090FF', '#36CE9E', '#FFC005', '#FF515A', '#8B5CFF', '#00CA69']
    };
  },
  components: { WarehouseEchart },
  computed: {},
  mounted() {
    this.GetStorageVailability();
  },
  methods: {
    inquer() {
      this.GetStorageVailability();
    },
    GetStorageVailability() {
      let objtimes = {
        startTime: this.pickertime ? this.pickertime[0] : '',
        endTime: this.pickertime ? this.pickertime[1] : ''
      };
      GetStorageVailability(objtimes).then(res => {
        this.chartData = res;
      });
    },
    //echarts
    init(res) {
      // this.myChart = echarts.init(this.$refs.taskbeatEcharts);
    }
  }
};
</script>
<style lang="scss" scoped>
#warehouse {
}
</style>
qqjf-Web/src/views/dataview/workpiece.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,142 @@
<template>
  <!-- åˆ¶ä»¶æ€»è§ˆ -->
  <div id="workpiece" class="global-content backgroundrgb">
    <h3 class="text-center fontsize2rem colorfff absolute transformtopleft12" style="font-size: 80px">制件总览</h3>
    <div
      class="
        width80
        padding10
        borderradius
        margintopbot
        absolute
        transformtopleft
        flex
        justify-around
        flex-wrap
        align-center
      "
    >
      <div
        class="didproject-title width45 flex justify-around align-center borderdashed borderradius overflow pointer"
        v-for="(item, index) in titlelist"
        :key="index"
        :style="'margin-top:' + item.margin"
      >
        <div class="heigth padding10 overflow">
          <p class="text-center fontsize2rem colorfff fontweight600 margin-top15" style="font-size: 50px">
            <countTo :startVal="startVal" :endVal="item.mun" :duration="3000"></countTo>
          </p>
          <p class="fontsize1_2rem color409EFF" style="font-size: 50px">{{ item.titel }}</p>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import countTo from 'vue-count-to';
import { GetHomeNumData } from '@/api/Didproject';
import { GetStorageOverviewData } from '@/api/Didproject';
import { ItemStorage } from '@/api/materials';
export default {
  data() {
    return {
      startVal: 0,
      titlelist: [
        {
          titel: '制件总数',
          name: '制件总数',
          mun: 0,
          color: '#ffc637'
        },
        {
          titel: '制件种类',
          name: '制件种类',
          mun: 0,
          color: '#40C9C6'
        },
        {
          titel: '今日入库',
          name: '今日入库零件数',
          mun: 0,
          color: '#F4516C',
          margin: '1%'
        },
        {
          titel: '今日出库',
          name: '今日出库零件数',
          mun: 0,
          color: '#36A3F7',
          margin: '1%'
        }
      ],
      cleartime: null,
      list: []
    };
  },
  components: { countTo },
  computed: {},
  mounted() {
    this.GetHomeNumData();
    this.cleartime = setInterval(() => {
      this.GetHomeNumData();
    }, 60000);
  },
  methods: {
    //跳转
    linkto() {
      const { href } = this.$router.resolve({
        path: '/workpiece'
      });
      window.open(href, '_blank');
    },
    //今日出入库数据
    GetHomeNumData() {
      // no ç¼–号;title æ ‡é¢˜ï¼›value æ•°é‡
      GetHomeNumData().then(res => {
        let data = res.data || [];
        this.list = data;
        this.GetStorageOverviewData(data);
      });
    },
    GetStorageOverviewData() {
      GetStorageOverviewData().then(res => {
        let data = res.data || [];
        this.list = this.list.concat(data);
        console.log(this.list);
        this.ItemStorage();
      });
    },
    ItemStorage() {
      ItemStorage('1&onePageNum=1').then(res => {
        if (res.code == 0) {
          this.list.push({
            titel: '制件种类',
            name: '制件种类',
            value: res.num
          });
          this.titlelist.forEach(item => {
            this.list.forEach(element => {
              if (item.name == element.titel) {
                item.mun = element.value;
              }
            });
          });
        }
        console.log(this.list);
      });
    }
  },
  beforeDestroy() {
    if (this.cleartime) {
      clearInterval(this.cleartime);
      this.cleartime = null;
    }
  }
};
</script>
<style lang="scss" scoped>
#workpiece {
}
</style>
qqjf-Web/src/views/inbound/components/enterEdit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,544 @@
<template>
  <div class="enterEdit height overflow">
    <div class="width overflow height92">
      <div class="width edter-height">
        <div class="flex margintopbot justify-between">
          <div class="width45 flex align-center">
            <label class="width40 textalign">组盘单号:</label>
            <el-input size="mini" disabled clearable v-model="iqnuer.cviCode" class="width60"> </el-input>
          </div>
          <div class="width45 flex align-center">
            <label class="width40 textalign">入库类型:</label>
            <el-select class="width60" size="mini" filterable clearable v-model="iqnuer.inType" placeholder="请选择">
              <el-option
                v-for="(item, index) in inTypeList"
                :key="'inType' + index"
                :label="item.label"
                :value="item.value"
              >
              </el-option>
            </el-select>
          </div>
        </div>
        <div class="flex margintopbot justify-between">
          <div class="width45 flex align-center">
            <label class="width40 textalign">制件状态:</label>
            <el-select
              class="width60"
              size="mini"
              clearable
              v-model="iqnuer.isBad"
              placeholder="请选择"
              @change="isbadchange"
            >
              <el-option
                v-for="(item, index) in isBadList"
                :key="'isbad' + index"
                :label="item.label"
                :value="item.value"
              >
              </el-option>
            </el-select>
          </div>
          <div class="width45 flex align-center">
            <label class="width40 textalign">器具编号:</label>
            <!-- <el-input size="mini" clearable v-model="iqnuer.containerName" class="width60"> </el-input> -->
            <el-select
              class="width60"
              size="mini"
              filterable
              remote
              reserve-keyword
              :remote-method="remoteMethod"
              :loading="remoloading"
              clearable
              @change="containerNamechange"
              v-model="iqnuer.containerName"
              placeholder="请输入关键词"
            >
              <el-option
                v-for="(item, index) in containerNamelist"
                :key="'badByFactory' + index"
                :label="item.label"
                :value="item.value"
              >
              </el-option>
            </el-select>
          </div>
        </div>
        <div class="flex margintopbot justify-between">
          <div class="width45 flex align-center">
            <label class="width40 textalign">返修类型:</label>
            <el-select class="width60" size="mini" clearable v-model="iqnuer.badByFactory" placeholder="请选择">
              <el-option
                v-for="(item, index) in badByFactorylist"
                :key="'badByFactory' + index"
                :label="item.label"
                :value="item.value"
              >
              </el-option>
            </el-select>
          </div>
          <div class="width45 flex align-center">
            <label class="width40 textalign">器具类型:</label>
            <el-input size="mini" disabled clearable v-model="iqnuer.containerType" class="width60"> </el-input>
          </div>
        </div>
        <div class="flex margintopbot justify-between">
          <div class="width45 flex align-center">
            <label class="width40 textalign">合计数量:</label>
            <el-input size="mini" disabled v-model="iqnuer.itemNum" class="width60"> </el-input>
          </div>
          <div class="width45 flex align-center">
            <label class="width40 textalign">合计重量:</label>
            <el-input size="mini" disabled v-model="iqnuer.totalWeight" class="width60"> </el-input>
          </div>
        </div>
        <div class="flex margintopbot justify-between">
          <div class="width45 flex align-center">
            <label class="width40 textalign">动态称重:</label>
            <el-input size="mini" disabled v-model="iqnuer.getWeight" class="width60"> </el-input>
          </div>
        </div>
        <el-button-group>
          <el-button type="primary" size="mini" icon="el-icon-plus" @click="$emit('partclick')">添加零件</el-button>
          <el-button type="primary" size="mini" icon="el-icon-delete" @click="deltable">删除</el-button>
        </el-button-group>
      </div>
      <div class="width enter-tebleheight overflow">
        <table-container
          height="88%"
          :wipelist="wipelist"
          :tableHead="tableHead"
          :tableData="tableData"
          :inOrderCodeList="inOrderCodeList"
          :setshow="false"
          :operation="true"
          :editShow="true"
          :naxnumShow="true"
          :selectionShow="true"
          :inputshow="true"
          :roweditshow="roweditshow"
          :currentPage="page"
          :pageSize="pageSize"
          :totle="totle"
          :operationwidth="80"
          @handleSelectionChange="handleSelectionChange"
          @CurrentChange="CurrentChange"
          @itemchange="itemchange"
        />
      </div>
    </div>
    <div class="enterEdit-button text-right margin-right15 margin-top2">
      <el-button type="primary" size="mini" class="form-buttom" :loading="savloading" @click="submitForm"
        >保存</el-button
      >
      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">取消</el-button>
    </div>
  </div>
</template>
<script>
import { TableContainer, Modal } from '@/components/index';
import { getCache, setCache } from '@/utils/sessionStorage';
import { GetDateStr, GetTimeStr, getDate } from '@/utils/date';
const { enterEdit } = require('@/components/tableContainer/tableHead');
import { ContainerSearch } from '@/api/palte';
import { itemSearch } from '@/api/enterchoose';
import { InOrderSearch } from '@/api/quotation';
import {
  ContainerVsItemSearch,
  ContainerVsItemAdd,
  ContainerVsItemUpdate,
  ContainerVsItemAddAll,
  GetCode
} from '@/api/enter';
import { ProductionLineSearch } from '@/api/cass-line';
export default {
  data() {
    return {
      userinfo: getCache('userInfo'),
      iqnuer: {
        cviCode: null,
        // itemName: null,
        isFinish: 0,
        containerName: null,
        itemNum: null,
        isBad: null,
        badByFactory: null,
        createLine: null,
        inType: null,
        itemList: null
      },
      remoloading: false,
      itemList: [],
      inTypeList: [
        {
          label: '即墨入库',
          value: '即墨入库'
        },
        {
          label: '李沧入库',
          value: '李沧入库'
        },
        {
          label: '余料回库',
          value: '余料回库'
        },
        {
          label: 'EU箱入立体库',
          value: 'EU箱入立体库'
        }
      ],
      isBadList: [
        {
          label: '返修',
          value: '1'
        },
        {
          label: '不返修',
          value: '0'
        }
      ],
      inOrderCodeList: [], //计划单号
      createLineList: [],
      containerNamelist: [], //器具编号
      badByFactorylist: [],
      wipelist: [],
      tableData: [],
      page: 1,
      totle: 0,
      pageSize: 20,
      Selection: [], //勾选数据
      storagelist: [], //存数据
      roweditshow: false,
      savloading: false
    };
  },
  props: {
    rowitem: {
      type: Object,
      default: () => {}
    },
    chooselist: {
      type: Array,
      default: () => []
    }
  },
  components: { TableContainer },
  computed: {
    tableHead() {
      return enterEdit;
    }
  },
  mounted() {
    console.log(this.userinfo.userName);
    if (JSON.stringify(this.rowitem) != '{}') {
      console.log(this.rowitem);
      this.iqnuer = this.rowitem;
      this.iqnuer.isBad = this.iqnuer.isBad == 1 ? '返修' : this.iqnuer.isBad == 0 ? '不返修' : this.iqnuer.isBad;
      this.ContainerVsItemSearch();
    } else {
      this.GetCode();
    }
    this.containerNamelist = [];
    this.ContainerSearch({ containerName: '' });
    // this.ProductionLineSearch();
  },
  methods: {
    //组盘编号
    GetCode() {
      GetCode().then(res => {
        this.iqnuer.cviCode = res;
      });
    },
    //生产计划单号
    InOrderSearch(row) {
      const { itemName } = row;
      InOrderSearch('1&onePageNum=999', { itemName }).then(res => {
        if (res.code == 0) {
          this.inOrderCodeList = res.data;
        }
      });
    },
    remoteMethod(query) {
      if (query !== '') {
        this.remoloading = true;
        setTimeout(() => {
          this.remoloading = false;
          this.ContainerSearch({ containerName: query });
        }, 200);
      }
    },
    //班线
    // ProductionLineSearch() {
    //   ProductionLineSearch('1&onePageNum=999', { isDestination: 0 }).then(res => {
    //     if (res.code == 0) {
    //       this.createLineList = res.data.filter(item => {
    //         if (item.productionName.indexOf('出口') == -1) {
    //           return item;
    //         }
    //       });
    //     }
    //   });
    // },
    //器具编号
    ContainerSearch(query) {
      const { containerName } = query;
      this.containerNamelist = [];
      ContainerSearch('1&onePageNum=999', { containerName }).then(res => {
        if (res.code == 0) {
          let data = res.data || [];
          data.forEach(element => {
            this.containerNamelist.push({
              label: element.containerName,
              value: element.containerName,
              containerType: element.containerType
            });
          });
        }
      });
    },
    //器具类型
    containerNamechange(e) {
      this.containerNamelist.forEach(element => {
        if (e == element.value) {
          this.iqnuer.containerType = element.containerType;
        }
      });
    },
    //编辑时获取零件列表数据
    ContainerVsItemSearch() {
      ContainerVsItemSearch(this.page, { containerName: this.rowitem.containerName }).then(res => {
        if (res.code == 0) {
          this.storgage(res.data);
          this.totle = res.num;
        }
      });
    },
    //分页
    CurrentChange(e) {
      this.page = e;
      this.ContainerVsItemSearch();
    },
    submitForm() {
      console.log(this.iqnuer);
      if (this.roweditshow) {
        this.$message({
          type: 'warning',
          message: '请先保存'
        });
      } else {
        if (this.storagelist.length == 0) {
          this.$message({
            type: 'warning',
            message: '请添加零件'
          });
        } else {
          this.iqnuer.isBad = this.iqnuer.isBad == '返修' ? 1 : this.iqnuer.isBad == '不返修' ? 0 : this.iqnuer.isBad;
          this.iqnuer.itemList = JSON.stringify(this.itemList);
          const { cviCode, inType, itemList, containerName, isBad, badByFactory } = this.iqnuer;
          if (this.iqnuer.isBad != null && this.iqnuer.inType != null && this.iqnuer.itemList != null) {
            this.savloading = true;
            //  createUser:this.userinfo.userName
            ContainerVsItemAddAll({
              cviCode,
              inType,
              itemList,
              containerName,
              isBad,
              badByFactory,
              createUser: this.userinfo.userName
            }).then(res => {
              if (res.code == 0) {
                this.$message({
                  type: 'success',
                  message: '添加成功'
                });
                this.$emit('cancel');
              } else {
                this.$message({
                  type: 'warning',
                  message: res.msg
                });
              }
              this.savloading = false;
            });
          }
        }
      }
    },
    //返修类型
    isbadchange(e) {
      console.log(e);
      this.iqnuer.badByFactory = '';
      if (e == 1) {
        this.badByFactorylist = [
          {
            label: '焊装返修',
            value: '焊装返修'
          },
          {
            label: '冲压返修',
            value: '冲压返修'
          }
        ];
      } else {
        this.badByFactorylist = [];
      }
    },
    //过滤存储
    storgage(lists) {
      let list = [...lists];
      list.forEach(element => {
        this.storagelist.push(element);
        // this.storagelist = lists;
        // this.iqnuer.itemName = this.storagelist[0].itemName;
        // if (JSON.stringify(this.rowitem) == '{}') {
        //   this.iqnuer.itemNum = 0;
        // }
      });
      this.itemList = [];
      this.filtration();
    },
    filtration(lists) {
      let list = [...this.storagelist];
      let weight = '';
      let getWeight = '';
      list.forEach(element => {
        element.edit = false;
        if (element.weight) {
          weight = element.weight;
        }
        if (JSON.stringify(this.rowitem) == '{}') {
          if (element.maxNum) {
            this.iqnuer.itemNum += parseInt(element.maxNum);
          }
          element.itemNum = element.maxNum;
        } else {
          element.maxNum = this.iqnuer.itemNum;
        }
        this.itemList.push({
          itemName: element.itemName,
          inOrderCode: element.inOrderCode,
          itemNum: element.maxNum
        });
      });
      if (weight && this.iqnuer.itemNum) {
        getWeight += weight * parseInt(this.iqnuer.itemNum);
      }
      this.iqnuer.totalWeight = getWeight;
      this.tableData = list;
    },
    //勾选table
    handleSelectionChange(e) {
      console.log(e);
      this.Selection = e;
    },
    //数量
    itemchange(e, item) {
      this.itemList = [];
      this.InOrderSearch(item);
      this.roweditshow = !this.roweditshow;
      this.iqnuer.itemNum = 0;
      let weight = '';
      let getWeight = '';
      e.forEach(element => {
        // element.edit = false;
        this.itemList.push({
          itemName: element.itemName,
          inOrderCode: element.inOrderCode,
          itemNum: element.maxNum
        });
        if (element.weight) {
          weight = element.weight;
        }
        if (element.maxNum) {
          this.iqnuer.itemNum += parseInt(element.maxNum);
        }
        element.itemNum = element.maxNum;
      });
      if (weight && this.iqnuer.itemNum) {
        getWeight += weight * parseInt(this.iqnuer.itemNum);
      }
      this.iqnuer.totalWeight = getWeight;
      this.storagelist = e;
      console.log(this.tableData);
      // this.chooselist.forEach(item => {
      //   if (item.itemName == e.itemName) {
      //     item.maxNum = e.itemNum;
      //   }
      // });
    },
    //删除表格数据
    deltable() {
      this.Selection.forEach(element => {
        let index = this.tableData.findIndex(item => item.itemName == element.itemName);
        let storgindex = this.storagelist.findIndex(item => item.itemName == element.itemName);
        this.tableData.splice(index, 1);
        this.storagelist.splice(storgindex, 1);
      });
      this.itemList = [];
      this.storagelist.forEach(element => {
        this.itemList.push({
          itemName: element.itemName,
          inOrderCode: element.inOrderCode,
          itemNum: element.maxNum
        });
      });
      // this.storgage(this.storagelist);
    }
  },
  watch: {
    chooselist: {
      handler(nvl, ovl) {
        this.storgage(nvl);
      },
      deep: true
    }
  }
};
</script>
<style lang="scss" scoped>
.enterEdit {
  width: 98%;
  padding: 1%;
  .edter-height {
    height: 220px;
  }
  .enter-tebleheight {
    height: calc(100% - 240px);
  }
  .show-pwd {
    position: absolute;
    right: 10px;
    top: 3px;
    font-size: 16px;
    color: #889aa4;
    cursor: pointer;
    user-select: none;
  }
  .centent-form {
    height: 92%;
    width: 100%;
    margin: auto;
  }
  .enterEdit-button {
  }
  ::v-deep .el-form-item__content {
    width: 60%;
  }
  ::v-deep .el-select {
    // width: 100%;
  }
}
</style>
qqjf-Web/src/views/inbound/components/enterchoose.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,149 @@
<template>
  <div class="quotationEdit height overflow">
    <div class="width overflow height92">
      <div>
        <div class="flex margintopbot justify-between">
          <div class="width50 flex align-center">
            <label class="width40 textalign">零件编号:</label>
            <el-input size="mini" clearable v-model="iqnuer.itemName" class="width60"> </el-input>
          </div>
          <div class="width50 flex align-center">
            <label class="width40 textalign">零件名称:</label>
            <el-input size="mini" clearable v-model="iqnuer.itemDes" class="width60"> </el-input>
          </div>
        </div>
        <div class="flex width justify-between">
          <div class="width50 flex align-center">
            <label class="width40 textalign">计划单号:</label>
            <el-select class="width60" size="mini" clearable v-model="iqnuer.inOrderCode" placeholder="请选择">
              <el-option
                v-for="(item, index) in inOrderCodelist"
                :key="'inOrderCode' + index"
                :label="item.label"
                :value="item.value"
              >
              </el-option>
            </el-select>
          </div>
          <div>
            <el-button type="primary" size="mini" @click="$emit('partclick')">查询</el-button>
            <el-button type="primary" size="mini" @click="$emit('addchoose')">新增</el-button>
          </div>
        </div>
      </div>
      <div class="width height82 overflow">
        <table-container
          height="91%"
          :wipelist="wipelist"
          :tableHead="tableHead"
          :tableData="tableData"
          :operation="false"
          :selectionShow="true"
          :totle="totle"
          @handleSelectionChange="handleSelectionChange"
        />
      </div>
    </div>
    <div class="quotationEdit-button text-right margin-right15 margin-top2">
      <el-button type="primary" size="mini" class="form-buttom" @click="submitForm">确认选择</el-button>
      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">取消</el-button>
    </div>
  </div>
</template>
<script>
import { TableContainer, Modal } from '@/components/index';
import { itemSearch } from '@/api/enterchoose';
const { edterchoose } = require('@/components/tableContainer/tableHead');
export default {
  data() {
    return {
      iqnuer: {},
      inOrderCodelist: [
        {
          label: '无',
          value: ''
        }
      ],
      wipelist: [],
      tableData: [],
      handlelist: [], //勾选数据
      totle: 0,
      page: 1
    };
  },
  props: {},
  components: { TableContainer },
  computed: {
    tableHead() {
      return edterchoose;
    }
  },
  mounted() {
    this.itemSearch();
  },
  methods: {
    //查询
    itemSearch() {
      this.$Loading(true);
      itemSearch(this.page).then(res => {
        if (res.code == 0) {
          this.tableData = res.data;
          this.totle = res.num;
        }
        this.$Loading();
      });
    },
    //勾选
    handleSelectionChange(e) {
      console.log(e);
      this.handlelist = e;
    },
    submitForm() {
      if (this.handlelist.length == 1) {
        this.$emit('chooseClick', this.handlelist, this.iqnuer.inOrderCode);
      } else if (this.handlelist.length == 0) {
        this.$message({
          type: 'warning',
          message: '请勾选一条数据'
        });
      } else if (this.handlelist.length > 1) {
        this.$message({
          type: 'warning',
          message: '只能勾选一条数据'
        });
      }
    }
  },
  watch: {}
};
</script>
<style lang="scss" scoped>
.quotationEdit {
  width: 98%;
  padding: 1%;
  .show-pwd {
    position: absolute;
    right: 10px;
    top: 3px;
    font-size: 16px;
    color: #889aa4;
    cursor: pointer;
    user-select: none;
  }
  .centent-form {
    height: 92%;
    width: 100%;
    margin: auto;
  }
  .quotationEdit-button {
  }
  ::v-deep .el-form-item__content {
    width: 60%;
  }
  ::v-deep .el-select {
    // width: 100%;
  }
}
</style>
qqjf-Web/src/views/inbound/components/inboundinuqer.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,240 @@
<template>
  <div class="flex align-center justify-between">
    <div class="">
      <el-button-group>
        <el-button type="primary"
                   size="mini"
                   v-if="add"
                   icon="el-icon-plus"
                   @click="$emit('addmodal')">新建</el-button>
        <el-button v-if="dele"
                   type="primary"
                   size="mini"
                   icon="el-icon-delete"
                   @click="$emit('deladd')">删除</el-button>
      </el-button-group>
      <el-button-group class="margin-left">
        <div class="flex">
          <el-upload class="upload-demo"
                     ref="upload"
                     action=""
                     accept=".xls,.xlsx"
                     :show-file-list="false"
                     :http-request="httprequest">
            <el-button v-if="imexcel"
                       style="margin-left: 10px"
                       icon="el-icon-upload2"
                       size="mini"
                       type="success">导入</el-button>
          </el-upload>
          <el-button v-if="derive"
                     style="margin-left: 10px"
                     type="primary"
                     size="mini"
                     icon="el-icon-download"
                     @click="$emit('derive')">导出</el-button>
        </div>
      </el-button-group>
      <el-button class="margin-left"
                 v-if="refresh"
                 :loading="loading"
                 size="mini"
                 icon="el-icon-refresh"
                 @click="$emit('refresh')">刷新</el-button>
    </div>
    <div id="topinquer"
         class="flex align-center justify-end">
      <div v-if="queryOrderStatusShow"
           class="flex align-center margin-right ">
        <label class="color909399 fontsizeinitial width7rem">订单状态:</label>
        <el-select v-model="iqnuer.OrderStatusId"
                   size="mini"
                   clearable>
          <el-option v-for="(item, index) in orderStatusList"
                     :label="item.label"
                     :value="item.value"
                     :key="index"></el-option>
        </el-select>
      </div>
      <div class="flex align-center margin-right ">
        <label class="color909399 fontsizeinitial width7rem">生产类型:</label>
        <el-select v-model="iqnuer.orderType"
                   size="mini"
                   clearable>
          <el-option v-for="(item, index) in orderTypelist"
                     :label="item.label"
                     :value="item.value"
                     :key="index"></el-option>
        </el-select>
      </div>
      <div id="maindatetimeer"
           v-if="datetimeshow"
           class="flex align-center margin-right">
        <label class="textalign color909399 width7rem fontsizeinitial">起止时间:</label>
        <el-date-picker size="mini"
                        v-model="iqnuer.timepick"
                        value-format="yyyy-MM-dd HH:mm:ss"
                        type="datetimerange"
                        range-separator="至"
                        start-placeholder="开始日期"
                        end-placeholder="结束日期">
        </el-date-picker>
      </div>
      <div class="flex align-center margin-right">
        <el-input size="mini"
                  clearable
                  v-model="iqnuer[filter]"
                  class="input-with-select">
          <el-select @change="selchange"
                     v-model="filter"
                     slot="prepend">
            <el-option v-for="(item, index) in filterList"
                       :label="item.label"
                       :value="item.value"
                       :key="index"></el-option>
          </el-select>
        </el-input>
      </div>
      <el-button type="primary"
                 size="mini"
                 @click="inquer">查询</el-button>
    </div>
  </div>
</template>
<script>
export default {
  data () {
    return {
      orderTypelist: [
        {
          label: '即墨入库',
          value: '即墨入库'
        },
        {
          label: '李沧入库',
          value: '李沧入库'
        }
      ],
      orderStatusList: [
        {
          label: '新建',
          value: 0
        },
        {
          label: '焊装审核中',
          value: 1
        },
        {
          label: '驳回',
          value: 3
        },
        {
          label: '完工',
          value: 4
        }
      ],
      iqnuer: {
        OrderStatusId: ''
      },
      filter: '',
      applytime: [],
      fileList: [],
      visible: false
    };
  },
  props: {
    queryOrderStatusShow: {
      type: Boolean,
      default: true
    },
    advanced: {
      type: Boolean,
      default: false
    },
    add: {
      type: Boolean,
      default: true
    },
    dele: {
      type: Boolean,
      default: false
    },
    refresh: {
      type: Boolean,
      default: true
    },
    tolead: {
      type: Boolean,
      default: false
    },
    derive: {
      type: Boolean,
      default: false
    },
    imexcel: {
      type: Boolean,
      default: false
    },
    loading: {
      type: Boolean,
      default: false
    },
    byfilter: {
      type: String,
      default: ''
    },
    filterList: {
      type: Array,
      default: () => []
    },
    datetimeshow: {
      type: Boolean,
      default: false
    }
  },
  mounted () {
    this.filter = this.byfilter;
  },
  methods: {
    inquer () {
      //console.log(this.iqnuer.orderStatus)
      this.$emit('inquer', this.iqnuer);
    },
    selchange () {
      this.iqnuer = {};
    },
    httprequest (file) {
      console.log(file);
      this.$emit('importfile', file);
    },
    inrefclear () {
      this.iqnuer = {};
    }
  },
  watch: {
    byfilter: {
      handler (nvl, ovl) {
        this.filter = nvl;
      }
    }
  }
};
</script>
<style lang="scss" scoped>
#topinquer {
  ::v-deep .el-select {
    width: 100px;
  }
  #maindatetimeer {
    ::v-deep .el-range-editor.el-input__inner {
      padding: 3px;
    }
    ::v-deep .el-date-editor--datetimerange.el-input,
    .el-date-editor--datetimerange.el-input__inner {
      width: 74%;
    }
  }
}
</style>
qqjf-Web/src/views/inbound/components/partschoose.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
<template>
  <div class="quotationEdit height overflow">
    <div class="width overflow height92">
      <div>
        <div class="flex justify-between">
          <div class="width40 flex align-center">
            <label class="width40 textalign">零件编号:</label>
            <el-input size="mini" clearable v-model="iqnuer.center" class="width60"> </el-input>
          </div>
          <div class="width40 flex align-center">
            <label class="width40 textalign">零件名称:</label>
            <el-input size="mini" clearable v-model="iqnuer.center" class="width60"> </el-input>
          </div>
          <el-button type="primary" size="mini" @click="$emit('partclick')">查询</el-button>
        </div>
      </div>
      <div class="width height94 overflow">
        <table-container
          height="91%"
          :wipelist="wipelist"
          :tableHead="tableHead"
          :tableData="tableData"
          :selectionShow="true"
          :operation="false"
          :totle="totle"
        />
      </div>
    </div>
    <div class="quotationEdit-button text-right margin-right15 margin-top2">
      <el-button type="primary" size="mini" class="form-buttom" @click="submitForm">确认选择</el-button>
      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">取消</el-button>
    </div>
  </div>
</template>
<script>
import { TableContainer, Modal } from '@/components/index';
const { partschoose } = require('@/components/tableContainer/tableHead');
export default {
  data() {
    return {
      iqnuer: {},
      wipelist: [],
      tableData: [
        {
          deviceName1: '张三'
        }
      ],
      totle: 0
    };
  },
  props: {
    rowitem: {
      type: Object,
      default: {}
    }
  },
  components: { TableContainer },
  computed: {
    tableHead() {
      return partschoose;
    }
  },
  mounted() {
    if (JSON.stringify(this.rowitem) != '{}') {
      this.registerForm = this.rowitem;
    }
  },
  methods: {
    submitForm(registerForm) {}
  },
  watch: {}
};
</script>
<style lang="scss" scoped>
.quotationEdit {
  width: 98%;
  padding: 1%;
  .show-pwd {
    position: absolute;
    right: 10px;
    top: 3px;
    font-size: 16px;
    color: #889aa4;
    cursor: pointer;
    user-select: none;
  }
  .centent-form {
    height: 92%;
    width: 100%;
    margin: auto;
  }
  .quotationEdit-button {
  }
  ::v-deep .el-form-item__content {
    width: 60%;
  }
  ::v-deep .el-select {
    // width: 100%;
  }
}
</style>
qqjf-Web/src/views/inbound/components/quotaionEdit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,345 @@
<template>
  <div class="quotationEdit height overflow">
    <div class="width overflow height92">
      <div class="quotationEdit-height">
        <div class="flex justify-between">
          <div class="width55 flex align-center">
            <label class="width40 textalign">生产计划单号:</label>
            <el-input size="mini"
                      disabled
                      v-model="iqnuer.inOrderCode"
                      class="width60"> </el-input>
          </div>
          <div class="width40 flex align-center">
            <label class="width40 textalign">生产类型:</label>
            <el-select class="width60"
                       size="mini"
                       clearable
                       :disabled="isReadOnly"
                       v-model="iqnuer.orderType"
                       placeholder="请选择"
                       required="true">
              <el-option v-for="item in orderTypelist"
                         :key="item.value"
                         :label="item.label"
                         :value="item.value">
              </el-option>
            </el-select>
          </div>
        </div>
        <div class="flex justify-between margintopbot">
          <div class="width55 flex align-center">
            <label class="width40 textalign">备注:</label>
            <el-input class="width60"
                      type="textarea"
                      clearable
                      :disabled="isReadOnly"
                      size="mini"
                      resize="none"
                      :autosize="{ minRows: 1, maxRows: 1 }"
                      placeholder="请输入内容"
                      v-model="iqnuer.textarea1">
            </el-input>
          </div>
          <div class="width40 flex align-center">
            <label class="width40 textalign">计划数量:</label>
            <el-input clearable
                      size="mini"
                      disabled
                      v-model="iqnuer.totalNum"
                      class="width60"> </el-input>
          </div>
        </div>
        <el-button-group>
          <el-button type="primary"
                     size="mini"
                     :disabled="isReadOnly"
                     icon="el-icon-plus"
                     @click="$emit('partclick')">新建</el-button>
          <el-button type="primary"
                     size="mini"
                     :disabled="isReadOnly"
                     icon="el-icon-delete"
                     @click="delclick">删除</el-button>
        </el-button-group>
      </div>
      <div class="width quotationEdit-tebleheight overflow">
        <table-container ref="tablecontainer"
                         height="91%"
                         :tableHead="tableHead"
                         :tableData="tableData"
                         :operation="true"
                         :editShow="true"
                         :setshow="false"
                         :naxnumShow="true"
                         :selectionShow="true"
                         :roweditshow="roweditshow"
                         :currentPage="page"
                         :pageSize="pageSize"
                         :totle="totle"
                         :inputshow="true"
                         @edit="edit"
                         @handleSelectionChange="handleSelectionChange"
                         @itemchange="itemchange"
                         @CurrentChange="CurrentChange" />
      </div>
    </div>
    <div class="quotationEdit-button text-right margin-right15 margin-top2">
      <el-button type="primary"
                 size="mini"
                 class="form-buttom"
                 :loading="savloading"
                 :disabled="isReadOnly"
                 @click="submitForm">保存</el-button>
      <el-button type="primary"
                 size="mini"
                 class="form-buttom"
                 @click="$emit('cancel')">取消</el-button>
    </div>
  </div>
</template>
<script>
import { TableContainer, Modal } from '@/components/index';
import { getCache, setCache, removeToken } from '@/utils/sessionStorage';
const { quotationedit } = require('@/components/tableContainer/tableHead');
import { InOrderGetCode } from '@/api/quotation';
import { getDate, GetTimeStr } from '@/utils/date';
import { itemSearch } from '@/api/enterchoose';
import { InOrderAddOrUpdate } from '@/api/quotation';
export default {
  data () {
    return {
      iqnuer: {
        inOrderCode: '', //计划单号
        orderType: '', //计划类型
        totalNum: '', //零件总数
        doneNum: '', //已下线数 æ–°å¢žä¼ 0,编辑,原数据返回
        userName: getCache('userInfo').userName, //创建人编号 å½“前登陆人状态
        productionLineCode: '', //(预留)传空
        doTime: '', //执行时间
        itemName: '', //零件编号传,其它零件信息可不传
        productionLineName: '' //暂时传空
      },
      orderTypelist: [
        {
          label: '即墨入库',
          value: '即墨入库'
        },
        {
          label: '李沧入库',
          value: '李沧入库'
        }
      ],
      tableData: [],
      savloading: false,
      totle: 0,
      page: 1,
      pageSize: 20,
      roweditshow: false
    };
  },
  props: {
    //是否只读
    isReadOnly: {
      type: Boolean,
      default: false
    },
    rowitem: {
      type: Object,
      default: () => { }
    },
    chooselist: {
      type: Array,
      default: () => []
    }
  },
  components: { TableContainer },
  computed: {
    tableHead () {
      return quotationedit;
    }
  },
  mounted () {
    if (JSON.stringify(this.rowitem) != '{}') {
      this.iqnuer = this.rowitem;
      this.itemSearch();
    } else {
      this.iqnuer.doneNum = 0;
      this.InOrderGetCode();
    }
  },
  methods: {
    //自动生成单号
    InOrderGetCode () {
      InOrderGetCode().then(res => {
        this.iqnuer.inOrderCode = res;
      });
    },
    //编辑时获取零件列表数据
    itemSearch () {
      itemSearch(this.page, { itemName: this.rowitem.itemName }).then(res => {
        if (res.code == 0) {
          let data = res.data;
          data.forEach(item => {
            item.image = process.env.IMAGE_URL + item.image;
          });
          this.storgage(data);
          this.totle = res.num;
        }
      });
    },
    //编辑
    edit (row) { },
    CurrentChange (e) {
      this.page = e;
      this.itemSearch();
    },
    submitForm () {
      if (this.roweditshow) {
        this.$message({
          type: 'warning',
          message: '请先保存'
        });
      } else {
        if (this.iqnuer.orderType == '') {
          this.$message({
            type: 'warning',
            message: '请选择生产类型'
          });
        } else {
          this.savloading = true;
          this.iqnuer.creatorId = getCache('userInfo').id;
          InOrderAddOrUpdate(this.iqnuer).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '添加成功'
              });
              this.$emit('cancel');
            } else {
              this.$message({
                type: 'warning',
                message: res.msg
              });
            }
            this.savloading = false;
          });
        }
      }
    },
    //过滤存储
    storgage (lists) {
      let list = [...lists];
      // list.forEach(element => {
      //   this.storagelist.push(element);
      this.storagelist = lists;
      // });
      this.filtration();
    },
    filtration (lists) {
      let list = [...this.storagelist];
      let getWeight = '';
      list.forEach(element => {
        element.edit = false;
        if (JSON.stringify(this.rowitem) != '{}') {
          element.doTime = this.rowitem.doTime;
          element.maxNum = this.rowitem.totalNum;
        } else {
          element.doTime = getDate() + ' ' + GetTimeStr(0);
          if (element.maxNum) {
            // this.iqnuer.totalNum += parseInt(element.maxNum);
            this.iqnuer.totalNum = element.maxNum;
          } else {
            this.iqnuer.totalNum = 0;
          }
        }
        // element.itemNum = element.maxNum;
      });
      const { doTime, itemName } = list[0];
      this.iqnuer.doTime = doTime;
      this.iqnuer.itemName = itemName;
      this.tableData = list;
    },
    //数量
    itemchange (e) {
      console.log(e);
      this.roweditshow = !this.roweditshow;
      const { maxNum, doTime } = e[0];
      this.iqnuer.totalNum = maxNum;
      this.iqnuer.doTime = doTime;
      // this.storgage(e);
      // this.iqnuer.itemNum = 0;
      // e.forEach(element => {
      //   element.edit = false;
      //   if (element.weight) {
      //     weight = element.weight;
      //   }
      //   if (element.maxNum) {
      //     this.iqnuer.itemNum += parseInt(element.maxNum);
      //   }
      //   element.itemNum = element.maxNum;
      // });
    },
    //勾选table
    handleSelectionChange (e) {
      console.log(e);
      this.Selection = e;
    },
    //删除
    delclick () {
      this.Selection.forEach(element => {
        let index = this.tableData.findIndex(item => item.itemName == element.itemName);
        let storgindex = this.storagelist.findIndex(item => item.itemName == element.itemName);
        this.tableData.splice(index, 1);
        this.storagelist.splice(storgindex, 1);
      });
      this.iqnuer.totalNum = 0;
    }
  },
  watch: {
    chooselist: {
      handler (nvl, ovl) {
        this.storgage(nvl);
      },
      deep: true
    }
  }
};
</script>
<style lang="scss" scoped>
.quotationEdit {
  width: 98%;
  padding: 1%;
  .quotationEdit-height {
    height: 120px;
  }
  .quotationEdit-tebleheight {
    height: calc(100% - 125px);
  }
  .show-pwd {
    position: absolute;
    right: 10px;
    top: 3px;
    font-size: 16px;
    color: #889aa4;
    cursor: pointer;
    user-select: none;
  }
  .centent-form {
    height: 92%;
    width: 100%;
    margin: auto;
  }
  .quotationEdit-button {
  }
  ::v-deep .el-form-item__content {
    width: 60%;
  }
  ::v-deep .el-select {
    // width: 100%;
  }
}
</style>
qqjf-Web/src/views/inbound/components/quotaion_relevanceEdit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,381 @@
<template>
  <div class="quotaion_relevanceEdit height overflow">
    <div class="width overflow height92">
      <div class="quotaion_relevanceEdit-height">
        <div class="flex justify-between">
          <div class="width55 flex align-center">
            <label class="width40 textalign">生产计划单号:</label>
            <el-input size="mini"
                      disabled
                      v-model="iqnuer.inOrderCode"
                      class="width60"> </el-input>
          </div>
          <div class="width40 flex align-center">
            <label class="width40 textalign">生产类型:</label>
            <el-select class="width60"
                       size="mini"
                       clearable
                       disabled
                       v-model="iqnuer.orderType"
                       placeholder="请选择"
                       required="true">
              <el-option v-for="item in orderTypelist"
                         :key="item.value"
                         :label="item.label"
                         :value="item.value">
              </el-option>
            </el-select>
          </div>
        </div>
        <div class="flex justify-between margintopbot">
          <div class="width55 flex align-center">
            <label class="width40 textalign">零件编号:</label>
            <el-input class="width60"
                      clearable
                      size="mini"
                      disabled
                      placeholder="请输入内容"
                      v-model="iqnuer.itemName">
            </el-input>
          </div>
          <div class="width40 flex align-center">
            <label class="width40 textalign">零件名称:</label>
            <el-input clearable
                      size="mini"
                      disabled
                      v-model="iqnuer.itemDes"
                      class="width60"> </el-input>
          </div>
        </div>
        <div class="flex justify-between margintopbot">
          <div class="width55 flex align-center">
            <label class="width40 textalign">备注:</label>
            <el-input class="width60"
                      type="textarea"
                      clearable
                      size="mini"
                      disabled
                      resize="none"
                      :autosize="{ minRows: 1, maxRows: 1 }"
                      placeholder="请输入内容"
                      v-model="iqnuer.textarea1">
            </el-input>
          </div>
          <div class="width40 flex align-center">
            <label class="width40 textalign">合计数量:</label>
            <el-input clearable
                      size="mini"
                      disabled
                      v-model="iqnuer.totalNum"
                      class="width60"> </el-input>
          </div>
        </div>
        <el-button-group>
          <el-button type="primary"
                     size="mini"
                     icon="el-icon-plus"
                     :disabled="isReadOnly"
                     @click="$emit('partclick')">新建</el-button>
          <el-button type="primary"
                     size="mini"
                     icon="el-icon-delete"
                     :disabled="isReadOnly"
                     @click="delclick">删除</el-button>
        </el-button-group>
      </div>
      <div class="width quotaion_relevanceEdit-tebleheight overflow">
        <table-container ref="tablecontainer"
                         height="91%"
                         :tableHead="tableHead"
                         :tableData="tableData"
                         :operation="true"
                         :editShow="true"
                         :setshow="false"
                         :naxnumShow="true"
                         :selectionShow="true"
                         :roweditshow="roweditshow"
                         :currentPage="page"
                         :pageSize="pageSize"
                         :totle="totle"
                         :inputshow="true"
                         :showSummary="true"
                         @edit="edit"
                         @handleSelectionChange="handleSelectionChange"
                         @itemchange="itemchange"
                         @CurrentChange="CurrentChange" />
      </div>
    </div>
    <div class="quotaion_relevanceEdit-button text-right margin-right15 margin-top2">
      <el-button type="primary"
                 size="mini"
                 class="form-buttom"
                 :disabled="isReadOnly"
                 :loading="savloading"
                 @click="submitForm">保存</el-button>
      <el-button type="primary"
                 size="mini"
                 class="form-buttom"
                 @click="$emit('cancel')">取消</el-button>
    </div>
  </div>
</template>
<script>
import { TableContainer, Modal } from '@/components/index';
import { getCache, setCache, removeToken } from '@/utils/sessionStorage';
const { quotaion_relevanceEdit } = require('@/components/tableContainer/tableHead');
import { InOrderGetCode } from '@/api/quotation';
import { getDate, GetTimeStr } from '@/utils/date';
import { itemSearch } from '@/api/enterchoose';
import { ContainerVsItemSearch, BindCviCode } from '@/api/enter';
import { InOrderAddOrUpdate } from '@/api/quotation';
export default {
  data () {
    return {
      iqnuer: {
        inOrderCode: '', //计划单号
        orderType: '', //计划类型
        totalNum: '', //零件总数
        doneNum: '', //已下线数 æ–°å¢žä¼ 0,编辑,原数据返回
        userName: getCache('userInfo').userName, //创建人编号 å½“前登陆人状态
        productionLineCode: '', //(预留)传空
        doTime: '', //执行时间
        itemName: '', //零件编号传,其它零件信息可不传
        productionLineName: '' //暂时传空
      },
      orderTypelist: [
        {
          label: '即墨入库',
          value: '即墨入库'
        },
        {
          label: '李沧入库',
          value: '李沧入库'
        }
      ],
      tableData: [],//列表数据
      savloading: false,
      totle: 0,
      page: 1,
      pageSize: 20,
      roweditshow: false
    };
  },
  props: {
    //是否只读
    isReadOnly: {
      type: Boolean,
      default: false
    },
    rowitem: {
      type: Object,
      default: () => { }
    },
    tableList: {
      type: Array,
      default: () => []
    }
  },
  components: { TableContainer },
  computed: {
    tableHead () {
      return quotaion_relevanceEdit;
    }
  },
  mounted () {
    if (JSON.stringify(this.rowitem) != '{}') {
      this.iqnuer = this.rowitem;
      this.itemSearch();
    } else {
      this.iqnuer.doneNum = 0;
      this.InOrderGetCode();
    }
  },
  methods: {
    //自动生成单号
    InOrderGetCode () {
      InOrderGetCode().then(res => {
        this.iqnuer.inOrderCode = res;
      });
    },
    //编辑时获取零件列表数据
    itemSearch () {
      ContainerVsItemSearch(this.page, {
        itemName: this.rowitem.itemName,
        cviCode: this.rowitem.inOrderCode  //传递 å†²åŽ‹è®¡åˆ’å•å· ã€Editby shaocx,2022-11-1】
      }).then(res => {
        if (res.code == 0) {
          let data = res.data;
          data.forEach(item => {
            item.image = process.env.IMAGE_URL + item.image;
          });
          this.storgage(data);
          this.totle = res.num;
        }
      });
    },
    //编辑
    edit (row) { },
    CurrentChange (e) {
      this.page = e;
      this.itemSearch();
    },
    submitForm () {
      if (this.roweditshow) {
        this.$message({
          type: 'warning',
          message: '请先保存'
        });
      } else {
        if (this.iqnuer.orderType == '') {
          this.$message({
            type: 'warning',
            message: '请选择生产类型'
          });
        } else {
          this.savloading = true;
          let _cviIds = this.tableData.map(item => {
            return item.id
          });
          var postData = {
            cviCode: this.iqnuer.inOrderCode,
            creatorId: getCache('userInfo').id,
            creatorName: getCache('userInfo').userName,
            cviIds: [..._cviIds]
          }
          //this.iqnuer.creatorId = getCache('userInfo').id;
          //this.iqnuer.creatorName = getCache('userInfo').userName;
          BindCviCode(postData).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '保存成功'
              });
              this.$emit('cancel');
            } else {
              this.$message({
                type: 'warning',
                message: res.msg
              });
            }
            this.savloading = false;
          });
        }
      }
    },
    //过滤存储
    storgage (lists) {
      let list = [...lists];
      // list.forEach(element => {
      //   this.storagelist.push(element);
      this.storagelist = lists;
      // });
      this.filtration();
    },
    filtration (lists) {
      let list = [...this.storagelist];
      let getWeight = '';
      list.forEach(element => {
        element.edit = false;
        /*
        if (JSON.stringify(this.rowitem) != '{}') {
          element.doTime = this.rowitem.doTime;
          element.maxNum = this.rowitem.totalNum;
        } else {
          element.doTime = getDate() + ' ' + GetTimeStr(0);
          if (element.maxNum) {
            // this.iqnuer.totalNum += parseInt(element.maxNum);
            this.iqnuer.totalNum = element.maxNum;
          } else {
            this.iqnuer.totalNum = 0;
          }
        }
        //*/
        // element.itemNum = element.maxNum;
      });
      //const { doTime, itemName } = list[0];
      //this.iqnuer.doTime = doTime;
      //this.iqnuer.itemName = itemName;
      this.tableData = list;
    },
    //数量
    itemchange (e) {
      console.log(e);
      this.roweditshow = !this.roweditshow;
      const { maxNum, doTime } = e[0];
      this.iqnuer.totalNum = maxNum;
      this.iqnuer.doTime = doTime;
      // this.storgage(e);
      // this.iqnuer.itemNum = 0;
      // e.forEach(element => {
      //   element.edit = false;
      //   if (element.weight) {
      //     weight = element.weight;
      //   }
      //   if (element.maxNum) {
      //     this.iqnuer.itemNum += parseInt(element.maxNum);
      //   }
      //   element.itemNum = element.maxNum;
      // });
    },
    //勾选table
    handleSelectionChange (e) {
      console.log(e);
      this.Selection = e;
    },
    //删除
    delclick () {
      this.Selection.forEach(element => {
        let index = this.tableData.findIndex(item => item.itemName == element.itemName);
        let storgindex = this.storagelist.findIndex(item => item.itemName == element.itemName);
        this.tableData.splice(index, 1);
        this.storagelist.splice(storgindex, 1);
      });
      this.iqnuer.totalNum = 0;
    }
  },
  watch: {
    tableList: {
      handler (nvl, ovl) {
        this.storgage(nvl);
      },
      deep: true
    }
  }
};
</script>
<style lang="scss" scoped>
.quotaion_relevanceEdit {
  width: 98%;
  padding: 1%;
  .quotaion_relevanceEdit-height {
    height: 180px;
  }
  .quotaion_relevanceEdit-tebleheight {
    height: calc(100% - 180px);
  }
  .show-pwd {
    position: absolute;
    right: 10px;
    top: 3px;
    font-size: 16px;
    color: #889aa4;
    cursor: pointer;
    user-select: none;
  }
  .centent-form {
    height: 92%;
    width: 100%;
    margin: auto;
  }
  .quotaion_relevanceEdit-button {
  }
  ::v-deep .el-form-item__content {
    width: 60%;
  }
  ::v-deep .el-select {
    // width: 100%;
  }
}
</style>
qqjf-Web/src/views/inbound/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
<template>
  <keep-alive>
    <router-view />
  </keep-alive>
</template>
<script>
export default {};
</script>
<style></style>
qqjf-Web/src/views/inbound/purchase/confirm_welding/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,734 @@
<!-- é¡µé¢ï¼šç„Šè£…确认 -->
<template>
  <!-- ä»“库信息 -->
  <div id="confirm_welding"
       class="global-content">
    <!-- ç­›é€‰ -->
    <inbound-inuqer ref="inref"
                    byfilter="计划单号"
                    :filterList="filterList"
                    :add="false"
                    :tolead="true"
                    :derive="true"
                    :imexcel="false"
                    :datetimeshow="true"
                    :queryOrderStatusShow="false"
                    @refresh="refresh"
                    @addmodal="addmodal"
                    @inquer="inquer"
                    @derive="derive"
                    @importfile="importfile" />
    <!-- <input type="file" accept=".xls,.xlsx" @change="readExcel($event)" /> -->
    <!-- table -->
    <div class="table">
      <table-container :tableHead="tableHead"
                       :tableData="tableData"
                       :editShow="false"
                       :viewShow="false"
                       :weldingAuditShow="false"
                       :unlineCommitShow="false"
                       :passShow="true"
                       :rejectShow="true"
                       :relevanceShow="true"
                       :pageSize="pageSize"
                       :totle="totle"
                       @edit="edit"
                       @view="view"
                       @relevance="relevance"
                       @weldingAudit="weldingAudit"
                       @passCommit="passCommit"
                       @rejectCommit="rejectCommit"
                       @SizeChange="SizeChange"
                       @CurrentChange="CurrentChange" />
    </div>
    <transition name="modal">
      <modal v-if="addmodalShow"
             :modabg="true"
             @cancel="addmodalShow = false">
        <p slot="title">冲压生产计划单-{{ title }}</p>
        <div class="height"
             slot="centent">
          <quotaion-edit @partclick="partShow = true"
                         :isReadOnly="partShow_readOnly"
                         @cancel="
              addmodalShow = false;
              refresh();
            "
                         :chooselist="chooselist"
                         :rowitem="rowitem"
                         @addsubmit="addsubmit" />
        </div>
      </modal>
    </transition>
    <transition name="modal">
      <modal v-if="relevanceModalShow"
             :modabg="true"
             @cancel="relevanceModalShow = false">
        <p slot="title">关联完工入库零件-{{ relevanceModalShow_title }}</p>
        <div class="height"
             slot="centent">
          <quotaion_relevanceEdit ref="quotaion_relevanceEditMethod"
                                  @partclick="clickAddForRelevanceFinishedPart"
                                  @cancel="
              relevanceModalShow = false;
              refresh();
            "
                                  :tableList="relevanceFinishedPartList"
                                  :chooseClick="chooseClick"
                                  :rowitem="rowitem"
                                  :isReadOnly="true"
                                  @addsubmit="addsubmit" />
        </div>
      </modal>
    </transition>
    <transition name="modal">
      <modal v-if="partShow"
             :modabg="true"
             @cancel="partShow = false">
        <p slot="title">零件选择</p>
        <div class="height"
             slot="centent">
          <choose ref="partChoose"
                  :wipelist="wipelist"
                  @chooseClick="chooseClick"
                  @cancel="partShow = false"
                  @addchoose="addchooseShow = true" />
        </div>
      </modal>
    </transition>
    <transition name="modal">
      <modal v-if="relevanceFinishedPartShow"
             :modabg="true"
             @cancel="relevanceFinishedPartShow = false">
        <p slot="title">选择关联完工入库零件</p>
        <div class="height"
             slot="centent">
          <chooseRelevanceFinishedPart ref="relevanceFinishedPartMethod"
                                       :wipelist="wipelist"
                                       :pItemName="pItemName"
                                       :pItemDes="pItemDes"
                                       @submitForm="submitRelevanceFinishedPart"
                                       @cancel="relevanceFinishedPartShow = false"
                                       @addchoose="addchooseShow = true" />
        </div>
      </modal>
    </transition>
    <el-dialog title="审批驳回"
               width="30%"
               :visible.sync="rejectModalShow">
      <el-form :model="rejectForm"
               label-width="100px">
        <el-form-item label="生产计划单号">
          <el-input disabled
                    v-model="rejectForm.inOrderCode"></el-input>
        </el-form-item>
        <el-form-item label="说明">
          <el-input v-model="rejectForm.Remark"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer"
           class="dialog-footer">
        <el-button @click="rejectModalShow = false">取 æ¶ˆ</el-button>
        <el-button type="primary"
                   @click="do_rejectCommit">ç¡® å®š</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { TableContainer, Modal, Choose, AddChoose, chooseRelevanceFinishedPart } from '@/components/index';//这里引用的是 vue文件的名字
import inboundInuqer from '../../components/inboundinuqer';
import quotaionEdit from '../../components/quotaionEdit';
import quotaion_relevanceEdit from '../../components/quotaion_relevanceEdit';
import { getimestampDate, getymdhms } from '@/utils/date';
import { exportTableList } from '@/utils/excel';
//const { quotation } = require('@/components/tableContainer/tableHead');
import { getCache, setCache, removeToken } from '@/utils/sessionStorage';
import { InOrderSearch, InOrderDelete, ImportInOrder, InOrderSend, UpdateUnlineNum, InOrderCheck, InOrderReject } from '@/api/quotation';
import XLSX from 'xlsx';
import { Collapse } from 'element-ui';
//列表显示列内容
const my_tableHead = [{
  columnDescription: '生产计划单号',
  columnName: 'inOrderCode',
  sortable: true,
  wipe: true,
  width: 200
},
{
  columnDescription: '生产类型',
  columnName: 'orderType',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '订单状态',
  columnName: 'orderStatus',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '零件编号',
  columnName: 'itemName',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '零件名称',
  columnName: 'itemDes',
  sortable: true,
  wipe: true,
  width: 200
},
{
  columnDescription: '计划生产数量',
  columnName: 'totalNum',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '总完工数',
  columnName: 'allFinishedNum',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '入库数量',
  columnName: 'DoneNum',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '线下交付数量',
  columnName: 'unLineNum',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '提交人',
  columnName: 'senderName',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '提交时间',
  columnName: 'SendTime',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '审核人',
  columnName: 'checkerName',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '审核结果',
  columnName: 'CheckResult',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '审核时间',
  columnName: 'CheckTime',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '审核说明',
  columnName: 'CheckRemark',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '备注',
  columnName: 'deviceName5',
  sortable: true,
  wipe: true
},
{
  columnDescription: '创建人',
  columnName: 'createName',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '创建时间',
  columnName: 'createTime',
  sortable: true,
  wipe: true,
  width: 150
}, {
  columnDescription: '修改人',
  columnName: 'updateName',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '修改时间',
  columnName: 'updateTime',
  sortable: true,
  wipe: true,
  width: 150
}
];
export default {
  name: 'confirm_welding',
  data () {
    return {
      partShow_readOnly: false,
      rejectForm: {
        inOrderCode: '',
        Remark: ''
      },
      rejectModalShow: false,
      pItemName: '',
      pItemDes: '',
      relevanceModalShow_title: '',
      title: '',
      tableData: [],
      modalShow: false,
      addmodalShow: false,
      relevanceModalShow: false,
      relevanceFinishedPartShow: false,
      partShow: false,
      addchooseShow: false,
      chooselist: [],
      relevanceFinishedPartList: [],
      rowitem: {},
      totle: 0,
      page: 1,
      pageSize: 20,
      wipelist: ['inOrderCode'],
      inuqerobg: {},
      filterList: [
        {
          value: '计划单号',
          label: '计划单号'
        }
      ]
    };
  },
  components: { TableContainer, inboundInuqer, Modal, quotaionEdit, Choose, AddChoose, quotaion_relevanceEdit, chooseRelevanceFinishedPart },
  computed: {
    tableHead () {
      return my_tableHead;
    }
  },
  created () { },
  mounted () {
    this.InOrderSearch();
    console.log(getymdhms());
  },
  methods: {
    clickAddForRelevanceFinishedPart () {
      //获取上一个窗体的内容
      let itemName = this.$refs.quotaion_relevanceEditMethod.iqnuer.itemName;
      let itemDes = this.$refs.quotaion_relevanceEditMethod.iqnuer.itemDes;
      this.pItemName = itemName;
      this.pItemDes = itemDes;
      this.relevanceFinishedPartShow = true
      // setTimeout(() => {
      //   //console.log('relevanceFinishedPartMethod:' + this.$refs.relevanceFinishedPartMethod)
      //   this.$refs.relevanceFinishedPartMethod.iqnuer.itemName = itemName;
      //   this.$refs.relevanceFinishedPartMethod.iqnuer.itemDes = itemDes;
      // }, 0)
    },
    //刷新
    refresh () {
      this.inuqerobg = {};
      this.$refs.inref.inrefclear();
      this.InOrderSearch();
    },
    //查询
    inquer (e) {
      this.page = 1;
      this.inuqerobg = e;
      this.InOrderSearch();
    },
    //导出
    derive () {
      let tHeader = [];
      let filterVal = [];
      this.tableHead.forEach(item => {
        tHeader.push(item.columnDescription);
        filterVal.push(item.columnName);
      });
      this.$Loading(true);
      const { è®¡åˆ’单号: inOrderCode } = this.inuqerobg;
      //OrderStatusId: '1' è¡¨ç¤ºçŠ¶æ€æ˜¯ ç„Šè£…审核中
      const orderType = this.inuqerobg.orderType;
      InOrderSearch('1&onePageNum=99999999', {
        inOrderCode, orderType, OrderStatusId: '1', CHECKERID: getCache('userInfo').id,
        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
      }).then(res => {
        if (res.code == 0) {
          let data = res.data;
          data.forEach(item => {
            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
            item.updateTime = item.updateTime ? getimestampDate(item.updateTime) : '';
          });
          exportTableList(tHeader, filterVal, data, '冲压计划' + getymdhms());
        }
        this.$Loading(false);
      });
    },
    //导入
    importfile (e) {
      this.readExcel(e);
    },
    //获取生产计划列表
    InOrderSearch () {
      this.$Loading(true);
      const { è®¡åˆ’单号: inOrderCode } = this.inuqerobg;
      //OrderStatusId: '1' è¡¨ç¤ºçŠ¶æ€æ˜¯ ç„Šè£…审核中
      const orderType = this.inuqerobg.orderType;
      InOrderSearch(this.page + '&onePageNum=' + this.pageSize, {
        inOrderCode, orderType, OrderStatusId: '1', CHECKERID: getCache('userInfo').id,
        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
      }).then(res => {
        if (res.code == 0) {
          this.tableData = res.data.filter(item => (item.doTime = getimestampDate(item.doTime)));
          this.totle = res.num;
        }
        this.$Loading();
      });
    },
    //分页
    CurrentChange (e) {
      console.log(e);
      this.page = e;
      this.InOrderSearch();
    },
    //页数
    SizeChange (e) {
      this.pageSize = e;
      this.InOrderSearch();
    },
    //编辑
    edit (row) {
      this.title = '编辑';
      this.partShow_readOnly = false;
      this.addmodalShow = true;
      this.rowitem = { ...row };
    },
    //查看
    view (row) {
      this.title = '查看';
      this.partShow_readOnly = true;
      this.addmodalShow = true;
      this.rowitem = { ...row };
    },
    //关联
    relevance (row) {
      this.relevanceModalShow_title = '关联';
      this.relevanceModalShow = true;
      this.rowitem = { ...row };
    },
    //发送焊装审核
    weldingAudit (row) {
      const { inOrderCode } = { ...row };
      //console.log(inOrderCode)
      this.$confirm('确定将计划单号"' + inOrderCode + '"提交焊装审核吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          InOrderSend({
            InOrderCode: inOrderCode,
            Remark: ''
          }).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '提交成功'
              });
              this.InOrderSearch();
            } else {
              this.$message({
                type: 'warning',
                message: '提交失败:' + res.msg
              });
            }
          });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消'
          });
        });
    },
    //通过
    passCommit (row) {
      const { inOrderCode } = { ...row };
      //console.log(inOrderCode)
      this.$confirm('确定将计划单号"' + inOrderCode + '"审核通过吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          InOrderCheck({
            InOrderCode: inOrderCode,
            Remark: ''
          }).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '提交成功'
              });
              this.InOrderSearch();
            } else {
              this.$message({
                type: 'warning',
                message: '提交失败:' + res.msg
              });
            }
          });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消'
          });
        });
    },
    //弹出 æ‹’绝
    rejectCommit (row) {
      this.rejectForm.inOrderCode = row.inOrderCode;
      this.rejectForm.Remark = '';
      this.rejectModalShow = true
    },
    //拒绝提交
    do_rejectCommit () {
      this.$confirm('确定将计划单号"' + this.rejectForm.inOrderCode + '"驳回吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          InOrderReject({
            InOrderCode: this.rejectForm.inOrderCode,
            Remark: this.rejectForm.Remark
          }).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '提交成功'
              });
              this.rejectModalShow = false;
              this.InOrderSearch();
            } else {
              this.$message({
                type: 'warning',
                message: '提交失败:' + res.msg
              });
            }
          });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消'
          });
        });
    },
    //删除
    del (row) {
      console.log(row);
      const { inOrderCode } = { ...row };
      this.$confirm('此操作将永久删除该生产计划信息, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          InOrderDelete({ inOrderCode }).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '删除成功'
              });
              this.InOrderSearch();
            } else {
              this.$message({
                type: 'warning',
                message: '删除失败'
              });
            }
          });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
    },
    //新建
    addmodal () {
      this.rowitem = {};
      this.addmodalShow = true;
      this.title = '新建';
    },
    //新增修改后
    addsubmit () {
      this.addmodalShow = false;
      this.modalShow = false;
      this.UserSearch();
    },
    //零件勾选数据
    chooseClick (e) {
      //alert(e)
      if (e.length > 0) {
        this.chooselist = [...e];
        this.partShow = false;
      } else {
        this.$message({
          type: 'info',
          message: '请勾选'
        });
      }
    },
    //完工零件勾选数据
    submitRelevanceFinishedPart (e) {
      //alert(e)
      //debugger
      //alert(this.$refs.quotaion_relevanceEditMethod.tableData.length);
      var oldDataList = this.$refs.quotaion_relevanceEditMethod.tableData;
      if (e.length > 0) {
        //处理,相同的就不再继续添加,没有的就添加
        var checkList = [...e];
        for (let i in checkList) {
          debugger
          //alert(checkList[i].id);
          var result = oldDataList.find(x => x.id == checkList[i].id);
          //alert(result)
          if (result == undefined) {
            //alert('填入')
            //alert(this.relevanceFinishedPartList.length);
            oldDataList.push(checkList[i]);
            //console.log(checkList[i])
            //alert('填入11')
          }
        }
        this.relevanceFinishedPartList = [...oldDataList];
        //alert(this.relevanceFinishedPartList.length);
        this.relevanceFinishedPartShow = false;
      } else {
        this.$message({
          type: 'info',
          message: '请勾选'
        });
      }
    },
    //新增零件后
    addchooseclick () {
      this.addchooseShow = false;
      this.$refs.partChoose.itemSearch();
    },
    readExcel (e) {
      // è¯»å–表格文件
      let _this = this;
      const files = e.file;
      // debugger;
      if (files.length <= 0) {
        return false;
      } else if (!/\.(xls|xlsx)$/.test(files.name.toLowerCase())) {
        this.$message({
          message: '上传格式不正确,请上传xls或者xlsx格式',
          type: 'warning'
        });
        return false;
      } else {
        // æ›´æ–°èŽ·å–æ–‡ä»¶å
        console.log(files);
      }
      const fileReader = new FileReader();
      fileReader.onload = ev => {
        try {
          const data = ev.target.result;
          const workbook = XLSX.read(data, {
            type: 'binary'
          });
          const wsname = workbook.SheetNames[0]; //取第一张表
          const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]); //生成json表格内容
          console.log(ws);
          let list = [];
          ws.forEach(item => {
            list.push({
              itemCode: item['零件编号'],
              inType: item['生产类型'],
              Desc: item['生产班线'],
              createTime: item['生产日期'],
              itemNum: item['生产数量']
            });
          });
          _this.ImportInOrder(JSON.stringify(list));
        } catch (e) {
          return false;
        }
      };
      fileReader.readAsBinaryString(files);
    },
    //导入接口
    ImportInOrder (list) {
      ImportInOrder({ userName: getCache('userInfo').userName, items: list }).then(res => {
        if (res.code == 0) {
          this.$message({
            type: 'success',
            message: '导入成功'
          });
        } else {
          this.$message({
            type: 'warning',
            message: '导入失败!请按照模板填入内容'
          });
        }
      });
      this.InOrderSearch();
    }
  }
};
</script>
<style lang="scss" scoped>
//赋值id为input_finished_product的样式
#confirm_welding {
  .table {
    width: 100%;
    margin-top: 10px;
    height: calc(100% - 40px);
    overflow: hidden;
  }
}
</style>
qqjf-Web/src/views/inbound/purchase/enter/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,290 @@
<template>
  <!-- ä»“库信息 -->
  <div id="enter"
       class="global-content">
    <!-- ç­›é€‰ -->
    <inbound-inuqer ref="inref"
                    byfilter="零件编号"
                    :filterList="filterList"
                    :loading="loading"
                    :tolead="false"
                    :derive="false"
                    :imexcel="false"
                    :datetimeshow="true"
                    @refresh="refresh"
                    @addmodal="addmodal"
                    @inquer="inquer" />
    <!-- table -->
    <div class="table">
      <table-container :wipelist="wipelist"
                       :tableHead="tableHead"
                       :tableData="tableData"
                       :editShow="true"
                       :delShow="true"
                       :currentPage="page"
                       :pageSize="pageSize"
                       :totle="totle"
                       @edit="edit"
                       @del="del"
                       @CurrentChange="CurrentChange"
                       @SizeChange="SizeChange"
                       @handleSelectionChange="handleSelectionChange" />
    </div>
    <transition name="modal">
      <modal v-if="addmodalShow"
             :modabg="true"
             @cancel="addmodalShow = false">
        <p slot="title">组盘-{{ title }}</p>
        <div class="height"
             slot="centent">
          <enter-edit @partclick="partShow = true"
                      @cancel="
              addmodalShow = false;
              refresh();
            "
                      :rowitem="rowitem"
                      :chooselist="chooselist"
                      @addsubmit="addsubmit" />
        </div>
      </modal>
    </transition>
    <transition name="modal">
      <modal v-if="partShow"
             :modabg="true"
             @cancel="partShow = false">
        <p slot="title">零件列表</p>
        <div class="height"
             slot="centent">
          <choose ref="enterChoose"
                  :choice="false"
                  @chooseClick="chooseClick"
                  @cancel="partShow = false"
                  @addchoose="addchooseShow = true" />
        </div>
      </modal>
    </transition>
  </div>
</template>
<script>
import { TableContainer, Modal, Choose, AddChoose } from '@/components/index';
import inboundInuqer from '../../components/inboundinuqer';
import enterEdit from '../../components/enterEdit';
// import enterChoose from '../../components/choose';
// import AddChoose from '../../components/addchoose';
const { enter } = require('@/components/tableContainer/tableHead');
import { ContainerVsItemSearch, ContainerVsItemDelete } from '@/api/enter';
export default {
  data () {
    return {
      title: '',
      tableData: [],
      modalShow: false,
      addmodalShow: false,
      partShow: false,
      addchooseShow: false,
      loading: false,
      chooselist: [], //零件数据
      wipelist: [],
      handleSeleclist: [], //勾选数据
      rowitem: {},
      totle: 0,
      page: 1,
      pageSize: 20,
      inuqerobg: {},
      filterList: [
        {
          value: '组盘编号',
          label: '组盘编号'
        },
        {
          value: '零件编号',
          label: '零件编号'
        },
        {
          value: '零件名称',
          label: '零件名称'
        },
        {
          value: '器具编号',
          label: '器具编号'
        },
        {
          value: '器具类型',
          label: '器具类型'
        },
        {
          value: '入库计划',
          label: '入库计划'
        },
        {
          value: '出库计划',
          label: '出库计划'
        },
        {
          value: '返修车间',
          label: '返修车间'
        },
        {
          value: '生产班线',
          label: '生产班线'
        }
      ]
    };
  },
  components: { TableContainer, inboundInuqer, Modal, enterEdit, Choose, AddChoose },
  computed: {
    tableHead () {
      return enter;
    }
  },
  mounted () {
    this.ContainerVsItemSearch();
  },
  methods: {
    //刷新
    refresh () {
      this.loading = true;
      this.inuqerobg = {};
      this.$refs.inref.inrefclear();
      this.ContainerVsItemSearch();
    },
    //查询
    inquer (e) {
      this.inuqerobg = e;
      this.page = 1;
      this.ContainerVsItemSearch();
    },
    //搜索用户
    ContainerVsItemSearch () {
      const {
        ç»„盘编号: cviCode,
        é›¶ä»¶ç¼–号: itemName,
        é›¶ä»¶åç§°: itemDes,
        å™¨å…·ç¼–号: containerName,
        å™¨å…·ç±»åž‹: containerType,
        å…¥åº“计划: inOrderCode,
        å‡ºåº“计划: outOrderCode,
        è¿”修车间: badByFactory,
        ç”Ÿäº§ç­çº¿: createLine
      } = this.inuqerobg;
      this.$Loading(true);
      ContainerVsItemSearch(this.page + '&onePageNum=' + this.pageSize, {
        itemName,
        itemDes,
        containerName,
        containerType,
        inOrderCode,
        outOrderCode,
        badByFactory,
        createLine,
        cviCode,
        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
      }).then(res => {
        this.loading = false;
        if (res.code == 0) {
          this.tableData = res.data;
          this.totle = res.num;
        }
        this.$Loading();
      });
    },
    CurrentChange (e) {
      console.log(e);
      this.page = e;
      this.ContainerVsItemSearch();
    },
    //页数
    SizeChange (e) {
      this.pageSize = e;
      this.ContainerVsItemSearch();
    },
    //编辑
    edit (row) {
      this.rowitem = { ...row };
      this.chooselist = []; //零件数据
      this.addmodalShow = true;
      this.title = '编辑';
    },
    //勾选
    handleSelectionChange (e) {
      this.handleSeleclist = e;
    },
    //删除
    del (row) {
      console.log(row);
      const { id } = { ...row };
      this.$confirm('此操作将永久删除该组盘信息, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          ContainerVsItemDelete({ id }).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '删除成功'
              });
              this.ContainerVsItemSearch();
            } else {
              this.$message({
                type: 'warning',
                message: '删除失败'
              });
            }
          });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
    },
    //新建
    addmodal () {
      this.rowitem = {};
      this.chooselist = [];
      this.addmodalShow = true;
      this.title = '新建';
    },
    //新增修改后
    addsubmit () {
      this.addmodalShow = false;
      this.modalShow = false;
      this.ContainerVsItemSearch();
    },
    //零件勾选数据
    chooseClick (e) {
      if (e.length > 0) {
        this.chooselist = [...e];
        this.partShow = false;
      } else {
        this.$message({
          type: 'info',
          message: '请勾选'
        });
      }
    },
    //新增零件后
    addchooseclick () {
      this.addchooseShow = false;
      this.$refs.enterChoose.itemSearch();
    }
  }
};
</script>
<style lang="scss" scoped>
#enter {
  .table {
    width: 100%;
    margin-top: 10px;
    height: calc(100% - 40px);
    overflow: hidden;
  }
}
</style>
qqjf-Web/src/views/inbound/purchase/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
<template>
  <router-view />
</template>
<script>
export default {};
</script>
<style></style>
qqjf-Web/src/views/inbound/purchase/input_finished_product/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,736 @@
<template>
  <!-- ä»“库信息 -->
  <div id="input_finished_product"
       class="global-content">
    <!-- ç­›é€‰ -->
    <inbound-inuqer ref="inref"
                    byfilter="计划单号"
                    :filterList="filterList"
                    :add="false"
                    :tolead="true"
                    :derive="true"
                    :imexcel="false"
                    :datetimeshow="true"
                    @refresh="refresh"
                    @addmodal="addmodal"
                    @inquer="inquer"
                    @derive="derive"
                    @importfile="importfile" />
    <!-- <input type="file" accept=".xls,.xlsx" @change="readExcel($event)" /> -->
    <!-- table -->
    <div class="table">
      <table-container :tableHead="tableHead"
                       :tableData="tableData"
                       :editShow="false"
                       :viewShow="true"
                       :weldingAuditShow="true"
                       :unlineCommitShow="true"
                       :relevanceShow="true"
                       :pageSize="pageSize"
                       :totle="totle"
                       :cellStyle="cellStyle"
                       @edit="edit"
                       @del="del"
                       @view="view"
                       @relevance="relevance"
                       @weldingAudit="weldingAudit"
                       @unlineCommit="unlineCommit"
                       @SizeChange="SizeChange"
                       @CurrentChange="CurrentChange" />
    </div>
    <transition name="modal">
      <modal v-if="addmodalShow"
             :modabg="true"
             @cancel="addmodalShow = false">
        <p slot="title">冲压生产计划单-{{ title }}</p>
        <div class="height"
             slot="centent">
          <quotaion-edit @partclick="partShow = true"
                         :isReadOnly="partShow_readOnly"
                         @cancel="
              addmodalShow = false;
              refresh();
            "
                         :chooselist="chooselist"
                         :rowitem="rowitem"
                         @addsubmit="addsubmit" />
        </div>
      </modal>
    </transition>
    <transition name="modal">
      <modal v-if="relevanceModalShow"
             :modabg="true"
             @cancel="relevanceModalShow = false">
        <p slot="title">关联完工入库零件-{{ relevanceModalShow_title }}</p>
        <div class="height"
             slot="centent">
          <quotaion_relevanceEdit ref="quotaion_relevanceEditMethod"
                                  @partclick="clickAddForRelevanceFinishedPart"
                                  @cancel="
              relevanceModalShow = false;
              refresh();
            "
                                  :tableList="relevanceFinishedPartList"
                                  :chooseClick="chooseClick"
                                  :rowitem="rowitem"
                                  @addsubmit="addsubmit" />
        </div>
      </modal>
    </transition>
    <transition name="modal">
      <modal v-if="partShow"
             :modabg="true"
             @cancel="partShow = false">
        <p slot="title">零件选择</p>
        <div class="height"
             slot="centent">
          <choose ref="partChoose"
                  :wipelist="wipelist"
                  @chooseClick="chooseClick"
                  @cancel="partShow = false"
                  @addchoose="addchooseShow = true" />
        </div>
      </modal>
    </transition>
    <transition name="modal">
      <modal v-if="aduitUserShow"
             :modabg="true"
             @cancel="aduitUserShow = false">
        <p slot="title">选择审核人</p>
        <div class="height"
             slot="centent">
          <chooseUser ref="userChoose"
                      :wipelist="wipelist"
                      @submitForm="do_weldingAudit"
                      @cancel="aduitUserShow = false"
                      @addchoose="addchooseShow = true" />
        </div>
      </modal>
    </transition>
    <transition name="modal">
      <modal v-if="relevanceFinishedPartShow"
             :modabg="true"
             @cancel="relevanceFinishedPartShow = false">
        <p slot="title">选择关联完工入库零件</p>
        <div class="height"
             slot="centent">
          <chooseRelevanceFinishedPart ref="relevanceFinishedPartMethod"
                                       :wipelist="wipelist"
                                       :pItemName="pItemName"
                                       :pItemDes="pItemDes"
                                       @submitForm="submitRelevanceFinishedPart"
                                       @cancel="relevanceFinishedPartShow = false"
                                       @addchoose="addchooseShow = true" />
        </div>
      </modal>
    </transition>
    <el-dialog title="线下交付"
               width="30%"
               :visible.sync="unlineCommitModalShow">
      <el-form :model="unlineCommitForm"
               label-width="100px">
        <el-form-item label="生产计划单号">
          <el-input disabled
                    v-model="unlineCommitForm.inOrderCode"></el-input>
        </el-form-item>
        <el-form-item label="线下交付数量">
          <el-input-number v-model="unlineCommitForm.qty"
                           :min="0"></el-input-number>
        </el-form-item>
      </el-form>
      <div slot="footer"
           class="dialog-footer">
        <el-button @click="unlineCommitModalShow = false">取 æ¶ˆ</el-button>
        <el-button type="primary"
                   @click="onSubmitUnlineCommitForm">ç¡® å®š</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { TableContainer, Modal, Choose, AddChoose, chooseRelevanceFinishedPart, chooseUser } from '@/components/index';//这里引用的是 vue文件的名字
import inboundInuqer from '../../components/inboundinuqer';
import quotaionEdit from '../../components/quotaionEdit';
import quotaion_relevanceEdit from '../../components/quotaion_relevanceEdit';
import { getimestampDate, getymdhms } from '@/utils/date';
import { exportTableList } from '@/utils/excel';
//const { quotation } = require('@/components/tableContainer/tableHead');
import { getCache, setCache, removeToken } from '@/utils/sessionStorage';
import { InOrderSearch, InOrderDelete, ImportInOrder, InOrderSend, UpdateUnlineNum } from '@/api/quotation';
import XLSX from 'xlsx';
import { Collapse } from 'element-ui';
//列表显示列内容
const my_tableHead = [{
  columnDescription: '生产计划单号',
  columnName: 'inOrderCode',
  sortable: true,
  wipe: true,
  width: 200
},
{
  columnDescription: '生产类型',
  columnName: 'orderType',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '订单状态',
  columnName: 'orderStatus',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '零件编号',
  columnName: 'itemName',
  sortable: true,
  wipe: true,
  width: 150
},
{
  columnDescription: '零件名称',
  columnName: 'itemDes',
  sortable: true,
  wipe: true,
  width: 200
},
{
  columnDescription: '计划生产数量',
  columnName: 'totalNum',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '总完工数',
  columnName: 'allFinishedNum',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '入库数量',
  columnName: 'DoneNum',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '线下交付数量',
  columnName: 'unLineNum',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '提交人',
  columnName: 'senderName',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '提交时间',
  columnName: 'SendTime',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '审核人',
  columnName: 'checkerName',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '审核结果',
  columnName: 'CheckResult',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '审核时间',
  columnName: 'CheckTime',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '审核说明',
  columnName: 'CheckRemark',
  sortable: true,
  wipe: true,
  width: 120
},
{
  columnDescription: '备注',
  columnName: 'deviceName5',
  sortable: true,
  wipe: true
},
{
  columnDescription: '创建人',
  columnName: 'createName',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '创建时间',
  columnName: 'createTime',
  sortable: true,
  wipe: true,
  width: 150
}, {
  columnDescription: '修改人',
  columnName: 'updateName',
  sortable: true,
  wipe: true,
  width: 100
},
{
  columnDescription: '修改时间',
  columnName: 'updateTime',
  sortable: true,
  wipe: true,
  width: 150
}
];
export default {
  name: 'input_finished_product',
  data () {
    return {
      curSelectInOrderCode: '',//当前选择的计划单号
      aduitUserShow: false,
      partShow_readOnly: false,
      unlineCommitForm: {
        inOrderCode: '',
        qty: 0
      },
      unlineCommitModalShow: false,
      pItemName: '',
      pItemDes: '',
      relevanceModalShow_title: '',
      title: '',
      tableData: [],
      modalShow: false,
      addmodalShow: false,
      relevanceModalShow: false,
      relevanceFinishedPartShow: false,
      partShow: false,
      addchooseShow: false,
      chooselist: [],
      relevanceFinishedPartList: [],
      rowitem: {},
      totle: 0,
      page: 1,
      pageSize: 20,
      wipelist: ['inOrderCode'],
      inuqerobg: {},
      filterList: [
        {
          value: '计划单号',
          label: '计划单号'
        }
      ]
    };
  },
  components: { TableContainer, inboundInuqer, Modal, quotaionEdit, Choose, AddChoose, quotaion_relevanceEdit, chooseRelevanceFinishedPart, chooseUser },
  computed: {
    tableHead () {
      return my_tableHead;
    }
  },
  created () { },
  mounted () {
    this.InOrderSearch();
    console.log(getymdhms());
  },
  methods: {
    cellStyle ({ row, rowIndex }) {
      if (row.OrderStatusId === 3) {//3是 é©³å›ž
        return 'background: #aa7798;color:white'
      }
      return ''
    },
    clickAddForRelevanceFinishedPart () {
      //获取上一个窗体的内容
      let itemName = this.$refs.quotaion_relevanceEditMethod.iqnuer.itemName;
      let itemDes = this.$refs.quotaion_relevanceEditMethod.iqnuer.itemDes;
      this.pItemName = itemName;
      this.pItemDes = itemDes;
      this.relevanceFinishedPartShow = true
      // setTimeout(() => {
      //   //console.log('relevanceFinishedPartMethod:' + this.$refs.relevanceFinishedPartMethod)
      //   this.$refs.relevanceFinishedPartMethod.iqnuer.itemName = itemName;
      //   this.$refs.relevanceFinishedPartMethod.iqnuer.itemDes = itemDes;
      // }, 0)
    },
    //刷新
    refresh () {
      this.inuqerobg = {};
      this.$refs.inref.inrefclear();
      this.InOrderSearch();
    },
    //查询
    inquer (e) {
      this.page = 1;
      this.inuqerobg = e;
      this.InOrderSearch();
    },
    //导出
    derive () {
      let tHeader = [];
      let filterVal = [];
      this.tableHead.forEach(item => {
        tHeader.push(item.columnDescription);
        filterVal.push(item.columnName);
      });
      this.$Loading(true);
      const { è®¡åˆ’单号: inOrderCode } = this.inuqerobg;
      const OrderStatusId = this.inuqerobg.OrderStatusId;
      const orderType = this.inuqerobg.orderType;
      InOrderSearch('1&onePageNum=99999999', {
        inOrderCode, orderType, OrderStatusId, InOrderPageType: '完工品输入页面', createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
      }).then(res => {
        if (res.code == 0) {
          let data = res.data;
          data.forEach(item => {
            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
            item.updateTime = item.updateTime ? getimestampDate(item.updateTime) : '';
          });
          exportTableList(tHeader, filterVal, data, '冲压计划' + getymdhms());
        }
        this.$Loading(false);
      });
    },
    //导入
    importfile (e) {
      this.readExcel(e);
    },
    //获取生产计划列表
    InOrderSearch () {
      this.$Loading(true);
      const { è®¡åˆ’单号: inOrderCode } = this.inuqerobg;
      const OrderStatusId = this.inuqerobg.OrderStatusId;
      const orderType = this.inuqerobg.orderType;
      InOrderSearch(this.page + '&onePageNum=' + this.pageSize, {
        inOrderCode, orderType, OrderStatusId, InOrderPageType: '完工品输入页面',
        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
      }).then(res => {
        if (res.code == 0) {
          this.tableData = res.data.filter(item => (item.doTime = getimestampDate(item.doTime)));
          this.totle = res.num;
        }
        this.$Loading();
      });
    },
    //分页
    CurrentChange (e) {
      console.log(e);
      this.page = e;
      this.InOrderSearch();
    },
    //页数
    SizeChange (e) {
      this.pageSize = e;
      this.InOrderSearch();
    },
    //编辑
    edit (row) {
      this.title = '编辑';
      this.partShow_readOnly = false;
      this.addmodalShow = true;
      this.rowitem = { ...row };
    },
    //查看
    view (row) {
      this.title = '查看';
      this.partShow_readOnly = true;
      this.addmodalShow = true;
      this.rowitem = { ...row };
    },
    //关联
    relevance (row) {
      this.relevanceModalShow_title = '关联';
      this.relevanceModalShow = true;
      this.rowitem = { ...row };
    },
    //提出 ç„Šè£…审核人
    weldingAudit (row) {
      const { inOrderCode } = { ...row };
      this.curSelectInOrderCode = inOrderCode;
      this.aduitUserShow = true;
    },
    //发送焊装审核
    do_weldingAudit (e) {
      let userId = 0;
      if (e.length > 0) {
        var checkList = [...e];
        userId = checkList[0].id;
      } else {
        this.$message({
          type: 'info',
          message: '请勾选'
        });
      }
      //console.log(userId + ' ' + this.curSelectInOrderCode)
      this.$confirm('确定将计划单号"' + this.curSelectInOrderCode + '"提交焊装审核吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          InOrderSend({
            InOrderCode: this.curSelectInOrderCode,
            SendUserId: getCache('userInfo').id,//提交审核人
            AuditUserId: userId,//审核人
            Remark: ''
          }).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '提交成功'
              });
              this.aduitUserShow = false;
              this.InOrderSearch();
            } else {
              this.$message({
                type: 'warning',
                message: '提交失败:' + res.msg
              });
            }
          });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消'
          });
        });
    },
    //弹出 çº¿ä¸‹äº¤ä»˜
    unlineCommit (row) {
      this.unlineCommitForm.inOrderCode = row.inOrderCode;
      this.unlineCommitForm.qty = row.unLineNum;
      this.unlineCommitModalShow = true
    },
    //线下交付
    onSubmitUnlineCommitForm () {
      this.$confirm('确定将计划单号"' + this.unlineCommitForm.inOrderCode + '"提交线下交付数量吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          UpdateUnlineNum({
            InOrderCode: this.unlineCommitForm.inOrderCode,
            Qty: this.unlineCommitForm.qty
          }).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '提交成功'
              });
              this.unlineCommitModalShow = false;
              this.InOrderSearch();
            } else {
              this.$message({
                type: 'warning',
                message: '提交失败:' + res.msg
              });
            }
          });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消'
          });
        });
    },
    //删除
    del (row) {
      console.log(row);
      const { inOrderCode } = { ...row };
      this.$confirm('此操作将永久删除该生产计划信息, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          InOrderDelete({ inOrderCode }).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '删除成功'
              });
              this.InOrderSearch();
            } else {
              this.$message({
                type: 'warning',
                message: '删除失败'
              });
            }
          });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
    },
    //新建
    addmodal () {
      this.rowitem = {};
      this.addmodalShow = true;
      this.title = '新建';
    },
    //新增修改后
    addsubmit () {
      this.addmodalShow = false;
      this.modalShow = false;
      this.UserSearch();
    },
    //零件勾选数据
    chooseClick (e) {
      //alert(e)
      if (e.length > 0) {
        this.chooselist = [...e];
        this.partShow = false;
      } else {
        this.$message({
          type: 'info',
          message: '请勾选'
        });
      }
    },
    //完工零件勾选数据
    submitRelevanceFinishedPart (e) {
      //alert(e)
      //debugger
      //alert(this.$refs.quotaion_relevanceEditMethod.tableData.length);
      var oldDataList = this.$refs.quotaion_relevanceEditMethod.tableData;
      if (e.length > 0) {
        //处理,相同的就不再继续添加,没有的就添加
        var checkList = [...e];
        for (let i in checkList) {
          debugger
          //alert(checkList[i].id);
          var result = oldDataList.find(x => x.id == checkList[i].id);
          //alert(result)
          if (result == undefined) {
            //alert('填入')
            //alert(this.relevanceFinishedPartList.length);
            oldDataList.push(checkList[i]);
            //console.log(checkList[i])
            //alert('填入11')
          }
        }
        this.relevanceFinishedPartList = [...oldDataList];
        //alert(this.relevanceFinishedPartList.length);
        this.relevanceFinishedPartShow = false;
      } else {
        this.$message({
          type: 'info',
          message: '请勾选'
        });
      }
    },
    //新增零件后
    addchooseclick () {
      this.addchooseShow = false;
      this.$refs.partChoose.itemSearch();
    },
    readExcel (e) {
      // è¯»å–表格文件
      let _this = this;
      const files = e.file;
      // debugger;
      if (files.length <= 0) {
        return false;
      } else if (!/\.(xls|xlsx)$/.test(files.name.toLowerCase())) {
        this.$message({
          message: '上传格式不正确,请上传xls或者xlsx格式',
          type: 'warning'
        });
        return false;
      } else {
        // æ›´æ–°èŽ·å–æ–‡ä»¶å
        console.log(files);
      }
      const fileReader = new FileReader();
      fileReader.onload = ev => {
        try {
          const data = ev.target.result;
          const workbook = XLSX.read(data, {
            type: 'binary'
          });
          const wsname = workbook.SheetNames[0]; //取第一张表
          const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]); //生成json表格内容
          console.log(ws);
          let list = [];
          ws.forEach(item => {
            list.push({
              itemCode: item['零件编号'],
              inType: item['生产类型'],
              Desc: item['生产班线'],
              createTime: item['生产日期'],
              itemNum: item['生产数量']
            });
          });
          _this.ImportInOrder(JSON.stringify(list));
        } catch (e) {
          return false;
        }
      };
      fileReader.readAsBinaryString(files);
    },
    //导入接口
    ImportInOrder (list) {
      ImportInOrder({ userName: getCache('userInfo').userName, items: list }).then(res => {
        if (res.code == 0) {
          this.$message({
            type: 'success',
            message: '导入成功'
          });
        } else {
          this.$message({
            type: 'warning',
            message: '导入失败!请按照模板填入内容'
          });
        }
      });
      this.InOrderSearch();
    }
  }
};
</script>
<style lang="scss" scoped>
//赋值id为input_finished_product的样式
#input_finished_product {
  .table {
    width: 100%;
    margin-top: 10px;
    height: calc(100% - 40px);
    overflow: hidden;
  }
}
</style>
qqjf-Web/src/views/inbound/purchase/intype/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,186 @@
<template>
  <!-- ä»“库信息 -->
  <div id="intype" class="global-content">
    <!-- ç­›é€‰ -->
    <inbound-inuqer
      ref="inref"
      byfilter="入库类型"
      :filterList="filterList"
      :tolead="false"
      :derive="false"
      @refresh="refresh"
      @addmodal="addmodal"
      @inquer="inquer"
    />
    <!-- table -->
    <div class="table">
      <table-container
        :tableHead="tableHead"
        :tableData="tableData"
        :editShow="true"
        :delShow="true"
        :operation="false"
        :pageSize="pageSize"
        :totle="totle"
        @edit="edit"
        @del="del"
        @CurrentChange="CurrentChange"
      />
    </div>
  </div>
</template>
<script>
import { TableContainer, Modal } from '@/components/index';
import inboundInuqer from '../../components/inboundinuqer';
const { intype } = require('@/components/tableContainer/tableHead');
import { InTypeSearch } from '@/api/intype';
export default {
  data() {
    return {
      title: '',
      tableData: [],
      modalShow: false,
      addmodalShow: false,
      partShow: false,
      addchooseShow: false,
      chooselist: [],
      rowitem: {},
      totle: 0,
      page: 1,
      pageSize: 20,
      wipelist: ['inOrderCode'],
      inuqerobg: {},
      filterList: [
        {
          value: '入库类型',
          label: '入库类型'
        },
        {
          value: '目标仓库',
          label: '目标仓库名'
        }
      ]
    };
  },
  components: { TableContainer, inboundInuqer, Modal },
  computed: {
    tableHead() {
      return intype;
    }
  },
  mounted() {
    this.InTypeSearch();
  },
  methods: {
    //刷新
    refresh() {
      this.inuqerobg = {};
      this.$refs.inref.inrefclear();
      this.InTypeSearch();
    },
    //查询
    inquer(e) {
      console.log(e);
      this.page = 1;
      this.inuqerobg = e;
      this.InTypeSearch();
    },
    //获取生产计划列表
    InTypeSearch() {
      this.$Loading(true);
      const { è®¡åˆ’单号: inOrderCode, ç”Ÿäº§ç±»åž‹: orderType, è®¢å•状态: orderStatus } = this.inuqerobg;
      InTypeSearch(this.page + '&onePageNum=' + this.pageSize, { inOrderCode, orderType, orderStatus }).then(res => {
        if (res.code == 0) {
          this.tableData = res.data;
          this.totle = res.num;
        }
        this.$Loading();
      });
    },
    CurrentChange(e) {
      console.log(e);
      this.page = e;
      this.InTypeSearch();
    },
    //编辑
    edit(row) {
      this.addmodalShow = true;
      this.rowitem = { ...row };
      this.title = '编辑';
    },
    //删除
    del(row) {
      console.log(row);
      const { inOrderCode } = { ...row };
      this.$confirm('此操作将永久删除该生产计划信息, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          InOrderDelete({ inOrderCode }).then(res => {
            if (res.code == 0) {
              this.$message({
                type: 'success',
                message: '删除成功'
              });
              this.InTypeSearch();
            } else {
              this.$message({
                type: 'warning',
                message: '删除失败'
              });
            }
          });
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
    },
    //新建
    addmodal() {
      this.rowitem = {};
      this.addmodalShow = true;
      this.title = '新建';
    },
    //新增修改后
    addsubmit() {
      this.addmodalShow = false;
      this.modalShow = false;
      this.UserSearch();
    },
    //零件勾选数据
    chooseClick(e) {
      if (e.length > 0) {
        this.chooselist = [...e];
        this.partShow = false;
      } else {
        this.$message({
          type: 'info',
          message: '请勾选'
        });
      }
    },
    //新增零件后
    addchooseclick() {
      this.addchooseShow = false;
      this.$refs.partChoose.itemSearch();
    }
  }
};
</script>
<style lang="scss" scoped>
#intype {
  .table {
    width: 100%;
    margin-top: 10px;
    height: calc(100% - 40px);
    overflow: hidden;
  }
}
</style>
在上述文件截断后对比
qqjf-Web/src/views/inbound/purchase/quotation/index.vue qqjf-Web/src/views/login/index.vue qqjf-Web/src/views/outbound/components/outinquer.vue qqjf-Web/src/views/outbound/components/plantEdit.vue qqjf-Web/src/views/outbound/index.vue qqjf-Web/src/views/outbound/regulator/index.vue qqjf-Web/src/views/outbound/regulator/plant/index.vue qqjf-Web/src/views/reportforms/Taskbeat/index.vue qqjf-Web/src/views/reportforms/classified/index.vue qqjf-Web/src/views/reportforms/index.vue qqjf-Web/src/views/reportforms/movablerate/index.vue qqjf-Web/src/views/reportforms/output/index.vue qqjf-Web/src/views/reportforms/product/index.vue qqjf-Web/src/views/reportforms/rateequipment/index.vue qqjf-Web/src/views/reportforms/statelibrary/index.vue qqjf-Web/src/views/reportforms/statistics/components/eltablecolumn.vue qqjf-Web/src/views/reportforms/statistics/components/statisticsinquer.vue qqjf-Web/src/views/reportforms/statistics/components/statisticstable.vue qqjf-Web/src/views/reportforms/statistics/index.vue qqjf-Web/src/views/reportforms/tasktime/index.vue qqjf-Web/src/views/reportforms/turnover/index.vue qqjf-Web/src/views/reportforms/warehouse/index.vue qqjf-Web/src/views/reportforms/workpiece/index.vue qqjf-Web/src/views/statistics/index.vue qqjf-Web/src/views/storage/base/index.vue qqjf-Web/src/views/storage/base/inventory/index.vue qqjf-Web/src/views/storage/base/materials/index.vue qqjf-Web/src/views/storage/base/viewdata/index.vue qqjf-Web/src/views/storage/components/casslineEdit.vue qqjf-Web/src/views/storage/components/chooseEdit.vue qqjf-Web/src/views/storage/components/forkliftEdit.vue qqjf-Web/src/views/storage/components/inventoryEdit.vue qqjf-Web/src/views/storage/components/palteEdit.vue qqjf-Web/src/views/storage/components/positionEdit.vue qqjf-Web/src/views/storage/components/storage-inquer.vue qqjf-Web/src/views/storage/components/storageEdit.vue qqjf-Web/src/views/storage/components/viewdataInquer.vue qqjf-Web/src/views/storage/components/viewdatainfo.vue qqjf-Web/src/views/storage/index.vue qqjf-Web/src/views/storage/setting/cass-line/index.vue qqjf-Web/src/views/storage/setting/choose/components/limitModal.vue qqjf-Web/src/views/storage/setting/choose/index.vue qqjf-Web/src/views/storage/setting/forklift/index.vue qqjf-Web/src/views/storage/setting/index.vue qqjf-Web/src/views/storage/setting/palte/index.vue qqjf-Web/src/views/storage/setting/position/index.vue qqjf-Web/src/views/storage/setting/storage-area/index.vue qqjf-Web/src/views/storage/setting/storage/index.vue qqjf-Web/src/views/system/index.vue qqjf-Web/src/views/system/user/components/deptEdit.vue qqjf-Web/src/views/system/user/components/manageEdit.vue qqjf-Web/src/views/system/user/components/roleEdIt.vue qqjf-Web/src/views/system/user/components/topinquer.vue qqjf-Web/src/views/system/user/dept/index.vue qqjf-Web/src/views/system/user/index.vue qqjf-Web/src/views/system/user/manage/index.vue qqjf-Web/src/views/system/user/role/index.vue qqjf-Web/src/views/system/user/roleAuth/index.vue qqjf-Web/src/views/task/components/forklifttasksEdit.vue qqjf-Web/src/views/task/components/maintask-inquer.vue qqjf-Web/src/views/task/components/maintaskEdit.vue qqjf-Web/src/views/task/forklifttasks/index.vue qqjf-Web/src/views/task/index.vue qqjf-Web/src/views/task/maintask/index.vue qqjf-Web/src/views/task/taskdocuments/index.vue qqjf-Web/src/views/task/taskrecord/index.vue qqjf-Web/src/views/test/index.vue qqjf-Web/vue.config.js