commit 885e70b9fc84722ef1b32dbe647cfacee1f64bd7 Author: MESWORK Date: Thu May 21 09:31:44 2026 +0800 init: MES_Manage_View_V20 v1.1.0 项目初始化 - Vue 2.7 + Element UI + Webpack 5 前端 - SQL Server 数据库脚本 (script.sql) - 4份技术文档 (技术分析/功能映射/使用说明书/用户操作手册) - 存储过程修复 (fix_生产管理_外协报表_查询.sql) diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ea6e20f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +# http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..7a8a0c6 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ +build/*.js +config/*.js +src/assets +src/icon +src/views/ProjectManagement diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..14a249f --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,207 @@ +module.exports = { + root: true, + parser: 'vue-eslint-parser', + parserOptions: { + parser: '@babel/eslint-parser', // 或者 'babel-eslint' + ecmaVersion: 2020, + sourceType: 'module' + }, + env: { + browser: true, + node: true, + es6: true + }, + extends: ['plugin:vue/recommended', 'eslint:recommended', 'plugin:vue/essential'], + + // add your custom rules here + // it is base on https://github.com/vuejs/eslint-config-vue + rules: { + 'no-useless-template-attributes': 'off', + 'vue/max-attributes-per-line': [2, { + 'singleline': 10, + 'multiline': { + 'max': 1, + 'allowFirstLine': false + } + }], + 'vue/name-property-casing': ['error', 'PascalCase'], + 'vue/html-closing-bracket-spacing': ['off', { + 'startTag': 'never', + 'endTag': 'never', + 'selfClosingTag': 'never' + }], + 'vue/singleline-html-element-content-newline': 'off', + 'vue/multiline-html-element-content-newline': 'off', + 'vue/html-closing-bracket-newline ': 'off', + 'accessor-pairs': 2, + 'arrow-spacing': [2, { + 'before': true, + 'after': true + }], + 'block-spacing': [2, 'always'], + 'brace-style': [2, '1tbs', { + 'allowSingleLine': true + }], + 'camelcase': [0, { + 'properties': 'always' + }], + 'comma-dangle': [2, 'never'], + 'comma-spacing': [2, { + 'before': false, + 'after': true + }], + 'comma-style': [2, 'last'], + 'constructor-super': 2, + 'curly': [2, 'multi-line'], + 'dot-location': [2, 'property'], + 'eol-last': 2, + 'eqeqeq': [2, 'allow-null'], + 'generator-star-spacing': [2, { + 'before': true, + 'after': true + }], + 'handle-callback-err': [2, '^(err|error)$'], + 'indent': [2, 2, { + 'SwitchCase': 1 + }], + 'jsx-quotes': [2, 'prefer-single'], + 'key-spacing': [2, { + 'beforeColon': false, + 'afterColon': true + }], + 'keyword-spacing': [2, { + 'before': true, + 'after': true + }], + 'new-cap': [2, { + 'newIsCap': true, + 'capIsNew': false + }], + 'new-parens': 2, + 'no-array-constructor': 2, + 'no-caller': 2, + 'no-console': 'off', + 'no-class-assign': 2, + 'no-cond-assign': 2, + 'no-const-assign': 2, + 'no-control-regex': 2, + 'no-delete-var': 2, + 'no-dupe-args': 2, + 'no-dupe-class-members': 2, + 'no-dupe-keys': 2, + 'no-duplicate-case': 2, + 'no-empty-character-class': 2, + 'no-empty-pattern': 2, + 'no-eval': 2, + 'no-ex-assign': 2, + 'no-extend-native': 2, + 'no-extra-bind': 2, + 'no-extra-boolean-cast': 2, + 'no-extra-parens': [2, 'functions'], + 'no-fallthrough': 2, + 'no-floating-decimal': 2, + 'no-func-assign': 2, + 'no-implied-eval': 2, + 'no-inner-declarations': [2, 'functions'], + 'no-invalid-regexp': 2, + 'no-irregular-whitespace': 2, + 'no-iterator': 2, + 'no-label-var': 2, + 'no-labels': [2, { + 'allowLoop': false, + 'allowSwitch': false + }], + 'no-lone-blocks': 2, + 'no-mixed-spaces-and-tabs': 2, + 'no-multi-spaces': 2, + 'no-multi-str': 2, + 'no-multiple-empty-lines': [2, { + 'max': 1 + }], + 'no-native-reassign': 2, + 'no-negated-in-lhs': 2, + 'no-new-object': 2, + 'no-new-require': 2, + 'no-new-symbol': 2, + 'no-new-wrappers': 2, + 'no-obj-calls': 2, + 'no-octal': 2, + 'no-octal-escape': 2, + 'no-path-concat': 2, + 'no-proto': 2, + 'no-redeclare': 2, + 'no-regex-spaces': 2, + 'no-return-assign': [2, 'except-parens'], + 'no-self-assign': 2, + 'no-self-compare': 2, + 'no-sequences': 2, + 'no-shadow-restricted-names': 2, + 'no-spaced-func': 2, + 'no-sparse-arrays': 2, + 'no-this-before-super': 2, + 'no-throw-literal': 2, + 'no-trailing-spaces': 2, + 'no-undef': 2, + 'no-undef-init': 2, + 'no-unexpected-multiline': 2, + 'no-unmodified-loop-condition': 2, + 'no-unneeded-ternary': [2, { + 'defaultAssignment': false + }], + 'no-unreachable': 2, + 'no-unsafe-finally': 2, + 'no-unused-vars': ['off', { + 'vars': 'all', + 'args': 'none' + }], + 'no-useless-call': 2, + 'no-useless-computed-key': 2, + 'no-useless-constructor': 2, + 'no-useless-escape': 0, + 'no-whitespace-before-property': 2, + 'no-with': 2, + 'one-var': [2, { + 'initialized': 'never' + }], + 'operator-linebreak': [2, 'after', { + 'overrides': { + '?': 'before', + ':': 'before' + } + }], + 'padded-blocks': [2, 'never'], + 'quotes': [2, 'single', { + 'avoidEscape': true, + 'allowTemplateLiterals': true + }], + 'semi': [2, 'never'], + 'semi-spacing': [2, { + 'before': false, + 'after': true + }], + 'space-before-blocks': [2, 'always'], + 'space-before-function-paren': [2, 'never'], + 'space-in-parens': [2, 'never'], + 'space-infix-ops': 2, + 'space-unary-ops': [2, { + 'words': true, + 'nonwords': false + }], + 'spaced-comment': [2, 'always', { + 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] + }], + 'template-curly-spacing': [2, 'never'], + 'use-isnan': 2, + 'valid-typeof': 2, + 'wrap-iife': [2, 'any'], + 'yield-star-spacing': [2, 'both'], + 'yoda': [2, 'never'], + 'prefer-const': 2, + 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, + 'object-curly-spacing': [2, 'always', { + objectsInObjects: false + }], + 'array-bracket-spacing': [2, 'never'] + } +} + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..68ab334 --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +# ===== 系统文件 ===== +.DS_Store +Thumbs.db +desktop.ini + +# ===== 依赖与构建产物 ===== +node_modules/ +dist/ +package-lock.json +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# ===== 编辑器与IDE ===== +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.swp +*.swo +*~ + +# ===== 环境配置(含敏感信息,不提交)===== +static/config.js +config/dev.env.js +config/prod.env.js + +# ===== 数据库备份 ===== +*.bak +*.ldf +*.mdf + +# ===== 日志与临时文件 ===== +debug.log +*.zip + +# ===== Webpack 缓存 ===== +node_modules/.cache/ diff --git a/.postcssrc.js b/.postcssrc.js new file mode 100644 index 0000000..eee3e92 --- /dev/null +++ b/.postcssrc.js @@ -0,0 +1,10 @@ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + "plugins": { + "postcss-import": {}, + "postcss-url": {}, + // to edit target browsers: use "browserslist" field in package.json + "autoprefixer": {} + } +} diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..16574d9 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: stable +script: npm run test +notifications: + email: false diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6151575 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017-present PanJiaChen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/MES_功能列表_页面_存储过程映射.md b/MES_功能列表_页面_存储过程映射.md new file mode 100644 index 0000000..19ebb6f --- /dev/null +++ b/MES_功能列表_页面_存储过程映射.md @@ -0,0 +1,760 @@ +# MES_Manage_View_V20 功能列表 — 页面 → 存储过程映射 + +> **生成日期**: 2026-05-18 +> **说明**: 系统采用动态菜单架构,页面路由由数据库表 `登录基础数据_二级菜单` 配置,前端通过 `this.CreateData(type, name, data)` 统一调用后端存储过程。 +> **通信协议**: 前端 → ASP.NET后端 → SQL Server存储过程,参数以JSON格式传递。 + +--- + +## 架构说明 + +``` +前端 Vue 组件 + │ + ├── this.CreateData('1', '存储过程名', [参数数组]) + │ └── 查询操作 (type='1') + │ + ├── this.CreateData('2', '存储过程名', [参数数组]) + │ └── 增删改操作 (type='2') + │ + └── this.CreateData('7', '存储过程名', jsonData, pageSize, pageList) + └── 批量/JSON操作 (type='7') +``` + +--- + +## 一、登录与权限管理 + +### 1.1 用户登录 + +| 项目 | 内容 | +|------|------| +| **页面路径** | `/login` | +| **Vue组件** | `src/views/login/index.vue` | +| **功能描述** | 用户工号密码验证、多角色选择、记住密码(Cookie)、修改密码 | + +| 操作 | 前端调用 type | 存储过程 / 后端名称 | 说明 | +|------|:---:|------|------| +| 用户名密码验证 | 1 | `菜单模块系统_用户名密码_查询数据` → `MES_登录_工号密码验证` | 查询 `基础表_用户角色` | +| 获取用户角色菜单 | 1 | `菜单模块系统_项目角色模块列表_二级_查询数据` → `View_账号权限信息` | 按角色编号返回菜单树 | +| 修改密码 | 2 | `账号信息_修改密码_MESWORK` | 调用 `editPassword()` API | +| 获取工位列表 | 1 | `MES_登录_工位与名称_查询` | 来自 `View_基础数据_工位` | +| 获取班次信息 | 1 | `MES_登录_班次信息` | 来自 `YL_基础表_数据字典` | + +**涉及数据库对象**: +| 类型 | 名称 | +|------|------| +| 表 | `登录基础数据_人员信息`, `登录基础数据_角色信息`, `登录基础数据_人员权限角色`, `登录基础数据_二级菜单`, `基础表_用户角色` | +| 视图 | `View_账号权限信息`, `View_基础数据_工位`, `登录基础数据_管理人员权限视图` | +| 存储过程 | `MES_登录_工号密码验证`, `MES_登录_工位与名称_查询`, `MES_登录_班次信息` | + +--- + +### 1.2 权限与菜单管理 + +| 项目 | 内容 | +|------|------| +| **功能描述** | 动态菜单路由生成、角色-菜单-按钮权限控制 | + +| 类型 | 名称 | 说明 | +|------|------|------| +| 表 | `登录基础数据_二级菜单` | 菜单树配置(id/pid/path/componet/name/title/icon/账号代码) | +| 表 | `登录基础数据_角色信息` | 角色定义 | +| 表 | `登录基础数据_人员权限角色` | 人员-角色关联 | +| 表 | `登录基础数据_部门` | 组织架构 | +| 视图 | `登录基础数据_管理人员权限视图` | 角色-人员-部门完整视图 | +| 前端 | `src/permission.js` | 路由守卫 | +| 前端 | `src/router/getTreeData.js` | 动态菜单树递归生成 | + +--- + +## 二、生产排产管理 + +### 2.1 排产任务查询 + +| 项目 | 内容 | +|------|------| +| **页面路径** | 动态配置 (如 `/orderPlanned` 等) | +| **功能描述** | 查询待排产任务、按多种条件筛选(订单号/合同号/物料/工序/时间范围/排产状态/工位) | + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 机加件排产查询 | 1 | `MES_OrderPlanned_Query` | 过滤: 物料类型=pit_Resource, 自制件属性=机加件, 任务状态<4 | +| 装配件排产查询 | 1 | `MES_OrderPlanned_Queryzp` | 过滤: 自制件属性包含装配 | +| 获取订单详细信息 | 1 | `Prog_MES_GetProductOrder_byAID` | 按TaskAID查订单工序详情 | + +**涉及数据库对象**: +| 类型 | 名称 | +|------|------| +| 视图 | `View_生产订单_MES` | +| 表 | `MES_接口_生产计划`, `MES_接口_生产计划_生产任务`, `车间生产管理工艺_零件生产工艺_工艺库` | +| 存储过程 | `MES_OrderPlanned_Query`, `MES_OrderPlanned_Queryzp`, `Prog_MES_GetProductOrder_byAID` | + +--- + +### 2.2 单任务排产/拆分 + +| 项目 | 内容 | +|------|------| +| **功能描述** | 单个工序任务指派工位、拆分数量、设定计划时间 | + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 单任务排产指派 | 2 | `MES_OrderPlanned_SingleTaskPlanned` | 核心排产:指派数量<计划数量时自动拆分;>计划数量时合并/报错 | +| 编辑任务排产信息 | 2 | `MES_OrderPlanned_EditTaskPlanned` | 动态SQL编辑排产字段 | +| 编辑任务描述 | 2 | `MES_OrderPlanned_DescriptionEdit` | 编辑优先级/未完成说明/派工特殊说明 | + +--- + +### 2.3 批量排产确认 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 批量排产确认 | 7 | `MES_OrderPlanned_Finish` | JSON格式批量传入,OPENJSON解析 | + +--- + +### 2.4 子任务(二次派工) + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 新增子任务 | 2 | `MES_OrderPlanned_ChildTask_Add` | 插入 `MES_接口_生产计划_生产任务_子任务` | +| 查询子任务 | 1 | `MES_OrderPlanned_ChildTask_Get` | 按父TaskAID查子任务列表 | + +--- + +### 2.5 排产重置 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 重置排产 | 2 | `__Reset_ProductOrder` | @optType=0重置排产, @optType=1重置加工中心(TRUNCATE操作记录) | + +--- + +## 三、生产订单管理 + +### 3.1 订单查询 + +| 页面路径 | 动态配置 | +| **功能描述** | 多条件查询生产订单(订单号/合同号/物料/工序/排产状态/工位) | + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 机加件订单查询 | 1 | `MES_ProductAdmin_Query` | 含不合格数量/收料数量等 | +| 装配件订单查询 | 1 | `MES_ProductAdmin_Query` | @物料类型='装配件' | +| 订单工序任务获取 | 1 | `MES_ProductCenter_GetOrderTasks` | 按TaskAID查同订单所有工序及前序合格/不合格数 | + +**涉及视图**: `View_生产订单_MES`, `View_生产订单全部(包括已关闭)`, `View_生产订单Temp_ERP` + +--- + +### 3.2 ERP订单同步 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| SAP订单同步到MES | 2 | `MES_接口_生产计划_Insert` | 装配件自动生成生产任务行 | + +**涉及外部数据源**: `SAP.SBO_YL.dbo.OWOR`, `SAP.SBO_YL.dbo.OWR1`, `SAP.SBO_YL.dbo.OWR4` + +--- + +## 四、加工中心(生产执行) + +### 4.1 任务查看 + +| 页面路径 | 动态配置 | +| **功能描述** | 查看分配给当前工位的可执行/进行中任务 | + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 机加任务查询 | 1 | `MES_ProductCenter_GetTask` | 多条件筛选(订单号/零件编号/计划开工/生产状态/工位/用户ID) | +| 装配任务查询 | 1 | `MES_ProductCenter_GetTask_zp` | 过滤装配工序 | +| 获取进行中任务 | 1 | `MES_ProductCenter_DoingTask` | 按工位获取正在加工的任务 | +| 获取操作记录 | 1 | `MES_ProductCenter_OptRecords` | 按工位查最近50条操作记录 | + +--- + +### 4.2 生产操作流程 + +``` +收料 → 开始加工 → (暂停/恢复) → 报工 + → 首检 → 巡检 → 序检 +``` + +| 操作步骤 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| **收料** | 2 | `MES_ProductTask_MaterialRecieved` | 更新收料数量,收料>0时任务变为可执行(1) | +| **标记可执行** | 2 | `MES_ProductTask_Excutable` | 手动标记任务为可执行状态 | +| **开始加工** | 2 | `MES_ProductTask_WorkingStart` | 任务状态→已开工(2),自动同步上序合格数为收料数 | +| **暂停** | 2 | `MES_ProductTask_Rest` | 加工状态→暂停(5),关联开始记录 | +| **报工** | 2 | `MES_ProductTask_ProdReport` | 核心报工:含加班计算、捆绑报工、前序不合格数、报工记录双写入 | +| **辅助开始** | 2 | `MES_ProductTask_HelpStart` | 辅助工序开始 | +| **辅助结束** | 2 | `MES_ProductTask_HelpEnd` | 含加班时长计算、休息日处理 | +| **首检** | 2 | `MES_ProductTask_FirstCheck` | 生成首检操作记录 | +| **送检(装配报工)** | 2 | `MES_ProductTask_SendInspection` | 装配工序的报工操作 | +| **外协通知** | 2 | `MES_ProductTask_Notice` | 更新外协通知状态 | + +**底层操作记录保存**: +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 操作记录统一保存 | - | `MES_ProductCenter_OptRecord_Save` | 被上述所有操作调用,处理暂停/开始/报工联动计算工时 | + +**涉及数据库对象**: +| 类型 | 名称 | +|------|------| +| 表 | `YL_加工中心_操作记录表`, `YL_加工中心_报工记录` | +| 视图 | `View_生产工时视图`, `View_校验后的生产工时`, `v_CurrentProductionStatus` | +| 索引 | `IX_YL_加工中心_操作记录表_TaskAID_操作内容` | + +--- + +### 4.3 暂停状态管理 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 获取暂停状态 | 1 | `MES_操作记录_获取暂停状态` | 查询最近未结束的暂停记录(24小时内) | +| 获取任务暂停状态 | 1 | `MES_操作记录_获取任务暂停状态` | 按TaskAID查暂停状态 | +| 查找未完成开始记录 | 1 | `FindUnfinishedStartOperations` | 查询开始加工但未报工的记录 | + +--- + +## 五、工时管理与校验 + +### 5.1 报工记录管理 + +| 页面路径 | 动态配置 | +| **功能描述** | 查看/确认各班次报工记录 | + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 报工记录查询 | 1 | `MES_ProductAdmin_GetRptRecords` | 按日期/工位/合同号/订单号/操作人/确认状态筛选 | +| 报工确认 | 2 | `MES_ProductAdmin_RptConfirm` | 确认工时、填写确认说明 | +| 工时汇总查询 | 1 | `MES_ProductTask_WorkTimeSum` | 按TaskAID/工序汇总工时 | + +**涉及数据库对象**: +| 类型 | 名称 | +|------|------| +| 表 | `YL_加工中心_报工记录`, `生产管理_工时校验_校验工时表` | +| 视图 | `View_生产工时视图`, `View_校验后的生产工时`, `View_报工人员` | + +--- + +### 5.2 装配人员工时 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 开始记录 | 2 | `MES_人员工时记录_开始` | 装配人员开始加工 | +| 结束记录 | 2 | `MES_人员工时记录_结束` | 含白班/加班/休息日完整工时计算 | +| 检查进行中 | 1 | `MES_人员工时记录_检查是否存在` | 检查是否有未结束记录 | +| 获取进行中任务 | 1 | `MES_人员工时记录_获取进行中任务` | 按用户ID查进行中装配任务 | +| 获取所有进行中 | 1 | `MES_人员工时记录_获取进行中任务2` | 查所有未结束装配任务 | + +--- + +## 六、质量管理 + +### 6.1 质检任务查询 + +| 页面路径 | 动态配置 | +| **功能描述** | 多条件查询质检任务(计划号/零件编码/工艺编号/检测类型/检验结果/检测人/时间) | + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 质检记录查询 | 1 | `MES_QualityInspection_CheckRecord_Query` | 排除来料检验,含工艺编号关联 | +| 质检任务查询 | 1 | `MES_QulityInspection_GetTask` | 查已开工/已完成任务(含首检/巡检/序检状态) | +| 获取检测标准 | 1 | `MES_QulityInspection_GetItemStandard` | 按物料编号+工序名称编号+检测类别编号查标准 | +| 获取检测数量 | 1 | `MES_QulityInspection_GetCheckCount` | 按TaskAID查检验总数 | +| 获取检测零件 | 1 | `MES_QulityInspection_GetPart` | 按QT_AID查零件列表 | +| 获取检测零件详情 | 1 | `MES_QualityInspection_GetInspectionParts` | 零件级检测结果 | +| 获取检测明细数据 | 1 | `MES_QualityInspection_GetInspectionDetails` | 检测项目明细(理论值/实测值) | + +--- + +### 6.2 质检操作 + +| 操作步骤 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| **收检** | 2 | `MES_QulityInspection_ReceiveCheck` | 事务性写入,总检测数=计划数时自动完成任务,收检合格触发下一工序可执行 | +| **终检** | 2 | `MES_QulityInspection_FinalCheck` | 终检记录(含放行数量) | +| **巡检** | 2 | `MES_QulityInspection_RoundCheck` | 更新不合格数+巡检标记 | +| **序检** | 2 | `MES_QulityInspection_ProcessCheck` | 更新不合格数+序检标记 | +| **首检记录查询** | 1 | `MES_QulityInspection_FirstCheckRecords` | 按工序/工位/订单号/零件/时间筛选 | +| **保存检测数据** | 2 | `MES_QulityInspection_CheckItemData_Save` | 事务性三级写入(质检主表→零件表→检测数据表) | + +--- + +### 6.3 不合格品处理 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 发起处理流程 | 2 | `MES_QulityInspection_NGPart_Add` | 含申请让步放行,自动创建首个审批节点 | +| 新增审批节点 | 2 | `MES_QulityInspection_NGPart_FlowNode_Add` | 追加审批节点 | +| 完成审批节点 | 2 | `MES_QulityInspection_NGPart_FlowNode_Update` | 填写处理意见/让步放行数量 | +| 结束处理流程 | 2 | `MES_QulityInspection_NGPart_Finish` | 更新结束时间 | + +**涉及数据库对象**: +| 类型 | 名称 | +|------|------| +| 表 | `YL_质量检验_质检记录`, `YL_质量检验_质检记录_检测零件`, `YL_质量检验_质检记录_检测数据` | +| 表 | `YL_质量检验_检测标准`, `YL_质量检验_量具信息` | +| 表 | `YL_质量检验_不合格品处理`, `YL_质量检验_不合格品处理_处理节点` | +| 视图 | `View_质量检验_质检记录`, `View_质量检验_质检记录_外协收检`, `View_质量检验_不合格品处理` | +| 视图 | `View_外协质检`, `View_质检明细`, `View_终检状态`, `View_装配信息` | + +--- + +### 6.4 量具管理 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 量具查询 | 1 | `MES_QulityInspection_MeasuringTool` | 按编号/名称/规格/制造商/状态/负责人筛选 | + +**涉及表**: `YL_质量检验_量具信息` + +--- + +### 6.5 SAP质检任务 + +| 类型 | 名称 | 说明 | +|------|------|------| +| 表 | `质量检验_质检任务_SAP` | SAP来料检验任务同步表 | + +--- + +## 七、设备管理 + +### 7.1 设备台账 + +| 页面路径 | 动态配置 | +| **功能描述** | 设备台账增删改查、设备主数据管理 | + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 新增设备 | 2 | `MES_DeviceAdmin_BaseInfo` | 含设备编号唯一性校验 | +| 设备查询 | 1 | (直接查 `YL_设备管理_设备台账`) | | +| 点检表管理 | - | `基础数据_设备工位点检表` | 设备点检清单 | + +--- + +### 7.2 设备生产状态 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 更新生产状态 | 2 | `MES_DeviceAdmin_DeviceProductState_Update` | 自动写入历史记录表 | +| 状态查询(当前) | 1 | `MES_DeviceAdmin_ProductState_MobyQuery` | 当前设备生产状态 | +| 状态查询(历史) | 1 | `MES_DeviceAdmin_ProductState_HistoryQuery` | 设备生产状态变更历史 | + +**涉及表**: `YL_设备管理_设备生产状态_Moby`, `YL_设备管理_设备生产状态_Moby_历史记录` + +--- + +### 7.3 维修记录 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 新增维修记录 | 2 | `MES_DeviceAdmin_RepairRecords_Add` | 记录故障描述/维修人员/完成时间 | +| 维修记录查询 | 1 | `MES_DeviceAdmin_RepairRecords_Query` | 按工位/设备/故障/时间/人员筛选 | + +**涉及表**: `YL_设备管理_维修记录` + +--- + +### 7.4 设备工时 + +| 类型 | 名称 | 说明 | +|------|------|------| +| 表 | `YL_设备管理_工时记录` | 设备循环时间采集记录 | + +--- + +## 八、工艺管理 + +### 8.1 工序基础数据 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 工序查询 | 1 | `MES_ProcessManagement_ProcessGet` | 支持逗号分隔多ID查询 | +| 新增工序 | 2 | `MES_ProcessManagement_ProcessAdd` | 自动计算工艺编号(max+1) | +| 编辑工序 | 2 | `MES_ProcessManagement_ProcessEdit` | 按工艺编号修改工序名称 | +| 删除工序 | 2 | `MES_ProcessManagement_ProcessDel` | 按工艺编号删除 | + +**涉及表**: `基础表_工序` + +--- + +### 8.2 标准工艺库 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 物料查询 | 1 | `MES_ProcessManagement_PartGet` | 查询SAP物料编码(TOP 100) | +| 工艺绑定查询 | 1 | `MES_ProcessManagement_ProcessBindGet` | 按物料编号查关联的标准工艺工序 | + +**涉及数据库对象**: +| 类型 | 名称 | +|------|------| +| 表 | `车间生产管理工艺_零件工序_工艺库`, `车间生产管理工艺_零件生产工艺_工艺库` | +| 视图 | `View_标准工艺视图`, `View_生产工艺视图`, `计划任务视图` | +| 外部源 | `SAP.SBO_YL.dbo.UBT_OITM` | + +--- + +## 九、看板与报表 + +### 9.1 首页看板 + +| 页面路径 | `/dashboard` | +| **Vue组件** | `src/views/dashboard/index.vue` | +| **功能描述** | 动态展示有权限的一级和二级菜单模块入口(九宫格布局) | + +--- + +### 9.2 当前生产状态看板 + +| 操作 | type | 存储过程/视图 | 说明 | +|------|:---:|------|------| +| 查询当前状态 | 1 | `v_CurrentProductionStatus` | 机加(加工中)+装配(加工中) UNION,含人员聚合(STRING_AGG) | + +--- + +### 9.3 外协报表 + +| 视图 | 说明 | +|------|------| +| `View_外协报表视图` | 关联SAP采购数据(供应商/含税单价/材质/发料)的外协完整报表 | + +--- + +### 9.4 生产订单完工视图 + +| 视图 | 说明 | +|------|------| +| `View_生产订单完工` | 复杂完工判定:合格数+不合格数=计划数量 | + +--- + +### 9.5 图纸视图 + +| 视图 | 说明 | +|------|------| +| `View_图纸视图` | 零件图纸+物料描述关联 | +| `View_生产计划零件图纸视图` | 生产订单+图纸关联 | + +--- + +## 十、图纸与文件管理 + +### 10.1 零件图纸 + +| 功能 | 涉及表 | +|------|------| +| 图纸上传/预览/删除 | `物料基础数据_零件图纸` | +| 图纸删除记录 | `物料基础数据_零件图纸删除记录` | +| 工艺图纸 | `物料基础数据_工艺图纸` | +| PDF在线预览 | pdfjs-dist 5.1.91 | + +**文件操作 API**: +| 操作 | URL | 说明 | +|------|------|------| +| 上传文件 | `{baseURL}/submit/MESUploadFile.ashx` | `MESUploadFile` | +| 下载文件 | `{baseURL}/webpage/part/` | `MESDownFile` | + +--- + +## 十一、实时监控与数据采集 + +### 11.1 设备变量缓存 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 缓存变量更新 | - | `Event_CaChe_Var_Update` | 设备实时数据写入/更新缓存,含循环时间触发工时记录 | +| 看板查询 | 1 | `Event_CaChe_Var_看板查询` | Sort<11,按Zone+Sort排序 | + +**涉及表**: `CaChe_Var` + +--- + +### 11.2 设备数据采集 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 历史数据插入 | - | `Event_Device_Insert_CurrInfo` | 写入 `历史_设备数据_定时` | +| 当前数据更新 | - | `Event_Device_Update_CurrInfo` | 更新 `当前_工位_通用` | + +--- + +### 11.3 工位状态监控 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 状态插入 | - | `Event_StationStatus_Insert` | 写入 `历史_工位设备状态每分钟记录` | +| 状态更新 | - | `Event_StationStatus_Update` | 更新 `基础_工位` 状态代码 | + +**状态码**: -1关机, 0待机, 1工作, 2报警, 3暂停 + +--- + +### 11.4 报警管理 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 报警开始 | - | `Event_Alarm_Start` | 写入缓存表+设备状态备份 | +| 报警结束 | - | `Event_Alarm_End` | 计算持续时间→迁移至历史表→删除缓存 | + +**涉及表**: `报警_记录_历史`, `报警_记录_历史_缓存`, `EquipmentStatus_Backup` + +--- + +### 11.5 设备数据历史 + +| 表 | 说明 | +|------|------| +| `历史_设备数据_定时` | 设备变量历史数据(在线状态/设备代码/变量名/值/单位) | +| `历史_工位设备状态每分钟记录` | 每分钟工位状态快照(含电流1-3/线电压1-3/功率1-3/总功率/电能) | + +--- + +### 11.6 PLC设备读写 + +| 方法 | 函数 | 说明 | +|------|------|------| +| 读设备 | `WebApi_ReadDevice(TagList)` | Cmd_Opc_Read | +| 写设备 | `WebApi_WriteDevice(TagList)` | Cmd_Opc_Write | + +**通信**: 前端 → `window.dt_Config.deviceApiAddress` → 设备网关,使用MQTT协议(`mqtt: 4.3.7`) + +--- + +## 十二、工作流与审批 + +### 12.1 流程管理 + +| 涉及表 | 说明 | +|------|------| +| `流程表` | 审批流程主表(标题/描述/优先级/状态/发起人/当前节点/完成人) | +| `流程节点表` | 审批节点(审批人/步骤序号/状态/转办) | +| `流程完成记录表` | 流程完成记录 | +| `流程转办表` | 审批转办记录 | +| `审批记录表` | 审批意见记录 | + +--- + +## 十三、系统管理 + +### 13.1 数据字典 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 按类别查询 | 1 | `Prog_MES_GetDictionar_ByType` | 按数据类别查词条列表 | +| 按名称查ID | 1 | `MES_GetDicItemID_ByDicItemName` | 按词条名称+数据类别查编号 | + +**涉及表**: `YL_基础表_数据字典` + +**数据类别示例**: 生产操作(收料/开始加工/暂停/报工/首检)、班次、报工确认 + +--- + +### 13.2 操作日志 + +| 操作 | type | 存储过程 | 说明 | +|------|:---:|------|------| +| 插入操作日志 | - | `_日志_增加` | 按子组件名查菜单标题后插入,过滤高频查询 | +| API请求日志 | - | `Event_Log_Request` | 记录请求内容/时间,返回AID | +| API响应日志 | - | `Event_Log_Respond` | 按AID更新响应内容/时间 | + +**涉及表**: `_日志`, `记录_日志_项目运行日志` + +--- + +### 13.3 数据库备份 + +| 存储过程 | 说明 | +|------|------| +| `___DB_BAK` | 全量备份到 `C:\_MW\数据库\YL_MESDB_yyyy_MM_dd__HH_mm_ss_fff.bak` | + +--- + +### 13.4 工具函数 + +| 存储过程 | 说明 | +|------|------| +| `p_PopFirstWord` | 逗号分隔字符串解析 | +| `A_Update_T_Table01` | 测试用更新 | + +--- + +### 13.5 附件管理 + +| 表 | 说明 | +|------|------| +| `Attachments` | 文件附件(FileName/FilePath/FileSize/FileType/Uploader/IsDeleted) | + +--- + +## 十四、班次与人员管理 + +### 14.1 班次配置 + +| 涉及表 | 说明 | +|------|------| +| `班次表` | 班次定义(白班07:45-16:30, 夜班16:30-00:40) | +| `班次人员绑定表` | 人员-班次绑定 | + +--- + +### 14.2 工位人员绑定 + +| 涉及表 | 说明 | +|------|------| +| `工位人员绑定表` | 工位-人员绑定关系(唯一约束: 工位号+人员编号+绑定状态=1) | +| `View_工位人员绑定数` | 每个人员的绑定设备数统计 | +| `View_设备工位人员` | 设备-工位-人员-班次四维关联 | + +--- + +## 十五、物料与BOM + +| 涉及表 | 说明 | +|------|------| +| `物料数据` | 物料主数据缓存(编码/描述/分类/品牌/规格/仓库) | +| `BOM数据` | BOM清单(父件编码/子件编码/子件数量) | + +--- + +## 附录A:完整存储过程索引 + +| 序号 | 存储过程 | 所属模块 | 功能 | +|:---:|------|------|------| +| 1 | `___DB_BAK` | 系统管理 | 数据库备份 | +| 2 | `__Reset_ProductOrder` | 排产管理 | 重置排产/加工中心 | +| 3 | `_日志_增加` | 系统管理 | 操作日志插入 | +| 4 | `A_Update_T_Table01` | 系统管理 | 测试用 | +| 5 | `Event_Alarm_End` | 实时监控 | 报警结束处理 | +| 6 | `Event_Alarm_Start` | 实时监控 | 报警开始处理 | +| 7 | `Event_CaChe_Var_Update` | 实时监控 | 设备变量缓存更新 | +| 8 | `Event_CaChe_Var_看板查询` | 实时监控 | 看板变量查询 | +| 9 | `Event_Device_Insert_CurrInfo` | 实时监控 | 设备历史数据写入 | +| 10 | `Event_Device_Update_CurrInfo` | 实时监控 | 设备当前数据更新 | +| 11 | `Event_Log_Request` | 系统管理 | API请求日志 | +| 12 | `Event_Log_Respond` | 系统管理 | API响应日志 | +| 13 | `Event_StationStatus_Insert` | 实时监控 | 工位状态插入 | +| 14 | `Event_StationStatus_Update` | 实时监控 | 工位状态更新 | +| 15 | `FindUnfinishedStartOperations` | 加工中心 | 查未完成开始操作 | +| 16 | `MES_DeviceAdmin_BaseInfo` | 设备管理 | 设备台账新增 | +| 17 | `MES_DeviceAdmin_DeviceProductState_Update` | 设备管理 | 设备生产状态更新 | +| 18 | `MES_DeviceAdmin_ProductState_HistoryQuery` | 设备管理 | 设备状态历史 | +| 19 | `MES_DeviceAdmin_ProductState_MobyQuery` | 设备管理 | 设备状态当前 | +| 20 | `MES_DeviceAdmin_RepairRecords_Add` | 设备管理 | 维修记录新增 | +| 21 | `MES_DeviceAdmin_RepairRecords_Query` | 设备管理 | 维修记录查询 | +| 22 | `MES_GetDicItemID_ByDicItemName` | 系统管理 | 字典项ID查询 | +| 23 | `MES_OrderPlanned_ChildTask_Add` | 排产管理 | 子任务新增 | +| 24 | `MES_OrderPlanned_ChildTask_Get` | 排产管理 | 子任务查询 | +| 25 | `MES_OrderPlanned_DescriptionEdit` | 排产管理 | 任务描述编辑 | +| 26 | `MES_OrderPlanned_EditTaskPlanned` | 排产管理 | 编辑排产信息 | +| 27 | `MES_OrderPlanned_Finish` | 排产管理 | 批量排产确认 | +| 28 | `MES_OrderPlanned_Query` | 排产管理 | 机加件排产查询 | +| 29 | `MES_OrderPlanned_Queryzp` | 排产管理 | 装配件排产查询 | +| 30 | `MES_OrderPlanned_SingleTaskPlanned` | 排产管理 | 单任务排产拆分 | +| 31 | `MES_ProcessManagement_PartGet` | 工艺管理 | 物料查询 | +| 32 | `MES_ProcessManagement_ProcessAdd` | 工艺管理 | 工序新增 | +| 33 | `MES_ProcessManagement_ProcessBindGet` | 工艺管理 | 工艺绑定查询 | +| 34 | `MES_ProcessManagement_ProcessDel` | 工艺管理 | 工序删除 | +| 35 | `MES_ProcessManagement_ProcessEdit` | 工艺管理 | 工序编辑 | +| 36 | `MES_ProcessManagement_ProcessGet` | 工艺管理 | 工序查询 | +| 37 | `MES_ProductAdmin_GetRptRecords` | 工时管理 | 报工记录查询 | +| 38 | `MES_ProductAdmin_Query` | 订单管理 | 生产订单查询 | +| 39 | `MES_ProductAdmin_RptConfirm` | 工时管理 | 报工确认 | +| 40 | `MES_ProductCenter_DoingTask` | 加工中心 | 获取进行中任务 | +| 41 | `MES_ProductCenter_GetOrderTasks` | 加工中心 | 订单工序任务 | +| 42 | `MES_ProductCenter_GetTask` | 加工中心 | 机加任务查询 | +| 43 | `MES_ProductCenter_GetTask_zp` | 加工中心 | 装配任务查询 | +| 44 | `MES_ProductCenter_OptRecord_Save` | 加工中心 | **操作记录保存核心** | +| 45 | `MES_ProductCenter_OptRecords` | 加工中心 | 操作记录查询 | +| 46 | `MES_ProductTask_Excutable` | 加工中心 | 标记可执行 | +| 47 | `MES_ProductTask_FirstCheck` | 加工中心 | 首检操作 | +| 48 | `MES_ProductTask_HelpEnd` | 加工中心 | 辅助结束(含加班) | +| 49 | `MES_ProductTask_HelpStart` | 加工中心 | 辅助开始 | +| 50 | `MES_ProductTask_MaterialRecieved` | 加工中心 | 收料操作 | +| 51 | `MES_ProductTask_Notice` | 加工中心 | 外协通知 | +| 52 | `MES_ProductTask_ProdReport` | 加工中心 | **报工核心(含加班)** | +| 53 | `MES_ProductTask_Rest` | 加工中心 | 暂停操作 | +| 54 | `MES_ProductTask_SendInspection` | 加工中心 | 送检(装配报工) | +| 55 | `MES_ProductTask_WorkingStart` | 加工中心 | 开始加工 | +| 56 | `MES_ProductTask_WorkTimeSum` | 工时管理 | 工时汇总 | +| 57 | `MES_QualityInspection_CheckRecord_Query` | 质量管理 | 质检记录查询 | +| 58 | `MES_QualityInspection_GetInspectionDetails` | 质量管理 | 检测明细查询 | +| 59 | `MES_QualityInspection_GetInspectionParts` | 质量管理 | 检测零件查询 | +| 60 | `MES_QulityInspection_CheckItemData_Save` | 质量管理 | **检测数据保存(事务)** | +| 61 | `MES_QulityInspection_FinalCheck` | 质量管理 | 终检操作 | +| 62 | `MES_QulityInspection_FirstCheckRecords` | 质量管理 | 首检记录查询 | +| 63 | `MES_QulityInspection_GetCheckCount` | 质量管理 | 检测数量查询 | +| 64 | `MES_QulityInspection_GetItemStandard` | 质量管理 | 检测标准查询 | +| 65 | `MES_QulityInspection_GetPart` | 质量管理 | 检测零件查询 | +| 66 | `MES_QulityInspection_GetTask` | 质量管理 | 质检任务查询 | +| 67 | `MES_QulityInspection_MeasuringTool` | 质量管理 | 量具查询 | +| 68 | `MES_QulityInspection_NGPart_Add` | 质量管理 | 不合格品处理发起 | +| 69 | `MES_QulityInspection_NGPart_Finish` | 质量管理 | 不合格品处理结束 | +| 70 | `MES_QulityInspection_NGPart_FlowNode_Add` | 质量管理 | 审批节点新增 | +| 71 | `MES_QulityInspection_NGPart_FlowNode_Update` | 质量管理 | 审批节点完成 | +| 72 | `MES_QulityInspection_ProcessCheck` | 质量管理 | 序检操作 | +| 73 | `MES_QulityInspection_ReceiveCheck` | 质量管理 | **收检操作(联动下一工序)** | +| 74 | `MES_QulityInspection_RoundCheck` | 质量管理 | 巡检操作 | +| 75 | `MES_操作记录_获取任务暂停状态` | 加工中心 | 任务暂停状态 | +| 76 | `MES_操作记录_获取暂停状态` | 加工中心 | 全局暂停状态 | +| 77 | `MES_登录_工号密码验证` | 登录管理 | 用户验证 | +| 78 | `MES_登录_工位与名称_查询` | 登录管理 | 工位列表 | +| 79 | `MES_登录_班次信息` | 登录管理 | 班次字典 | +| 80 | `MES_接口_生产计划_Insert` | 订单管理 | ERP订单同步 | +| 81 | `MES_人员工时记录_获取进行中任务` | 工时管理 | 装配进行中(按用户) | +| 82 | `MES_人员工时记录_获取进行中任务2` | 工时管理 | 装配进行中(全部) | +| 83 | `MES_人员工时记录_检查是否存在` | 工时管理 | 检查进行中 | +| 84 | `MES_人员工时记录_结束` | 工时管理 | 装配结束(含加班) | +| 85 | `MES_人员工时记录_开始` | 工时管理 | 装配开始 | +| 86 | `Prog_MES_GetDictionar_ByType` | 系统管理 | 字典查询 | +| 87 | `Prog_MES_GetProductOrder_byAID` | 订单管理 | 订单详情查询 | +| 88 | `p_PopFirstWord` | 系统管理 | 字符串解析工具 | + +--- + +## 附录B:完整视图索引 + +| 序号 | 视图名称 | 功能分类 | +|:---:|------|------| +| 1 | `View_基础数据_工位` | 基础数据 | +| 2 | `View_生产订单_MES` | **核心视图** | +| 3 | `View_生产订单全部(包括已关闭)` | 订单管理 | +| 4 | `View_生产订单Temp_ERP` | ERP集成 | +| 5 | `View_工位人员绑定数` | 人员管理 | +| 6 | `View_生产工时视图` | 工时管理 | +| 7 | `View_校验后的生产工时` | 工时管理 | +| 8 | `View_图纸视图` | 图纸管理 | +| 9 | `View_生产计划零件图纸视图` | 图纸管理 | +| 10 | `View_质量检验_质检记录` | 质量管理 | +| 11 | `View_质量检验_质检记录_外协收检` | 质量管理 | +| 12 | `View_质量检验_不合格品处理` | 质量管理 | +| 13 | `View_标准工艺视图` | 工艺管理 | +| 14 | `View_生产工艺视图` | 工艺管理 | +| 15 | `View_账号权限信息` | 权限管理 | +| 16 | `View_报工人员` | 工时管理 | +| 17 | `View_设备工位人员` | 人员管理 | +| 18 | `View_外协质检` | 质量管理 | +| 19 | `View_装配信息` | 质量管理 | +| 20 | `View_生产订单完工` | 订单管理 | +| 21 | `View_终检状态` | 质量管理 | +| 22 | `View_质检明细` | 质量管理 | +| 23 | `View_外协报表视图` | 报表 | +| 24 | `v_CurrentProductionStatus` | 看板 | +| 25 | `登录基础数据_管理人员权限视图` | 权限管理 | +| 26 | `计划任务视图` | 工艺管理 | + +--- + +## 附录C:UDF函数 + +| 函数名称 | 参数 | 返回值 | 功能 | +|------|------|:---:|------| +| `计算班次重叠秒数` | @开始时间 datetime, @结束时间 datetime, @班次开始 time, @班次结束 time | int | 逐日循环计算时间段与班次重叠秒数,支持跨天班次,最大3天范围 | + +--- + +> 📅 生成日期: 2026-05-18 +> 📊 总计: 15个功能模块 | 88个存储过程 | 26个视图 | 1个UDF函数 | 30+张表 diff --git a/MES_技术分析报告.md b/MES_技术分析报告.md new file mode 100644 index 0000000..82619b7 --- /dev/null +++ b/MES_技术分析报告.md @@ -0,0 +1,756 @@ +# MES_Manage_View_V20 软件项目技术分析报告 + +> **项目名称**: MacroinfManage_MES (MES_Manage_View_V20) +> **版本**: v1.1.0 +> **日期**: 2026-05-18 +> **作者**: MESWORK +> **描述**: 山东元利科技有限公司制造执行系统(MES)管理视图平台 + +--- + +## 目录 + +1. [项目概述](#1-项目概述) +2. [技术架构路线](#2-技术架构路线) +3. [前端技术详细分析](#3-前端技术详细分析) +4. [数据库 script.sql 详细解析](#4-数据库-scriptsql-详细解析) +5. [程序问题分析报告](#5-程序问题分析报告) + +--- + +## 1. 项目概述 + +| 属性 | 内容 | +|------|------| +| 项目名称 | MacroinfManage_MES (MES_Manage_View_V20) | +| 版本 | v1.1.0 | +| 基础模板 | vue-element-admin (PanJiaChen) | +| 数据库 | Microsoft SQL Server 2019 (兼容级别150) | +| 数据库名 | YL_MESDB | +| 外部集成 | SAP Business One (跨库查询) | +| 设备通信 | MQTT 4.3.7 (物联网设备实时数据) | + +--- + +## 2. 技术架构路线 + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ 前端层 (Frontend) │ +│ Vue 2.7.16 + Element UI 2.15.14 + Webpack 5 │ +│ ├── Vue Router 3.6.5 (权限动态路由) │ +│ ├── Vuex 3.6.2 (全局状态管理) │ +│ ├── Axios 0.21.4 (HTTP 通信) │ +│ ├── ECharts 5.4.3 (数据可视化/看板) │ +│ ├── FullCalendar 6.1.x (排产日历) │ +│ ├── MQTT 4.3.7 (设备实时数据/物联网通信) │ +│ └── xlsx / jspdf / docxtemplater (报表导出) │ +├──────────────────────────────────────────────────────────────────┤ +│ 中间层 (Middleware) │ +│ ├── ASP.NET / Node.js 后端API服务 │ +│ └── 存储过程调用 (后端直接调用SQL Server存储过程) │ +├──────────────────────────────────────────────────────────────────┤ +│ 数据库层 (Database) │ +│ Microsoft SQL Server 2019 (兼容级别150) │ +│ 数据库名: YL_MESDB │ +│ ├── 30+ 数据表 │ +│ ├── 20+ 视图 │ +│ ├── 1 用户自定义函数 │ +│ ├── 60+ 存储过程 │ +│ └── 外部数据源: SAP.SBO_YL (SAP Business One) │ +├──────────────────────────────────────────────────────────────────┤ +│ 外部集成 (Integration) │ +│ ├── SAP Business One (ERP系统,跨数据库查询) │ +│ │ ├── SAP.SBO_YL.dbo.UBT_OITM (物料主数据) │ +│ │ ├── SAP.SBO_YL.dbo.UBT_WW_MES_OPORandOPCH (采购订单) │ +│ │ └── SAP.SBO_YL.dbo.OWOR / OWR1 / OWR4 (生产订单) │ +│ ├── 设备PLC/SCADA (通过MQTT协议采集实时数据) │ +│ └── 文件服务器 (图纸/附件存储) │ +└──────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 3. 前端技术详细分析 + +### 3.1 核心框架与依赖 + +| 类别 | 技术 | 版本 | 用途 | +|------|------|------|------| +| 框架 | Vue.js | 2.7.16 | SPA 核心框架 | +| UI库 | Element UI | 2.15.14 | 企业级UI组件 | +| 路由 | Vue Router | 3.6.5 | 动态权限路由 | +| 状态管理 | Vuex | 3.6.2 | 全局状态 | +| HTTP | Axios | 0.21.4 | API通信 | +| 图表 | ECharts | 5.4.3 | 看板/统计图表 | +| 日历 | FullCalendar | 6.1.17 | 排产甘特视图 | +| IoT | MQTT.js | 4.3.7 | 设备实时数据订阅 | +| 构建 | Webpack | 5.89.0 | 模块打包 | +| PDF | jsPDF / html2canvas | 2.5.1 / 1.4.1 | PDF导出 | +| Excel | xlsx | 0.18.5 | 表格导入导出 | +| Word | docxtemplater | 3.42.0 | Word模板生成 | +| 条码 | qrcode | 1.5.3 | 二维码生成 | +| PDF预览 | pdfjs-dist | 5.1.91 | 图纸在线预览 | + +### 3.2 项目目录结构 (src/) + +``` +src/ +├── main.js # 入口文件,全局注册 +├── App.vue # 根组件 +├── permission.js # 路由守卫/权限控制 +├── api/ # API接口层 +│ └── login.js # 登录/密码修改API +├── router/ +│ ├── index.js # 路由配置 +│ ├── getTreeData.js # 动态菜单树生成 +│ └── menuComponentModule.js # 菜单组件映射 +├── store/ +│ ├── index.js # Vuex Store 入口 +│ └── modules/ +│ ├── app.js # 应用全局状态 +│ ├── user.js # 用户状态(登录/登出) +│ ├── login.js # 登录时间跟踪 +│ ├── permission.js # 权限路由状态 +│ └── tagsView.js # 标签页状态 +├── views/ # 业务视图模块 +│ ├── layout/ # 布局组件 +│ ├── login/ # 登录页 +│ ├── dashboard/ # 看板首页 +│ └── [业务模块]/ # 各MES业务模块 +├── components/ # 公用组件 +├── styles/ # 全局样式 +├── utils/ +│ ├── auth.js # Token管理(Cookie) +│ ├── request.js # Axios实例配置 +│ └── curd.js # 通用增删改查 +├── directive/ # 自定义指令 +│ └── el-dragDialog/ # 对话框拖拽指令 +├── icons/ # SVG图标 +└── vendor/ # 第三方工具(htmlToPdf) +``` + +### 3.3 权限控制机制 + +``` +1. 用户登录 → 后端验证用户名/密码 → 返回角色列表 +2. 选择登录角色 → setToken(角色编号) → Cookie存储 +3. 路由守卫 permission.js 拦截: + ├── 无Token → 重定向 /login + └── 有Token → GetInfo() → getTreeData() 构建动态路由树 + → GenerateRoutes → router.addRoutes() +``` + +--- + +## 4. 数据库 script.sql 详细解析 + +### 4.1 数据库基础配置 + +```sql +数据库名: YL_MESDB +数据文件: D:\sqlData\YL_MESDB.mdf (初始 ~6.9GB, 自动增长64MB) +日志文件: D:\sqlDataLog\YL_MESDB_log.ldf (初始 ~263GB, 最大2048GB) +兼容级别: 150 (SQL Server 2019) +恢复模式: FULL (完全恢复) +排序规则: DATABASE_DEFAULT +``` + +### 4.2 核心业务表一览 + +#### 生产计划与任务 + +| 表名 | 主键 | 说明 | +|------|------|------| +| `MES_接口_生产计划` | 订单编号 (int) | 从ERP同步的生产订单主表 | +| `MES_接口_生产计划_生产任务` | AID (bigint) | 工序级任务拆分表,UK: (订单编号+订单行号+订单拆分内码) | +| `MES_接口_生产计划_生产任务_子任务` | AID | 子任务(二次派工) | +| `MES_接口_工艺路线主数据` | AID (int) | 工艺路线主数据接口表 | + +**`MES_接口_生产计划_生产任务` 关键字段**: + +| 字段 | 类型 | 说明 | +|------|------|------| +| 任务状态 | int | 0-待执行, 1-可执行, 2-已开工, 4-已完成 | +| 加工状态 | int | 2-辅助开始, 3-辅助结束, 4-开始加工, 5-暂停, 6-报工 | +| 指派对象/编号 | nvarchar(50) | 分配的工位/设备名称与编号 | +| 指派数量 | decimal(16,2) | 本序计划生产数量 | +| 二次派工 | nvarchar(500) | 多人协作分配(逗号分隔人员ID) | +| 进度 | decimal(16,2) | 完成百分比 | + +#### 资源与人员 + +| 表名 | 主键 | 说明 | +|------|------|------| +| `MES_资源主数据` | VisCode (nvarchar(50)) | 设备/工位主数据(SAP同步) | +| `登录基础数据_人员信息` | Personnel_Number (int) | 人员账号表, UK: account | +| `登录基础数据_角色信息` | Roles_number (int) | 角色定义表 | +| `登录基础数据_人员权限角色` | ID (int) | 人员-角色多对多关联 | +| `登录基础数据_二级菜单` | IDD (int) | 菜单/路由配置表 | +| `登录基础数据_部门` | 部门编号 (int) | 组织架构 | +| `工位人员绑定表` | 绑定编号 (int) | 工位-人员绑定关系 | +| `班次表` | 班次编号 (nvarchar(50)) | 班次定义(白班07:45-16:30, 夜班16:30-00:40) | +| `班次人员绑定表` | 绑定ID (int) | 人员-班次绑定 | + +#### 操作记录与工时 + +| 表名 | 主键 | 说明 | +|------|------|------| +| `YL_加工中心_操作记录表` | AID (int) | **核心操作记录表**,含暂停/恢复/报工全流程 | +| `YL_加工中心_报工记录` | AID (int) | 报工确认记录(生产工时/辅助工时) | +| `生产管理_工时校验_校验工时表` | AID (int) | 工时审核校验(上传工时 vs 系统计算工时) | + +**操作记录表关键字段**: `总时长`, `暂停总时长`, `实际工时` = 总时长 - 暂停总时长 + +| 操作类别 | 说明 | +|----------|------| +| 收料 | 物料接收确认 | +| 开始加工 / 辅助开始 | 生产/辅助启动 | +| 暂停 | 暂停加工 | +| 报工 / 辅助结束 | 完成报工 | +| 首检 | 首件质量检验 | +| 加班 / 休息日加班 / 法定休息日加班 | 加班工时记录 | + +#### 质量管理 + +| 表名 | 主键 | 说明 | +|------|------|------| +| `YL_质量检验_质检记录` | QT_AID (bigint) | 质检主记录 | +| `YL_质量检验_质检记录_检测零件` | LJ_AID (bigint) | 每个被检零件的检测结果(1合格/0不合格) | +| `YL_质量检验_质检记录_检测数据` | AID (bigint) | 检测项目明细(理论值/上限/下限/实测值) | +| `YL_质量检验_检测标准` | AID (int) | 各物料工序的检测标准 | +| `YL_质量检验_量具信息` | AID (int) | 量具台账 | +| `YL_质量检验_不合格品处理` | FlowAID (int) | 不合格品处理流程(让步放行申请) | +| `YL_质量检验_不合格品处理_处理节点` | (FlowAID, FlowNodeID) | 审批流程节点 | + +| 检测类型编号 | 质检类型 | +|-------------|----------| +| 1 | 首检自检 | +| 3 | 序检自检 | +| 6 | 收检 (跨工序接收检验) | +| 8 | 终检 (最终检验) | + +#### 设备管理 + +| 表名 | 主键 | 说明 | +|------|------|------| +| `YL_设备管理_设备台账` | 设备ID (int) | 设备主数据, UK: 设备编号 | +| `YL_设备管理_维修记录` | AID (int) | 设备故障维修记录 | +| `YL_设备管理_工时记录` | ID (int) | 设备循环时间采集记录 | +| `YL_设备管理_设备生产状态_Moby` | AID | 设备实时生产状态 | +| `YL_设备管理_设备生产状态_Moby_历史记录` | AID | 设备状态变更历史 | +| `基础数据_设备工位点检表` | 设备流水号 (int) | 设备点检清单 | + +#### 实时监控与历史数据 + +| 表名 | 主键 | 说明 | +|------|------|------| +| `CaChe_Var` | AID (int) | 设备变量实时缓存 | +| `历史_设备数据_定时` | AID (bigint) | 设备变量历史数据 | +| `历史_工位设备状态每分钟记录` | AID_N (bigint) | 每分工位状态快照(含电流/电压/功率) | +| `报警_记录_历史` | AID (int) | 报警历史记录 | +| `报警_记录_历史_缓存` | AID (int) | 当前活跃报警缓存 | +| `设备信息缓存表` | (无主键) | 工位任务信息缓存 | +| `记录_日志_项目运行日志` | AID (bigint) | API请求/响应日志 | +| `_日志` | ID (int) | 用户操作审计日志 | + +#### 工艺与技术文档 + +| 表名 | 主键 | 说明 | +|------|------|------| +| `基础表_工序` | 工艺编号 (int) | 工序基础数据 | +| `车间生产管理工艺_零件工序_工艺库` | id (int) | 标准工艺路线库 | +| `车间生产管理工艺_零件生产工艺_工艺库` | id (int) | 生产订单关联工艺库(含订单编号) | +| `物料基础数据_零件图纸` | id (int) | 零件图纸文件元数据 | +| `物料基础数据_工艺图纸` | id (int) | 工艺图纸文件元数据 | +| `物料基础数据_零件图纸删除记录` | ID (int) | 图纸删除审计日志 | + +#### 工作流与审批 + +| 表名 | 主键 | 说明 | +|------|------|------| +| `流程表` | 流程ID (int) | 审批流程主表 | +| `流程节点表` | 节点ID (int) | 审批流程节点 | +| `流程完成记录表` | 完成记录ID (int) | 流程完成记录 | +| `流程转办表` | 转办ID (int) | 审批转办记录 | +| `审批记录表` | 记录ID (int) | 审批意见记录 | + +#### 其他 + +| 表名 | 说明 | +|------|------| +| `物料数据` | 物料主数据缓存 | +| `BOM数据` | BOM物料清单 | +| `YL_基础表_数据字典` | 全局数据字典(操作类别/班次/报工确认等) | +| `Attachments` | 文件附件管理 | +| `质量检验_质检任务_SAP` | SAP来料检验任务 | + +### 4.3 关键视图分析 + +| 视图名称 | 功能描述 | +|----------|----------| +| `View_生产订单_MES` | **核心视图**:联合生产计划+生产任务+资源+图纸的完整视图 | +| `View_生产订单全部(包括已关闭)` | 同上但不过滤已关闭订单 | +| `View_生产工时视图` | 整合操作记录+校验工时+生产订单的多表联查 | +| `View_校验后的生产工时` | 仅显示已校验通过的生产工时 | +| `v_CurrentProductionStatus` | **当前生产状态看板**:机加+装配UNION,含人员名称聚合 | +| `View_外协报表视图` | 外协工序完整报表,联查SAP采购数据(s.含税行总计, s.供应商名称) | +| `View_设备工位人员` | 设备-工位-人员-班次四维关联视图 | +| `View_标准工艺视图` | 标准工艺+零件+工序关联 | +| `View_生产工艺视图` | 生产订单工艺+物料+订单状态 | +| `View_质检明细` | 质检记录+工位+合同号完整明细 | +| `View_外协质检` | 外协收检记录视图 | +| `View_装配信息` | 装配送检数/质检合格数统计 | +| `View_生产订单完工` | 复杂完工判定逻辑(合格数+不合格数=计划数量) | +| `View_终检状态` | 终检记录关联 | +| `View_账号权限信息` | 人员-角色-菜单完整权限链路 | +| `登录基础数据_管理人员权限视图` | 角色-人员-部门多维视图 | +| `计划任务视图` | 工艺编号+订单编号+物料名称 | + +### 4.4 用户自定义函数 (UDF) + +#### `计算班次重叠秒数` + +```sql +计算班次重叠秒数(@开始时间 datetime, @结束时间 datetime, + @班次开始 time, @班次结束 time) RETURNS int +``` + +- 逐日循环计算打卡时间和班次时间的重叠秒数 +- 支持跨天班次(如夜班16:30-00:30) +- 限制最大3天计算范围防止无限循环 +- 用于工时计算和加班判断 + +### 4.5 关键存储过程分析 + +#### 生产排产 + +| 存储过程 | 功能 | +|----------|------| +| `MES_OrderPlanned_SingleTaskPlanned` | **核心排产逻辑**:单任务拆分。当计划数量>指派数量时创建拆分任务;当计划数量<指派数量时删除未分配任务 | +| `MES_OrderPlanned_Finish` | 批量排产确认,通过OPENJSON解析JSON任务列表更新指派信息 | +| `MES_OrderPlanned_EditTaskPlanned` | 动态SQL编辑任务排产字段 | +| `MES_OrderPlanned_ChildTask_Add` | 子任务(二次派工)新增 | +| `MES_OrderPlanned_Query` / `_Queryzp` | 排产查询(自制件/装配件) | +| `__Reset_ProductOrder` | 重置订单(排产或加工中心数据) | + +#### 加工中心操作 + +| 存储过程 | 功能 | +|----------|------| +| `MES_ProductTask_MaterialRecieved` | 收料操作:更新收料数量,当收料>0时任务状态变为可执行 | +| `MES_ProductTask_WorkingStart` | 开始加工:任务状态变为已开工(2),自动同步上序合格数作为收料数 | +| `MES_ProductTask_Rest` | 暂停操作:加工状态变为暂停 | +| `MES_ProductTask_ProdReport` | **报工核心**:含完整加班计算(白班/夜班拆分、休息日/法定休息日处理)、捆绑报工、前序不合格数处理、报工记录双插入(生产工时+辅助工时) | +| `MES_ProductTask_HelpStart` | 辅助开始 | +| `MES_ProductTask_HelpEnd` | 辅助结束:含加班时长计算、班次判断、特殊加班人员处理 | +| `MES_ProductTask_FirstCheck` | 首检操作 | +| `MES_ProductTask_Excutable` | 标记任务为可执行 | +| `MES_ProductTask_SendInspection` | 送检(装配报工) | +| `MES_ProductCenter_OptRecord_Save` | **操作记录保存核心**:处理暂停/开始/报工的联动逻辑,计算工时 | +| `MES_ProductCenter_OptRecords` | 操作记录查询 | + +#### 人员工时(装配) + +| 存储过程 | 功能 | +|----------|------| +| `MES_人员工时记录_开始` | 装配人员开始加工记录 | +| `MES_人员工时记录_结束` | 装配人员结束加工:含白班/加班/休息日完整计算,生成报工记录和加班记录 | +| `MES_人员工时记录_检查是否存在` | 检查是否有未结束的开始记录 | +| `MES_人员工时记录_获取进行中任务` | 按用户ID获取进行中的装配任务 | + +#### 质量管理 + +| 存储过程 | 功能 | +|----------|------| +| `MES_QulityInspection_ReceiveCheck` | **收检处理**:事务性写入质检记录,总检测数=计划生产数时自动完成任务,收检合格后触发下一工序可执行 | +| `MES_QulityInspection_FinalCheck` | 终检记录 | +| `MES_QulityInspection_CheckItemData_Save` | **检测数据保存**:事务性三级写入(质检主表→零件表→检测数据表),支持批量零件检测 | +| `MES_QulityInspection_FirstCheckRecords` | 首检记录查询 | +| `MES_QulityInspection_RoundCheck` | 巡检操作 | +| `MES_QulityInspection_ProcessCheck` | 序检操作 | +| `MES_QulityInspection_GetItemStandard` | 获取检测标准 | +| `MES_QulityInspection_GetInspectionDetails` | 获取检测明细数据 | +| `MES_QulityInspection_GetInspectionParts` | 获取检测零件列表 | +| `MES_QulityInspection_NGPart_Add` | 不合格品处理流程发起 | +| `MES_QulityInspection_NGPart_FlowNode_Add` | 审批节点新增 | +| `MES_QulityInspection_NGPart_FlowNode_Update` | 审批节点完成 | +| `MES_QulityInspection_NGPart_Finish` | 不合格品处理流程结束 | + +#### 设备管理与实时监控 + +| 存储过程 | 功能 | +|----------|------| +| `MES_DeviceAdmin_BaseInfo` | 设备台账新增 | +| `MES_DeviceAdmin_RepairRecords_Add/Query` | 维修记录增查 | +| `MES_DeviceAdmin_DeviceProductState_Update` | 设备生产状态更新(含历史记录) | +| `Event_CaChe_Var_Update` | 设备变量实时缓存更新(含循环时间触发工时记录) | +| `Event_Device_Insert_CurrInfo` | 设备数据历史写入 | +| `Event_Device_Update_CurrInfo` | 设备变量当前值更新 | +| `Event_StationStatus_Insert/Update` | 工位状态记录/更新 | +| `Event_Alarm_Start/End` | 报警开始/结束处理(含缓存→历史迁移) | +| `Event_Log_Request/Respond` | API请求/响应日志 | + +#### 登录与用户 + +| 存储过程 | 功能 | +|----------|------| +| `MES_登录_工号密码验证` | 用户登录验证(查询基础表_用户角色) | +| `MES_登录_工位与名称_查询` | 获取工位列表(来自View_基础数据_工位) | +| `MES_登录_班次信息` | 获取班次数据字典 | +| `Prog_MES_GetDictionar_ByType` | 按类别获取数据字典 | + +#### 系统工具 + +| 存储过程 | 功能 | +|----------|------| +| `___DB_BAK` | 数据库全量备份到 C:\_MW\数据库\ | +| `_日志_增加` | 用户操作日志插入 | +| `p_PopFirstWord` | 逗号分隔字符串解析工具函数 | + +### 4.6 外部系统集成 (SAP Business One) + +``` +跨数据库查询链路: +├── SAP.SBO_YL.dbo.UBT_OITM → 物料主数据(编码/名称/品牌) +├── SAP.SBO_YL.dbo.UBT_WW_MES_OPORandOPCH → 采购订单(供应商/含税单价/材质) +├── SAP.SBO_YL.dbo.OWOR → 生产订单(ERP侧) +├── SAP.SBO_YL.dbo.OWR1 → 生产订单行 +└── SAP.SBO_YL.dbo.OWR4 → 生产订单阶段 +``` + +### 4.7 核心数据流 + +``` +ERP(SAP)订单下发 + │ + ▼ +MES_接口_生产计划 (订单同步) + │ + ▼ +排产 (MES_OrderPlanned_SingleTaskPlanned) + │ └── 任务拆分/工位指派/计划时间设定 + ▼ +MES_接口_生产计划_生产任务 (工序级任务) + │ + ├── 收料 → 任务状态: 0(待执行) → 1(可执行) + │ + ├── 开始加工 → 任务状态: 1 → 2(已开工) + │ │ + │ ├── 暂停/恢复循环 (关联开始记录 ↔ 关联暂停记录) + │ │ + │ └── 报工 → 计算工时(总时长-暂停总时长) + │ │ + │ ├── 生成报工记录(生产工时+辅助工时) + │ ├── 判断加班(白班/夜班拆分/休息日) + │ └── 任务状态: 2 → 4(已完成) + │ + ├── 首检 → 巡检 → 序检 (质检环节) + │ + ├── 收检 (MES_QulityInspection_ReceiveCheck) + │ │ 合格数触发下一工序可执行 + │ └── 任务状态 → 4(已完成) + │ + └── 终检 → 完工判定 +``` + +--- + +## 5. 程序问题分析报告 + +### 🔴 严重问题 (Critical) + +#### 问题 1:SQL注入漏洞 — 60+个存储过程 + +**位置**: `script.sql` 中几乎所有动态SQL存储过程 + +所有使用 `sp_executesql` 拼接 `@whereStr` 的存储过程都存在SQL注入风险。用户输入直接通过字符串拼接插入SQL语句: + +```sql +-- MES_OrderPlanned_Query (line 3303) +if(@合同号<>'') set @selectStrWhere = @selectStrWhere + + ' and [合同号] like ''%'+@合同号+'%''' +``` + +**受影响的存储过程 (部分列表)**: +- `MES_OrderPlanned_Query` / `MES_OrderPlanned_Queryzp` +- `MES_ProductAdmin_Query` / `MES_ProductAdmin_GetRptRecords` +- `MES_ProductCenter_OptRecords` +- `MES_QulityInspection_CheckRecord_Query` +- `MES_QulityInspection_FirstCheckRecords` +- `MES_QulityInspection_MeasuringTool` +- `MES_QulityInspection_GetTask` +- `MES_ProductCenter_GetTask` / `MES_ProductCenter_GetTask_zp` + +**修复建议**: 统一使用参数化查询模式: +```sql +SET @SQL = @SQL + ' AND [合同号] LIKE ''%'' + @合同号 + ''%''' +EXEC sp_executesql @SQL, N'@合同号 nvarchar(50)', @合同号 = @合同号 +``` + +--- + +#### 问题 2:明文密码存储于Cookie + +**位置**: `src/views/login/index.vue` line 243-246 + +```javascript +setCookie(username, password, checked) { + Cookie.set('username', username, { expires: 7 }) + Cookie.set('password', password, { expires: 7 }) // ❌ 明文密码存7天 + Cookie.set('checked', checked, { expires: 7 }) +} +``` + +密码以明文存储在客户端Cookie中持续7天,可被XSS攻击轻易窃取。 + +--- + +#### 问题 3:Axios已知CVE漏洞版本 + +**位置**: `package.json` line 17 + +```json +"axios": "^0.21.4" +``` + +axios 0.21.4 存在已知安全漏洞 CVE-2021-3749 (ReDoS攻击),当前最新版本为 1.7.x。 + +--- + +#### 问题 4:开发代理绕过HTTPS证书验证 + 死代码配置 + +**位置**: `config/index.js` line 18-19, 37-38 + +```javascript +proxyTable: { + '/api/b1s': { + target: 'https://192.168.2.90:50000', // SAP B1 + secure: false, // ❌ 跳过SSL证书验证 — 中间人攻击风险 + }, + '/openapi/v1': { + target: 'http://192.168.2.90:8082', + pathRewrite: { + '^/api/tm': '/openapi/v1' // ❌ 死代码:/openapi/v1 永远不会匹配 /api/tm + } + } +} +``` + +第二个代理的 pathRewrite 规则永远无法触发。 + +--- + +#### 问题 5:登录密码拼在URL参数中 + +**位置**: `src/api/login.js` line 13 + +```javascript +param: `用户名=${username}&密码=${password}` +``` + +密码作为URL查询参数传输,会被代理服务器日志、浏览器历史记录记录。 + +--- + +### 🟠 高优先级问题 (High) + +#### 问题 6:修改密码验证器Bug (复制粘贴错误) + +**位置**: `src/views/login/index.vue` line 119-130 + +```javascript +const validateValue = (rules, value, callback) => { + // ❌ 三个条件都检查同一个字段 — 明显的复制粘贴bug + if (typeof (this.form.againPassword) === 'string' || + typeof (this.form.againPassword) === 'string' || + typeof (this.form.againPassword) === 'string') { + callback(new Error('请输入英文字母组合')) // ❌ 字符串类型反而报错? + } + // ❌ 下面代码永远不会执行:已callback但未return + if (this.form.newPassword !== this.form.againPassword) { + callback(new Error('两次输入密码不同')) + } +} +``` + +该验证器应用于所有4个密码字段,导致密码修改功能**完全无法正常工作**。 + +--- + +#### 问题 7:Vuex Action中 this.$router 为undefined + +**位置**: `src/store/modules/user.js` line 44-45 + +```javascript +Login({ commit }, userInfo) { + login(username, userInfo.password).then(response => { + if (data.length === 0 || data.result === '0') { + Message.error('账号或密码错误,请重新登录') + this.$router.push({ path: '/login' }) // ❌ Vuex action中this不是Vue组件实例 + } +``` + +在Vuex action中使用 `this.$router` 会抛出 `TypeError: Cannot read properties of undefined`。 + +--- + +#### 问题 8:GetInfo 硬编码角色为 'admin' + +**位置**: `src/store/modules/user.js` line 83 + +```javascript +GetInfo({ commit, state }) { + getInfo(state.token).then(response => { + commit('SET_ROLES', 'admin') // ❌ 无视后端返回的真实角色数据 + resolve(response) + }) +} +``` + +所有登录用户都被授予 `'admin'` 角色。`permission.js` 第13行 `roles.indexOf('admin') >= 0` 对所有用户放行,导致权限控制完全失效。 + +--- + +#### 问题 9:登录错误被静默吞掉 + +**位置**: `src/views/login/index.vue` line 198-200 + +```javascript +}).catch(() => { + this.loading = false // ❌ 无任何错误提示 +}) +``` + +网络故障或服务器错误时用户看不到任何反馈。 + +--- + +#### 问题 10:Webpack开发服务器强制HTTPS但无有效证书 + +**位置**: `build/webpack.dev.conf.js` line 31 + +```javascript +devServer: { + https: true, // ❌ 未配置证书 → 浏览器报安全错误 +``` + +本地开发时浏览器会因自签名证书阻止访问。 + +--- + +### 🟡 中优先级问题 (Medium) + +#### 问题 11:Vue 2 已于 2023年12月 EOL + +Vue 2.x 不再接收安全补丁和新功能。建议规划迁移至 Vue 3。 + +#### 问题 12:生产环境暴露 Source Map + +**位置**: `config/index.js` line 110 + +```javascript +devtool: 'source-map', // 生产环境暴露完整源码 +``` + +用户可通过浏览器开发者工具查看未压缩的完整源码。 + +#### 问题 13:`__Reset_ProductOrder` 存储过程执行 TRUNCATE + +**位置**: `script.sql` line 2288-2289 + +```sql +truncate table YL_加工中心_操作记录表 +truncate table YL_加工中心_报工记录 +``` + +当 `@optType=1` 时无条件清空全部操作记录和报工记录,误调用将导致数据永久丢失且无法回滚。 + +#### 问题 14:数据库日志文件初始263GB + +**位置**: `script.sql` line 9 + +```sql +LOG ON +(NAME = N'YL_MESDB_log', FILENAME = N'D:\sqlDataLog\YL_MESDB_log.ldf', + SIZE = 269688832KB) -- 约263GB +``` + +恢复模式为FULL但只有全量备份,没有事务日志备份,日志文件会持续增长直至磁盘占满。 + +#### 问题 15:依赖项问题 + +**位置**: `package.json` line 26 + +```json +"install": "^0.13.0" // ❌ "install"是一个真实的npm包但不应作为项目依赖 +``` + +这是脚手架残留或误操作引入。 + +#### 问题 16:关键ESLint规则被关闭 + +**位置**: `.eslintrc.js` line 83, 153 + +```javascript +'no-console': 'off', +'no-unused-vars': ['off', { ... }] +``` + +大量 `console.log` 残留于生产代码,未使用变量不提示。 + +--- + +### 🟢 低优先级/建议 (Low) + +| # | 问题 | 位置 | +|---|------|------| +| 17 | `vue$` alias 指向 `vue.esm.js` 而非 `vue.runtime.esm.js` | `webpack.base.conf.js` line 32 | +| 18 | webpack dev 使用 `cache.type: 'filesystem'` 可能引起缓存过期问题 | `webpack.dev.conf.js` line 24 | +| 19 | `devServer` 配置使用 Webpack 4 风格 (static/publicPath) | `webpack.dev.conf.js` | +| 20 | `CopyWebpackPlugin` v11 API 已弃用 patterns 外层写法 | `webpack.dev.conf.js` line 61 | +| 21 | SCSS loader 使用 Dart Sass 但配置了 `indentedSyntax: true` | `webpack.base.conf.js` line 165 | +| 22 | 登录页用户名变更时清空密码 (可能非预期行为) | `login/index.vue` line 182 | +| 23 | `config/index.js` 第9行 `networkInterfaces['WLAN']` 硬编码,可能在乙太网卡环境出错 | `config/index.js` line 9 | +| 24 | Vue-loader 配置文件为空对象,未配置任何选项 | `build/vue-loader.conf.js` | + +--- + +### 📊 问题汇总统计 + +| 级别 | 数量 | 影响 | +|------|------|------| +| 🔴 Critical | 5 | 安全漏洞、数据泄露风险 | +| 🟠 High | 5 | 功能Bug、权限失效、运行时错误 | +| 🟡 Medium | 6 | 可维护性、稳定性风险 | +| 🟢 Low | 7 | 代码质量、最佳实践 | +| **总计** | **23** | | + +--- + +### 🔧 优先修复路线图 + +**第1阶段 (立即)**: +1. 修复所有SQL注入漏洞 → 动态SQL改用参数化查询 +2. 移除Cookie明文密码 → 仅存Token +3. 修复 `validateValue` 验证器Bug + +**第2阶段 (本周)**: +4. 升级 axios 到 1.7.x +5. 修复 `GetInfo` 硬编码 admin 角色 +6. 修复 `this.$router` 在 Vuex 中的调用 + +**第3阶段 (本月)**: +7. 配置事务日志定期备份策略 +8. 修复 webpack 生产环境 source-map 泄露 +9. 为 `__Reset_ProductOrder` 添加安全防护(备份确认/权限限制) + +**第4阶段 (规划)**: +10. 规划 Vue 3 迁移路线图 +11. 清理无用依赖和死代码 +12. 恢复 ESLint 关键规则并修复代码 + +--- + +> 📅 报告生成日期: 2026-05-18 +> 📝 分析范围: 全项目静态代码分析 (前端 + 数据库) diff --git a/MES_用户操作手册.md b/MES_用户操作手册.md new file mode 100644 index 0000000..5be0906 --- /dev/null +++ b/MES_用户操作手册.md @@ -0,0 +1,680 @@ +# MES 工业互联网平台 — 用户操作手册 + +> **版本**: v1.1.0 +> **适用岗位**: 生产操作工、质检员、班组长、车间主管、生产调度员 +> **日期**: 2026-05-18 + +--- + +## 目录 + +- [1. 快速入门](#1-快速入门) + - [1.1 登录系统](#11-登录系统) + - [1.2 界面认知](#12-界面认知) + - [1.3 通用操作方式](#13-通用操作方式) + - [1.4 退出系统](#14-退出系统) +- [2. 生产操作工日常操作](#2-生产操作工日常操作) + - [2.1 查看我的任务](#21-查看我的任务) + - [2.2 物料接收(收料)](#22-物料接收收料) + - [2.3 开始加工](#23-开始加工) + - [2.4 暂停与恢复加工](#24-暂停与恢复加工) + - [2.5 完工报工](#25-完工报工) + - [2.6 辅助工序操作](#26-辅助工序操作) + - [2.7 首件自检](#27-首件自检) +- [3. 质检员日常操作](#3-质检员日常操作) + - [3.1 巡检操作](#31-巡检操作) + - [3.2 序检操作](#32-序检操作) + - [3.3 收检操作(工序交接)](#33-收检操作工序交接) + - [3.4 终检操作](#34-终检操作) + - [3.5 逐项检测数据录入](#35-逐项检测数据录入) + - [3.6 不合格品处理](#36-不合格品处理) +- [4. 班组长/主管日常操作](#4-班组长主管日常操作) + - [4.1 生产排产](#41-生产排产) + - [4.2 报工确认](#42-报工确认) + - [4.3 工时查询](#43-工时查询) + - [4.4 二次派工](#44-二次派工) +- [5. 加班操作指南](#5-加班操作指南) + - [5.1 工作日加班](#51-工作日加班) + - [5.2 休息日加班](#52-休息日加班) + - [5.3 特殊加班人员处理](#53-特殊加班人员处理) +- [6. 其他常用功能](#6-其他常用功能) + - [6.1 查看生产进度](#61-查看生产进度) + - [6.2 图纸查看](#62-图纸查看) + - [6.3 外协业务](#63-外协业务) + - [6.4 装配工序操作](#64-装配工序操作) +- [7. 附录](#7-附录) + - [7.1 名词解释](#71-名词解释) + - [7.2 快捷键与操作提示](#72-快捷键与操作提示) + - [7.3 常见错误提示与处理](#73-常见错误提示与处理) + +--- + +## 1. 快速入门 + +### 1.1 登录系统 + +``` +步骤1:打开浏览器,输入系统网址 +步骤2:在登录页面输入您的工号和密码 +步骤3:点击"登录"按钮 +步骤4(如有多个角色):在弹出框中选择本次使用的角色 → 点击"确定" +``` + +**登录页面各区域说明**: + +``` +┌──────────────────────────────────┐ +│ │ +│ MES工业互联网平台 │ +│ │ +│ ┌──────────────────────┐ │ +│ │ 👤 请输入用户名 │ │ +│ └──────────────────────┘ │ +│ ┌──────────────────────┐ │ +│ │ 🔒 请输入密码 │ │ +│ └──────────────────────┘ │ +│ ☐ 记住账号 │ +│ ┌──────────────────────┐ │ +│ │ 登 录 │ │ +│ └──────────────────────┘ │ +│ 修改密码 │ +└──────────────────────────────────┘ +``` + +> 💡 **提示**: 勾选"记住账号"后,下次打开登录页会自动填入用户名和密码(有效期7天)。 + +**修改密码**: + +``` +步骤1:点击"修改密码" +步骤2:输入工号 → 原始密码 → 新密码 → 确认密码 +步骤3:点击"确定" +``` +> ⚠️ 密码修改成功后需重新登录。 + +--- + +### 1.2 界面认知 + +登录成功后进入系统主界面,分为四个区域: + +``` +┌─────────────────────────────────────────────────┐ +│ ☰ 面包屑导航 🔔消息 ✏修改密码 👤用户名 │ ← 顶栏 +├────────┬────────────────────────────────────────┤ +│ LOGO │ │ +│ │ │ +│ 菜单1 │ 主工作区域 │ +│ 菜单2 │ │ +│ 菜单3 │ (表格 / 表单 / 搜索区) │ +│ 菜单4 │ │ +│ ... │ │ +│ │ │ +│ │ │ +├────────┴────────────────────────────────────────┤ +│ 已打开的标签页: [首页] [排产管理] [加工中心] │ ← 标签栏 +└─────────────────────────────────────────────────┘ +``` + +| 区域 | 位置 | 功能 | +|------|------|------| +| **侧边栏** | 左侧 | 显示功能菜单,单击展开子菜单,再单击进入功能页面 | +| **顶栏** | 顶部 | 面包屑导航、未读报警消息、修改密码入口、用户头像(登出) | +| **标签栏** | 底部(主区域上方) | 显示已打开的页面标签,可切换或关闭 | +| **主工作区** | 中央 | 当前功能的操作界面(搜索条件+数据表格+操作按钮) | + +**首页看板**:登录后默认进入首页,显示九宫格功能入口,按模块分组排列。直接点击图标即可进入对应功能。 + +--- + +### 1.3 通用操作方式 + +系统中所有数据管理页面遵循统一的操作模式: + +``` +┌────────────────────────────────────────┐ +│ 🔍 搜索条件区 │ +│ [订单号____] [物料____] [日期____] │ +│ [查询] [重置] │ +├────────────────────────────────────────┤ +│ 操作按钮区 │ +│ [新增] [编辑] [删除] [导出Excel] │ +├────────────────────────────────────────┤ +│ 数据表格区 │ +│ ┌────┬──────┬──────┬──────┬────┐ │ +│ │ 序号│ 订单号 │ 物料 │ 状态 │操作│ │ +│ ├────┼──────┼──────┼──────┼────┤ │ +│ │ 1 │10001 │零件A │可执行│编辑│ │ +│ │ 2 │10002 │零件B │已开工│编辑│ │ +│ └────┴──────┴──────┴──────┴────┘ │ +│ 共 50 条 ◀ 1 2 3 ... 5 ▶ │ +└────────────────────────────────────────┘ +``` + +**通用操作按钮说明**: + +| 按钮 | 图标 | 功能 | +|------|:--:|------| +| 查询 | 🔍 | 按搜索条件筛选数据 | +| 重置 | 🔄 | 清空搜索条件 | +| 新增 | ➕ | 打开新增表单 | +| 编辑 | ✏ | 选中一行后打开编辑表单 | +| 删除 | 🗑 | 选中一行后删除(需确认) | +| 导出 | 📥 | 导出当前数据为Excel | + +**表单操作通用规则**: +- 红色星号 `*` 标记的为必填项 +- 下拉框可输入文字快速搜索 +- 日期选择器可直接输入或点击日历图标选择 +- 表单验证不通过时,该项下方显示红色提示文字 + +--- + +### 1.4 退出系统 + +``` +方式1:点击右上角用户头像 → 选择"Log Out" +方式2:直接关闭浏览器标签页 +方式3:长时间无操作后自动退出(约30分钟) +``` + +--- + +## 2. 生产操作工日常操作 + +> 📋 **典型工作流程**: +> 登录 → 加工中心 → 查看任务 → 收料 → 开始加工 → (暂停/恢复) → 报工 → 完成 + +### 2.1 查看我的任务 + +**操作路径**:侧边栏 → **加工中心** → 任务列表 + +进入后显示分配给**当前工位**的生产任务。表格中包含以下关键信息: + +| 列名 | 含义 | 示例 | +|------|------|------| +| 订单号 | 生产订单编号 | 10001234 | +| 零件编码 | 物料编号 | YL-001-02 | +| 零件名称 | 物料描述 | 轴承座 | +| 工序名称 | 当前需执行的工序 | 车削 | +| 分配数 | 本工序需完成的数量 | 200 | +| 完成数量 | 已完成的合格数量 | 150 | +| 收料 | 已接收上序来料数量 | 180 | +| 任务状态 | 当前状态 | **可执行** | +| 加工状态 | 加工进度 | 开始加工 | +| 计划完成 | 要求完工日期 | 2026-05-25 | + +**颜色含义**: +- 🟢 **可执行**:可以开工 +- 🔵 **已开工**:正在加工 +- ⚪ **待执行**:等待来料 +- ✅ **已完成**:已报工完成 + +### 2.2 物料接收(收料) + +> **场景**: 上道工序送来加工零件,清点数量后确认接收。 + +``` +步骤1:在任务列表中,找到需要收料的任务行 +步骤2:确认任务状态为"待执行"或"可执行" +步骤3:点击该行的"收料"按钮 +步骤4:在弹出框中输入本次接收的数量 +步骤5:点击"确认" +步骤6:任务状态自动变为"可执行"(收料数量 > 0 时) +``` + +> ⚠️ **注意**: 首次开始加工时,系统会自动把上序合格数同步为收料数。 + +### 2.3 开始加工 + +> **场景**: 准备就绪,开始正式生产加工。 + +``` +步骤1:确认任务状态为"可执行"(绿色显示) +步骤2:点击"开始加工"按钮 +步骤3:系统自动记录开始时间,任务状态变为"已开工" +``` + +> 💡 **提示**:开始加工后计时器启动,工时从此刻开始计算。 + +### 2.4 暂停与恢复加工 + +> **场景**: 中途需要休息、换刀、等料等需要临时中断生产。 + +**暂停操作**: +``` +步骤1:点击"暂停"按钮 +步骤2:系统记录暂停时间点,加工状态变为"暂停" +``` + +**恢复操作**: +``` +步骤1:点击"开始加工"按钮 +步骤2:系统自动计算上次暂停的持续时长 +步骤3:恢复计时,加工状态变为"开始加工" +``` + +> 💡 **提示**:系统自动计算"总时长 - 暂停总时长 = 实际工时",无需手动计算。 + +### 2.5 完工报工 + +> **场景**: 本批零件加工完成,需要进行完工汇报。 + +``` +步骤1:确认任务状态为"已开工" +步骤2:点击"报工"按钮 +步骤3:填写报工信息: + ├── 报工日期:默认为当天(可修改) + ├── 报工班次:选择白班/夜班 + ├── 报工数量:本次完成的合格品数量 + ├── 报工说明:备注(可选) + ├── 是否加班:超时工作选"是"(见第5章) + ├── 加班人员:填写加班人员姓名(逗号分隔) + └── 特殊加班人员:非标准工时人员(逗号分隔) +步骤4:点击"确认" +步骤5:系统计算工时并保存报工记录 +``` + +**报工结果判断**: +| 条件 | 结果 | +|------|------| +| 累计完成数量 < 指派数量 | 任务保持"已开工",可继续报工 | +| 累计完成数量 = 指派数量 | 任务状态变为"已完成" | +| 报工数量 > 剩余未完成数 | **报错**:超出指派数量,不可提交 | + +### 2.6 辅助工序操作 + +> **场景**: 上下料、工装准备、设备清理等辅助性工作也需要记录工时。 + +``` +辅助开始: + 步骤1:在任务列表中点击"辅助开始" + 步骤2:系统记录辅助开始时间 + +辅助结束: + 步骤1:点击"辅助结束" + 步骤2:输入本次辅助完成的数量 + 步骤3:如需加班,勾选"是否加班"并填写人员 + 步骤4:点击"确认" +``` + +**辅助工时**独立于生产工时计算。 + +### 2.7 首件自检 + +> **场景**: 每批零件加工的第一件需要自检确认。 + +``` +步骤1:加工完首件后,点击"首检"按钮 +步骤2:测量零件关键尺寸 +步骤3:选择检验结果:OK(合格)/ NG(不合格) +步骤4:点击"确认" +``` + +> ⚠️ 首检NG时,需调整设备/工艺后重新加工首件并再次首检。 + +--- + +## 3. 质检员日常操作 + +> 📋 **典型工作流程**: +> 登录 → 质量管理 → 选择质检任务 → 巡检/序检/收检/终检 → 录入检测数据 → 不合格品处理 + +### 3.1 巡检操作 + +> **场景**: 生产过程中定期对加工零件进行抽检。 + +``` +步骤1:进入"质量管理"→"质检任务" +步骤2:筛选条件选择"已开工"的任务 +步骤3:点击目标任务的"巡检"按钮 +步骤4:输入抽检数量和NG数量 +步骤5:填写检测说明(可选) +步骤6:点击"保存" +``` + +### 3.2 序检操作 + +> **场景**: 一道工序加工完成后对本序产品进行检验。 + +``` +步骤1:进入质检任务列表 +步骤2:筛选"已开工"的任务 +步骤3:点击"序检" +步骤4:输入检验数量和不合格数量 +步骤5:填写检测说明 +步骤6:点击"保存" +``` + +### 3.3 收检操作(工序交接) + +> **场景**: 上道工序完工后,下道工序接收时进行检验确认。这是最重要的质检环节。 + +``` +步骤1:进入"质检任务"列表 +步骤2:质检类型选择"收检" +步骤3:点击目标任务的"收检" +步骤4:填入以下信息: + ├── 检验数量:本次抽检/全检的数量 + ├── 合格数:判定合格的数量 + ├── 不合格数:判定不合格的数量 + ├── 检测人:自动取当前用户 + └── 检测说明:填写备注 +步骤5:点击"保存" +``` + +**系统自动联动**: +- ✅ 收检合格数 > 0 → 下一道工序自动变为"可执行" +- ✅ 总检测数 = 计划生产数 → 当前工序自动标记为"已完成" + +### 3.4 终检操作 + +> **场景**: 所有工序完成后,对成品进行最终检验。 + +``` +步骤1:进入质检任务列表 +步骤2:点击"终检"按钮 +步骤3:填入: + ├── 检测数量:本次检验总数 + ├── 合格数:判定合格的数量 + ├── 不合格数:判定不合格的数量 + └── 放行数量:让步放行的数量 +步骤4:点击"保存" +``` + +### 3.5 逐项检测数据录入 + +> **场景**: 需要按检测标准逐项测量和记录的精密检验。 + +``` +步骤1:在质检任务中,点击"检测数据"进入详细录入界面 +步骤2:选择当前检测零件编号(第1件/第2件...) +步骤3:逐项录入检测数据: + ┌─────────────────────────────────────────┐ + │ 检测项目 理论值 上限 下限 实测值 │ + │ 外径 50.00 50.05 49.95 [____] │ + │ 内径 30.00 30.03 29.97 [____] │ + │ 长度 100.00 100.10 99.90 [____] │ + └─────────────────────────────────────────┘ +步骤4:每输入一项实测值,系统自动判断合格/不合格 +步骤5:完成所有检测项目后点击"保存" +步骤6:切换下一个零件编号继续检测 +``` + +**颜色标识**: +- 🟢 绿色:实测值在上下限范围内 → 合格 +- 🔴 红色:实测值超出上下限范围 → 不合格 + +### 3.6 不合格品处理 + +> **场景**: 发现不合格品后,发起处理流程(让步放行申请等)。 + +``` +步骤1:在质检记录中,点击"不合格品处理" +步骤2:填写处理申请: + ├── 不合格数量:自动带入 + ├── 申请让步放行:勾选是否需要让步 + ├── 申请内容:说明不合格情况和理由 + └── 接收人:选择审批人 +步骤3:点击"提交" +步骤4:审批人会收到处理通知 +步骤5:审批人填写处理意见 → 完成审批节点 +步骤6:流程发起人可查看处理结果 +``` + +--- + +## 4. 班组长/主管日常操作 + +### 4.1 生产排产 + +> **场景**: 接到生产订单后,将任务分配到具体工位。 + +**4.1.1 查询待排产订单** + +``` +步骤1:侧边栏 → "生产排产" → "排产任务" +步骤2:设置条件: + ├── 物料类型:自制件/装配件 + ├── 订单号:输入具体订单号 + ├── 合同号:输入销售合同号 + ├── 产品编码:模糊搜索 + ├── 工序名称:指定工序 + ├── 排产状态:未完成 + └── 指派对象:选择目标工位 +步骤3:点击"查询" +``` + +**4.1.2 单任务排产** + +``` +步骤1:在列表中选中一条任务 +步骤2:点击"排产"或"编辑" +步骤3:填写排产信息: + ├── 指派对象(工位):必填,选择目标机床/工位 + ├── 指派数量:输入本序计划生产数量 + ├── 计划开始时间:最早可开工时间 + ├── 计划完成时间:要求完成时间 + ├── 最晚开始时间:最迟必须开工时间 + └── 派工特殊说明:备注(可选) +步骤4:点击"保存" +``` + +> 💡 **自动拆分规则**:如果指派数量 < 计划数量,系统会自动将剩余数量拆分为新任务条目。 + +**4.1.3 批量排产** + +``` +步骤1:在列表中勾选多条待排产任务 +步骤2:点击"批量排产" +步骤3:确认执行 +步骤4:系统批量更新指派信息 +``` + +### 4.2 报工确认 + +> **场景**: 核实操作工提交的报工数据,确认最终工时。 + +``` +步骤1:侧边栏 → "工时管理" → "报工记录" +步骤2:选择报工日期 +步骤3:筛选条件(可选):工位/合同号/订单号/操作人 +步骤4:查看报工记录列表 +步骤5:核对"报工工时"与"确认工时" +步骤6:如需调整,点击"确认"按钮 +步骤7:输入确认工时和确认说明 +步骤8:点击"保存" +``` + +| 状态 | 含义 | +|:---:|------| +| 未确认 | 操作工已提交,待班组长确认 | +| 已确认 | 班组长已核实确认 | + +### 4.3 工时查询 + +``` +步骤1:侧边栏 → "工时管理" → "工时汇总" +步骤2:设置时间范围(计划开工开始~结束) +步骤3:点击"查询" +步骤4:查看各任务/工序的工时汇总 +``` + +### 4.4 二次派工 + +> **场景**: 一道工序需要多人协作完成。 + +``` +步骤1:在排产任务中找到目标工序 +步骤2:点击"二次派工" +步骤3:选择/输入多名操作人员(逗号分隔) +步骤4:保存 +``` + +二次派工后,这些人员都可以看到该任务并进行操作。 + +--- + +## 5. 加班操作指南 + +### 5.1 工作日加班 + +> **场景**: 正常工作日,加工时间超出班次规定时间。 + +``` +白班加班(超过16:30): + 步骤1:报工时勾选"是否加班" = 是 + 步骤2:填写"加班人员"(多个人员用逗号分隔) + 步骤3:系统自动计算超出白班时间的加班工时 + 步骤4:确认提交 + +夜班加班(超过00:40): + 操作同上,系统自动识别夜班时间段 +``` + +**班次时间参考**: + +| 班次 | 标准时间 | 超出后算加班 | +|------|------|------| +| 白班 | 07:45 - 16:30 | > 16:30 | +| 夜班 | 16:30 - 00:40(次日) | > 00:40 | + +### 5.2 休息日加班 + +> **场景**: 周末或节假日安排生产。 + +``` +步骤1:报工时勾选"是否休息日" = 是 +步骤2:或勾选"是否法定休息日" = 是 +步骤3:勾选"是否加班" = 是 +步骤4:填写加班人员 +步骤5:系统按休息日加班标准计算工时 +步骤6:确认提交 +``` + +> ⚠️ **休息日"不加班"选项**:如果休息日选择"不加班",则记录为普通工时,不按加班计算。 + +### 5.3 特殊加班人员处理 + +> **场景**: 部分人员非标准8小时工作制(如4小时/6小时班制)。 + +``` +步骤1:在"特殊加班人员"框中填写这些人员姓名(逗号分隔) +步骤2:在"班次标准工时"中填入其标准工时(小时) +步骤3:系统对该人员按特殊工时标准计算 +``` + +--- + +## 6. 其他常用功能 + +### 6.1 查看生产进度 + +> **场景**: 实时了解各工序生产完成情况。 + +``` +步骤1:侧边栏 → 看板/监控 +步骤2:查看"当前生产状态"看板 +``` + +看板显示各工位正在加工的任务信息: +- 工位名称、操作人 +- 零件编码/名称 +- 工序名称、完成进度百分比 +- 首检/序检状态(OK/NG) + +### 6.2 图纸查看 + +> **场景**: 在生产过程中查看零件图纸或工艺图纸。 + +``` +步骤1:进入"图纸管理" +步骤2:输入物料编号搜索 +步骤3:点击图纸名称在线预览(支持PDF) +步骤4:可放大、缩小、旋转、翻页 +``` + +### 6.3 外协业务 + +> **场景**: 管理外协工序(委托外部供应商加工)。 + +**外协工序操作流程**: +``` +步骤1:排产时将工序指派对象设为"外协" +步骤2:加工中心自动识别外协任务 +步骤3:外协完工后进行收检(质检员操作) +步骤4:在"外协报表"中查看外协进度 +``` + +外协报表包含:供应商名称、采购单价、发料数量、收检合格/不合格数。 + +### 6.4 装配工序操作 + +> **场景**: 装配产线的生产操作。 + +装配工序使用独立的人员工时记录方式: + +``` +开始装配: + 步骤1:在任务列表中点击"开始加工" + 步骤2:系统记录开始时间和人员 + +结束装配: + 步骤1:点击"结束"按钮 + 步骤2:填写工序说明、异常说明(可选) + 步骤3:如需加班,勾选并填写加班人员 + 步骤4:点击"确认" + 步骤5:系统自动计算工时并保存 +``` + +> 💡 装配工序的报工在"结束"时自动计算,无需单独报工。 + +--- + +## 7. 附录 + +### 7.1 名词解释 + +| 术语 | 解释 | +|------|------| +| **TaskAID** | 生产任务唯一标识号 | +| **排产** | 将订单任务分配到具体工位并设定计划时间 | +| **收料** | 确认接收上道工序移交的零件 | +| **报工** | 完成加工后汇报完成数量 | +| **首检** | 每批首个零件的质量检验 | +| **巡检** | 生产过程中的巡回抽检 | +| **序检** | 本工序完成后的检验 | +| **收检** | 接收上序零件时的检验(跨工序交接关键环节) | +| **终检** | 所有工序完成后的最终检验 | +| **让步放行** | 不合格品经审批后允许使用 | +| **二次派工** | 同一工序指派多名操作人员 | +| **齐套** | 物料配套齐全可开工 | +| **拣配** | 物料已从仓库拣选配齐 | + +### 7.2 快捷键与操作提示 + +| 操作 | 方法 | +|------|------| +| 快速搜索下拉选项 | 在下拉框中直接输入文字筛选 | +| 清空搜索条件 | 点击搜索区"重置"按钮 | +| 日期快速选择 | 点击日历图标或直接输入 `2026-05-18` 格式 | +| 刷新当前页面 | 按 `F5` 键 | +| 关闭当前标签 | 点击标签上的 `×` | +| 批量勾选 | 点击表头的复选框全选/取消全选 | + +### 7.3 常见错误提示与处理 + +| 错误提示 | 原因 | 处理方法 | +|------|------|------| +| "账号或密码错误" | 输入凭证不正确 | 检查工号和密码,确认大小写 | +| "指派数量大于剩余未分配数量" | 排产数量超过库存 | 减少本次指派数量 | +| "报工数量与完成数量之和已超出指派数量" | 累计报工超过计划数 | 减少本次报工数量,或检查前序不合格数 | +| "该用户已有未结束的开始记录" | 上一个任务未结束 | 先结束上一个加工任务 | +| "检验数量超过计划生产数" | 质检数量超出计划 | 核对检验数量 | +| "此账号登录失效,请重新登录" | 登录已过期 | 关闭弹窗,重新登录 | + +--- + +> 📅 文档版本: v1.0 +> 📝 生成日期: 2026-05-18 +> 👤 适用岗位: 生产操作工 / 质检员 / 班组长 / 车间主管 / 生产调度员 diff --git a/MES_程序使用说明书.md b/MES_程序使用说明书.md new file mode 100644 index 0000000..c462ba6 --- /dev/null +++ b/MES_程序使用说明书.md @@ -0,0 +1,713 @@ +# MES 工业互联网平台 — 程序使用说明书 + +> **项目名称**: MacroinfManage_MES (MES_Manage_View_V20) +> **版本**: v1.1.0 +> **适用对象**: 系统管理员、开发工程师、运维人员 +> **日期**: 2026-05-18 + +--- + +## 目录 + +- [一、系统概述](#一系统概述) +- [二、环境要求与安装部署](#二环境要求与安装部署) +- [三、项目目录结构](#三项目目录结构) +- [四、配置文件说明](#四配置文件说明) +- [五、系统启动与运行](#五系统启动与运行) +- [六、功能模块操作指南](#六功能模块操作指南) +- [七、数据库维护](#七数据库维护) +- [八、常见问题与故障排除](#八常见问题与故障排除) +- [九、附录](#九附录) + +--- + +## 一、系统概述 + +### 1.1 系统简介 + +MES工业互联网平台是一套面向制造企业的生产执行管理系统,覆盖从ERP订单接收、生产排产、车间加工执行、质量检验、工时核算到设备监控的全流程管理。 + +### 1.2 技术架构一览 + +| 层级 | 技术 | 说明 | +|------|------|------| +| 前端框架 | Vue 2.7 + Element UI 2.15 | SPA单页应用 | +| 构建工具 | Webpack 5.89 | 模块打包/开发服务器 | +| 后端服务 | ASP.NET (IIS) | 通用处理程序 `MESCommonBase.ashx` | +| 数据库 | SQL Server 2019 | 数据库名 `YL_MESDB` | +| 外部集成 | SAP Business One | ERP数据同步 | +| 设备通信 | MQTT 4.3.7 | 设备实时数据采集 | + +### 1.3 系统访问地址 + +| 环境 | 地址 | 端口 | +|------|------|:---:| +| 开发环境 | `https://127.0.0.1` | 1997 | +| 生产服务器 | `https://192.168.2.92` | 10101 | + +--- + +## 二、环境要求与安装部署 + +### 2.1 硬件要求 + +| 组件 | 最低配置 | 推荐配置 | +|------|------|------| +| CPU | 4核心 | 8核心+ | +| 内存 | 8 GB | 16 GB+ | +| 磁盘 | 50 GB可用 | 200 GB SSD | +| 网络 | 千兆局域网 | 千兆局域网 | + +### 2.2 软件依赖 + +| 软件 | 版本要求 | 用途 | +|------|------|------| +| **Node.js** | >= 20.0.0 | 前端开发运行环境 | +| **npm** | >= 9.0.0 | 包管理器 | +| **Git Bash** | 最新版 | Windows下命令行工具(必须安装) | +| **SQL Server** | 2019+ | 数据库服务器 | +| **IIS** | 7.0+ | Web服务器(部署后端) | +| **Chrome/Edge** | 最新版 | 推荐浏览器 | + +### 2.3 安装步骤 + +#### 步骤1:安装 Node.js + +```bash +# 下载并安装 Node.js 20.x LTS +# https://nodejs.org/ + +# 验证安装 +node --version # 应显示 v20.x.x +npm --version # 应显示 9.x.x 或更高 +``` + +#### 步骤2:安装 Git Bash (Windows) + +```bash +# 下载 Git for Windows +# https://git-scm.com/download/win + +# 安装时选择 "Git Bash Here" 组件 +# 确保 C:\Program Files\Git\bin 已添加到系统 PATH +``` + +#### 步骤3:安装项目依赖 + +```bash +# 进入项目目录 +cd "c:\Users\meswork764\Desktop\元利\MacroinfManage_MES\MES_Manage_View_V20" + +# 安装所有npm依赖 +npm install + +# 如果遇到网络问题,可先配置镜像源 +npm config set registry https://registry.npmmirror.com +npm install +``` + +#### 步骤4:初始化数据库 + +```sql +-- 1. 在SQL Server Management Studio中打开 script.sql +-- 2. 修改文件路径以匹配实际环境: +-- 数据文件路径: D:\sqlData\YL_MESDB.mdf +-- 日志文件路径: D:\sqlDataLog\YL_MESDB_log.ldf + +-- 3. 执行脚本创建数据库和所有对象 +-- 4. 验证数据库创建成功 +USE [YL_MESDB]; +SELECT COUNT(*) AS '表数量' FROM sys.tables; +SELECT COUNT(*) AS '存储过程数量' FROM sys.procedures; +``` + +#### 步骤5:配置后端服务 + +1. 在IIS中创建应用程序池和站点 +2. 指向后端发布目录 +3. 确保 `MESCommonBase.ashx` 和 `MESUploadFile.ashx` 可访问 +4. 配置数据库连接字符串 + +--- + +## 三、项目目录结构 + +``` +MES_Manage_View_V20/ +│ +├── index.html # HTML入口 (加载config.js) +├── package.json # 项目配置与依赖声明 +├── babel.config.js # Babel转译配置 +├── .eslintrc.js # ESLint代码规范 +│ +├── static/ # 静态资源目录 +│ ├── config.js # ⭐ 运行环境配置(服务器地址等) +│ └── jsQR.js # 二维码解析库 +│ +├── config/ # 构建配置 +│ ├── index.js # ⭐ Webpack + 开发服务器配置 +│ ├── dev.env.js # 开发环境变量 +│ └── prod.env.js # 生产环境变量 +│ +├── build/ # Webpack构建脚本 +│ ├── webpack.base.conf.js # 公共配置 +│ ├── webpack.dev.conf.js # 开发环境配置 +│ ├── webpack.prod.conf.js # 生产环境配置 +│ ├── vue-loader.conf.js # Vue Loader配置 +│ └── utils.js # 构建工具函数 +│ +├── src/ # 源代码目录 +│ ├── main.js # ⭐ 应用入口 +│ ├── App.vue # 根组件 +│ ├── permission.js # ⭐ 路由守卫/权限控制 +│ │ +│ ├── api/ # API接口层 +│ │ └── login.js # 登录相关API +│ │ +│ ├── router/ # 路由配置 +│ │ ├── index.js # 路由主配置 +│ │ ├── getTreeData.js # 动态菜单树生成 +│ │ └── menuComponentModule.js # 组件懒加载 +│ │ +│ ├── store/ # Vuex状态管理 +│ │ ├── index.js # Store入口 +│ │ └── modules/ # 状态模块 +│ │ ├── app.js # 应用状态 +│ │ ├── user.js # ⭐ 用户状态(登录/权限) +│ │ ├── login.js # 登录时间追踪 +│ │ ├── permission.js # 权限路由 +│ │ └── tagsView.js # 标签页 +│ │ +│ ├── views/ # ⭐ 业务页面组件 +│ │ ├── layout/ # 布局(侧边栏/顶栏/标签页) +│ │ ├── login/ # 登录页 +│ │ ├── dashboard/ # 首页看板 +│ │ └── [业务模块]/ # 各MES业务模块页面 +│ │ +│ ├── components/ # 公用组件 +│ ├── utils/ # 工具函数 +│ │ ├── auth.js # Token/Cookie管理 +│ │ ├── request.js # ⭐ Axios实例配置 +│ │ └── curd.js # ⭐ 通用CRUD封装 +│ │ +│ ├── styles/ # 全局样式 +│ ├── icons/ # SVG图标 +│ ├── directive/ # 自定义指令 +│ └── vendor/ # 第三方工具 +│ +├── script.sql # ⭐ 数据库完整脚本 +├── dist/ # 构建输出目录 (npm run build 后生成) +└── *.md # 项目文档 +``` + +--- + +## 四、配置文件说明 + +### 4.1 运行环境配置 `static/config.js` + +这是最重要的配置文件,控制前端连接的后端服务器地址。部署时需要修改此文件: + +```javascript +window.dt_Config = { + // ⭐ 后端API地址 (存储过程调用) + serverAddress: 'https://192.168.2.92:10101/submit/MESCommonBase.ashx', + + // ⭐ 后端基础URL + baseURL: 'https://192.168.2.92:10101', + + // SAP Business One Service Layer 地址 + baseURLB1: 'https://192.168.2.92:9996/b1s', + + // 其他API地址 + baseURLtm: 'https://192.168.2.92:9996/openapi', + + // 首页路由配置 + constantRouter: { + path: '主页', + title: '主页', + meta: { title: '主页', icon: 'MaterialManagement' }, + alwaysShow: true + } +} +``` + +**环境切换说明**: +```javascript +// 生产环境 (服务器) +serverAddress: 'https://192.168.2.92:10101/submit/MESCommonBase.ashx' + +// 备用服务器 +// serverAddress: 'https://192.168.2.228:10101/submit/MESCommonBase.ashx' + +// 本地开发环境 +// serverAddress: 'http://127.0.0.1:10101/submit/MESCommonBase.ashx' +``` + +### 4.2 开发服务器配置 `config/index.js` + +```javascript +dev: { + host: '127.0.0.1', // 开发服务器地址 + port: 1997, // ⭐ 开发服务器端口 (如被占用自动+1) + autoOpenBrowser: true, // 启动时自动打开浏览器 + proxyTable: { // API代理配置 + '/api/b1s': { + target: 'https://192.168.2.90:50000', // SAP B1 地址 + changeOrigin: true, + secure: false + } + } +} +``` + +### 4.3 构建输出配置 + +```javascript +build: { + assetsRoot: 'dist', // 构建输出目录 + assetsSubDirectory: 'static', + assetsPublicPath: '/', // ⭐ 部署路径 (如非根路径需修改) + productionSourceMap: false // 生产环境是否生成source map +} +``` + +--- + +## 五、系统启动与运行 + +### 5.1 开发模式启动 + +```bash +# 进入项目根目录 +cd "c:\Users\meswork764\Desktop\元利\MacroinfManage_MES\MES_Manage_View_V20" + +# 方式1:npm脚本 +npm run dev + +# 方式2:直接使用webpack +npm start + +# 启动成功后控制台输出: +# Your application is running here: http://127.0.0.1:1997 +``` + +### 5.2 生产构建 + +```bash +# 构建生产版本 +npm run build + +# 构建产物在 dist/ 目录下 +# 将 dist/ 目录内容部署到IIS站点即可 + +# 可选:构建并分析包体积 +npm run build --report +``` + +### 5.3 访问系统 + +1. 打开浏览器访问 `http://127.0.0.1:1997` (开发) 或生产地址 +2. 输入工号和密码登录 +3. 如有多个角色,选择登录角色 +4. 进入系统首页看板 + +--- + +## 六、功能模块操作指南 + +### 6.1 用户登录 + +| 步骤 | 操作 | 说明 | +|:---:|------|------| +| 1 | 打开系统地址 | 进入登录页面 | +| 2 | 输入用户名/密码 | 单击"登录"按钮 | +| 3 | 选择角色 | 如有多角色,弹出角色选择框;单一角色直接进入 | +| 4 | 进入首页 | 显示有权限的功能模块入口 | + +**记住密码**: 勾选"记住账号",下次自动填充用户名和密码(Cookie存储7天)。 + +**修改密码**: 点击"修改密码"→ 输入工号/原密码/新密码/确认密码 → 确定。 + +### 6.2 首页看板 + +进入系统后显示**九宫格功能入口**,按一级菜单分组展示有权限的功能模块。点击模块图标进入对应功能页面。 + +### 6.3 生产排产管理 + +**功能入口**: 首页 → 生产排产 + +#### 6.3.1 查询待排产任务 + +| 步骤 | 操作 | +|:---:|------| +| 1 | 进入"排产任务查询"页面 | +| 2 | 选择查询条件(订单号/合同号/物料/工序/时间范围/排产状态/工位) | +| 3 | 点击"查询"按钮 | +| 4 | 查看任务列表(含计划数量/指派对象/任务状态等) | + +#### 6.3.2 单任务排产指派 + +| 步骤 | 操作 | +|:---:|------| +| 1 | 在任务列表中选中一条任务 | +| 2 | 点击"排产"或"指派" | +| 3 | 选择/输入工位、指派数量、计划开始/完成时间 | +| 4 | 填写派工特殊说明(可选) | +| 5 | 点击"保存" | + +> ⚠️ **注意事项**: 指派数量**小于**计划数量时,系统自动拆分剩余数量为新任务;**大于**计划数量时会报错。 + +#### 6.3.3 批量排产确认 + +选中多条任务 → 点击"批量排产" → 确认执行。 + +### 6.4 加工中心(生产执行) + +**功能入口**: 首页 → 加工中心 + +#### 6.4.1 查看任务列表 + +进入后显示分配给当前工位的任务列表: +- **待执行**(任务状态=0): 已排产但未收料 +- **可执行**(任务状态=1): 已收料可开工 +- **已开工**(任务状态=2): 正在生产中 +- **已完成**(任务状态=4): 报工完成 + +#### 6.4.2 标准生产流程 + +``` +收料 → 可执行 → 开始加工 → [暂停/恢复] → 报工 → 完成 +``` + +| 步骤 | 按钮 | 说明 | +|:---:|------|------| +| 1 | **收料** | 输入收料数量 → 确认。任务变为"可执行" | +| 2 | **开始加工** | 点击后任务变为"已开工",开始计时 | +| 3 | **暂停** | 生产中断时点击,记录暂停开始时间 | +| 4 | **恢复(开始加工)** | 从暂停恢复,自动计算暂停时长 | +| 5 | **报工** | 输入本次完成数量 → 选择班次 → 确认 | + +#### 6.4.3 报工界面说明 + +| 字段 | 说明 | +|------|------| +| 报工日期 | 自动取当前日期 | +| 报工班次 | 白班(07:45-16:30) / 夜班(16:30-00:40) | +| 报工数量 | 本次完成的合格品数量 | +| 报工说明 | 备注信息 | +| 是否加班 | 如报工时间超过班次时间需勾选 | +| 加班人员 | 逗号分隔多个加班人员姓名 | +| 特殊加班人员 | 非标准工时(如4小时班)的特殊人员 | + +> ⚠️ **休息日注意事项**: 休息日/法定休息日选择"加班"会计算加班工时,选择"不加班"记为普通工时。 + +#### 6.4.4 辅助工序操作 + +辅助工序(上下料、清理等)使用独立流程:**辅助开始 → 辅助结束**。操作方式同上。 + +### 6.5 质量管理 + +**功能入口**: 首页 → 质量管理 + +#### 6.5.1 质检类型说明 + +| 类型 | 时机 | 操作人 | +|------|------|------| +| **首检** | 每道工序开始生产时首批零件 | 操作工自检/质检员 | +| **巡检** | 生产过程中定期抽检 | 质检员 | +| **序检** | 工序加工完成后 | 质检员 | +| **收检** | 跨工序交接时 | 接收工序操作工 | +| **终检** | 全部工序完成后最终检验 | 质检员 | + +#### 6.5.2 执行收检操作 + +| 步骤 | 操作 | +|:---:|------| +| 1 | 进入质检任务列表,筛选"收检"类型 | +| 2 | 选中任务,点击"收检" | +| 3 | 输入检验数量、合格数、不合格数 | +| 4 | 填写检测说明 | +| 5 | 点击"保存" | +| 6 | 系统自动判断:合格数>0则下一工序变为"可执行" | + +#### 6.5.3 终检操作 + +| 步骤 | 操作 | +|:---:|------| +| 1 | 进入质检任务列表 | +| 2 | 选中任务,点击"终检" | +| 3 | 输入检测数量、合格数、不合格数、放行数量 | +| 4 | 点击"保存" | + +#### 6.5.4 不合格品处理流程 + +``` +发现不合格品 → 发起处理流程 → 填写申请内容/让步放行数量 + → 选择接收人 → 提交 + → 审批人填写处理意见 → 完成节点 + → 结束处理流程 +``` + +#### 6.5.5 检测数据录入(逐项检测) + +| 步骤 | 操作 | +|:---:|------| +| 1 | 进入质检任务,点击"检测数据" | +| 2 | 选择检测零件编号 | +| 3 | 逐项录入实测值(系统自动对比上下限判定合格/不合格) | +| 4 | 完成所有检测项目后保存 | +| 5 | 系统自动聚合统计合格数/不合格数 | + +### 6.6 工时管理与校验 + +**功能入口**: 首页 → 工时管理 + +| 功能 | 说明 | +|------|------| +| **报工记录查询** | 按日期/工位/人员/确认状态筛选报工记录 | +| **报工确认** | 管理员核对报工数据,填入确认工时和说明 | +| **工时汇总** | 按TaskAID/工序汇总生产工时 | +| **装配工时记录** | 管理装配人员的开始/结束时间记录 | + +### 6.7 设备管理 + +**功能入口**: 首页 → 设备管理 + +| 功能 | 操作 | +|------|------| +| **设备台账** | 增删改查设备基本信息(编号/名称/型号/制造商/车间/责任人) | +| **维修记录** | 记录故障描述/故障时间/维修人员/完成时间 | +| **生产状态** | 查看当前和历史设备生产状态 | +| **设备点检** | 维护设备点检表(保养人员/监督人员/点检类型) | + +### 6.8 工艺管理 + +**功能入口**: 首页 → 工艺管理 + +| 功能 | 操作 | +|------|------| +| **工序基础数据** | 维护工序名称和编号(增删改查) | +| **标准工艺绑定** | 将工序按顺序绑定到物料编号 | +| **工艺查询** | 按物料编号查看完整工艺路线 | +| **物料查询** | 从SAP查询物料编码和名称 | + +### 6.9 图纸管理 + +**功能入口**: 首页 → 图纸管理 + +| 功能 | 操作 | +|------|------| +| **上传图纸** | 选择物料 → 上传PDF/图片文件 | +| **在线预览** | 点击图纸名称在线查看(PDF.js预览) | +| **删除图纸** | 删除图纸(记录到删除日志) | + +### 6.10 数据字典 + +**功能入口**: 系统管理 → 数据字典 + +维护系统全局配置项: + +| 数据类别 | 词条示例 | +|------|------| +| 生产操作 | 收料(1), 开始加工(4), 暂停(5), 报工(6), 首检(7) | +| 班次 | 白班, 夜班 | +| 报工确认 | 已确认, 未确认 | +| 质检类型 | 首检自检, 序检自检, 收检, 终检 | + +### 6.11 实时监控看板 + +**功能入口**: 首页 → 生产监控 + +| 功能 | 说明 | +|------|------| +| **当前生产状态** | 显示机加和装配的当前加工中任务(含人员/工位/零件) | +| **设备变量看板** | 实时显示设备运行参数(电流/电压/功率等) | +| **报警记录** | 查看历史报警和当前活跃报警 | + +--- + +## 七、数据库维护 + +### 7.1 数据库备份 + +```sql +-- 执行全量备份存储过程 +EXEC [dbo].[___DB_BAK] + +-- 备份文件位置:C:\_MW\数据库\YL_MESDB_yyyy_MM_dd__HH_mm_ss_fff.bak +``` + +**建议**: 每日定时执行全量备份 + 每小时事务日志备份。 + +### 7.2 日志文件管理 + +```sql +-- 查看日志文件大小 +EXEC sp_helpdb 'YL_MESDB' + +-- 收缩日志文件(谨慎操作) +USE [YL_MESDB] +DBCC SHRINKFILE (N'YL_MESDB_log', 10240) -- 收缩到10GB +``` + +### 7.3 重置排产数据 + +```sql +-- 重置指定订单的排产数据(保留操作记录) +EXEC [dbo].[__Reset_ProductOrder] @订单编号=10001, @optType=0 + +-- ⚠️ 重置全部数据并清空操作记录(危险操作!) +EXEC [dbo].[__Reset_ProductOrder] @订单编号=-1, @optType=1 +``` + +> ⚠️ **警告**: `@optType=1` 会 **TRUNCATE** 操作记录表和报工记录表,数据不可恢复! + +### 7.4 数据库结构更新 + +修改 `script.sql` 后重新执行或使用增量脚本: + +```sql +-- 逐步执行新增/修改部分(跳过已存在的对象) +-- 注意:script.sql 中的 CREATE 语句需要改为 ALTER 或先 DROP 再 CREATE +``` + +--- + +## 八、常见问题与故障排除 + +### 8.1 安装与启动问题 + +| 问题 | 原因 | 解决方法 | +|------|------|------| +| `npm install` 失败 | 网络问题或node版本过低 | 1. 切换镜像源 `npm config set registry https://registry.npmmirror.com` 2. 确认 Node >= 20.0.0 | +| `npm run dev` 报错 | 依赖未安装或端口被占用 | 1. 重新执行 `npm install` 2. 修改 `config/index.js` 中端口 | +| 浏览器显示"无法访问" | dev server使用HTTPS但无证书 | Chrome地址栏输入 `thisisunsafe` 跳过警告,或修改 `webpack.dev.conf.js` 中 `https: false` | +| `module not found` 错误 | Webpack 5 fallback配置缺失 | 检查 `webpack.base.conf.js` 中 `resolve.fallback` 配置 | + +### 8.2 登录问题 + +| 问题 | 原因 | 解决方法 | +|------|------|------| +| 登录提示"账号或密码错误" | 凭证错误或后端不可达 | 1. 检查用户名密码 2. 确认 `static/config.js` 中 serverAddress 正确 | +| 登录后页面空白 | Token过期或权限数据异常 | 清除浏览器Cookie后重新登录 | +| 忘记密码 | - | 联系管理员重置,当前版本不支持自助找回密码 | + +### 8.3 功能操作问题 + +| 问题 | 原因 | 解决方法 | +|------|------|------| +| 点"开始加工"无反应 | 任务状态不是"可执行" | 先执行"收料"操作,使任务变为可执行状态 | +| 报工数量超过计划数 | 累计完成+不合格数超过指派数 | 减少本次报工数量,或先处理不合格品 | +| 质检合格后下序仍不可执行 | 拆分内码不匹配或任务状态未更新 | 检查 `MES_接口_生产计划_生产任务` 表数据 | +| 修改密码失败 | 验证器Bug(known issue) | 联系管理员在数据库中直接修改密码 | + +### 8.4 数据库问题 + +| 问题 | 原因 | 解决方法 | +|------|------|------| +| 查询越来越慢 | 缺少索引或统计信息过期 | 更新统计信息: `EXEC sp_updatestats` | +| 日志文件过大 | FULL恢复模式无日志备份 | 1. 切换为SIMPLE模式 2. 或配置日志备份作业 | +| 外键约束错误 | 数据不一致 | 检查 `FK_MES_接口_生产计划_生产任务_MES_接口_生产计划` 等外键 | + +### 8.5 浏览器兼容性 + +| 浏览器 | 支持情况 | +|------|:---:| +| Chrome 90+ | ✅ 推荐 | +| Edge 90+ | ✅ 推荐 | +| Firefox 90+ | ✅ 兼容 | +| Safari 14+ | ⚠️ 部分兼容 | +| IE 11 | ❌ 不支持 (browserslist 已排除) | + +--- + +## 九、附录 + +### 9.1 状态码参考 + +**任务状态**: +| 状态码 | 含义 | 说明 | +|:---:|------|------| +| 0 | 待执行 | 已排产但未收料 | +| 1 | 可执行 | 已收料可开工 | +| 2 | 已开工 | 正在加工中 | +| 4 | 已完成 | 报工完成或终检完成 | + +**加工状态**: +| 状态码 | 含义 | +|:---:|------| +| 2 | 辅助开始 | +| 3 | 辅助结束 | +| 4 | 开始加工 | +| 5 | 暂停 | +| 6 | 报工 | + +**设备状态**: +| 状态码 | 含义 | +|:---:|------| +| -1 | 关机 | +| 0 | 待机 | +| 1 | 工作 | +| 2 | 报警 | +| 3 | 暂停 | + +**质检结果**: +| 值 | 含义 | +|:---:|------| +| 1 | 合格 | +| 0 | 不合格 | + +### 9.2 API通信协议 + +前端与后端通信采用统一的JSON格式: + +```javascript +// 请求格式 +{ + "type": "1", // 1=查询, 2=增删改, 7=批量JSON + "name": "存储过程名称", + "param": "[{\"name\":\"参数名\",\"value\":\"参数值\",\"type\":\"string\",\"output\":\"0\"}]", + "pageSize": 20, // 分页大小(可选) + "pageList": 1, // 页码(可选) + "UserID": "当前用户ID", + "UserName": "当前用户名", + "ModularID": "当前路由path" +} + +// 响应格式 +{ + "data": [ ... ], // 查询结果数组 + "total": 100, // 总记录数 + "result": "1" // 1=成功, 0=失败 +} +``` + +### 9.3 快捷键 + +| 快捷键 | 功能 | +|------|------| +| `Enter` | 登录页面提交登录 | +| `Ctrl + F5` | 强制刷新页面 | + +### 9.4 日志查看 + +| 日志类型 | 位置 | +|------|------| +| 用户操作日志 | 数据库表 `_日志` | +| API请求日志 | 数据库表 `记录_日志_项目运行日志` | +| 浏览器控制台 | F12 → Console | +| 开发服务器日志 | 终端控制台输出 | + +### 9.5 联系与支持 + +- **项目维护**: MESWORK +- **数据库文档**: 见 `script.sql` (完整DDL) +- **技术分析**: 见 `MES_技术分析报告.md` +- **功能映射**: 见 `MES_功能列表_页面_存储过程映射.md` + +--- + +> 📅 文档生成日期: 2026-05-18 +> 📝 版本: v1.0 +> 🔄 最后更新: 2026-05-18 diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..c2a6462 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,19 @@ +module.exports = { + presets: [ + [ + '@babel/preset-env', + { + modules: false, + targets: { + browsers: ['> 1%', 'last 2 versions', 'not ie <= 8'] + }, + useBuiltIns: 'usage', + corejs: 3 + } + ] + ], + plugins: [ + 'babel-plugin-transform-vue-jsx', + '@babel/plugin-transform-runtime' + ] +} diff --git a/build/build.js b/build/build.js new file mode 100644 index 0000000..4c7b243 --- /dev/null +++ b/build/build.js @@ -0,0 +1,44 @@ +require('./check-versions')() + +process.env.NODE_ENV = 'production' + +const ora = require('ora') +const rm = require('rimraf') +const path = require('path') +const chalk = require('chalk') +const webpack = require('webpack') +const config = require('../config') +const webpackConfig = require('./webpack.prod.conf') + +const spinner = ora('building for production...') +spinner.start() + +rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { + if (err) throw err + webpack(webpackConfig, (err, stats) => { + spinner.stop() + if (err) throw err + process.stdout.write( + stats.toString({ + colors: true, + modules: false, + children: false, + chunks: false, + chunkModules: false + }) + '\n\n' + ) + + if (stats.hasErrors()) { + console.log(chalk.red(' Build failed with errors.\n')) + process.exit(1) + } + + console.log(chalk.cyan(' Build complete.\n')) + console.log( + chalk.yellow( + ' Tip: built files are meant to be served over an HTTP server.\n' + + " Opening index.html over file:// won't work.\n" + ) + ) + }) +}) diff --git a/build/check-versions.js b/build/check-versions.js new file mode 100644 index 0000000..edb3389 --- /dev/null +++ b/build/check-versions.js @@ -0,0 +1,63 @@ +const chalk = require('chalk') +const semver = require('semver') +const packageConfig = require('../package.json') +const shell = require('shelljs') + +function exec(cmd) { + return require('child_process') + .execSync(cmd) + .toString() + .trim() +} + +const versionRequirements = [ + { + name: 'node', + currentVersion: semver.clean(process.version), + versionRequirement: packageConfig.engines.node + } +] + +// if (shell.which('npm')) { +// versionRequirements.push({ +// name: 'npm', +// currentVersion: exec('npm --version'), +// versionRequirement: packageConfig.engines.npm +// }) +// } + +module.exports = function() { + const warnings = [] + + for (let i = 0; i < versionRequirements.length; i++) { + const mod = versionRequirements[i] + + if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { + warnings.push( + mod.name + + ': ' + + chalk.red(mod.currentVersion) + + ' should be ' + + chalk.green(mod.versionRequirement) + ) + } + } + + if (warnings.length) { + console.log('') + console.log( + chalk.yellow( + 'To use this template, you must update following to modules:' + ) + ) + console.log() + + for (let i = 0; i < warnings.length; i++) { + const warning = warnings[i] + console.log(' ' + warning) + } + + console.log() + process.exit(1) + } +} diff --git a/build/logo.png b/build/logo.png new file mode 100644 index 0000000..f3d2503 Binary files /dev/null and b/build/logo.png differ diff --git a/build/utils.js b/build/utils.js new file mode 100644 index 0000000..ed48f11 --- /dev/null +++ b/build/utils.js @@ -0,0 +1,99 @@ +const path = require('path') +const config = require('../config') +const MiniCssExtractPlugin = require('mini-css-extract-plugin') + + +const packageConfig = require('../package.json') +exports.assetsPath = function(_path) { + const assetsSubDirectory = + process.env.NODE_ENV === 'production' + ? config.build.assetsSubDirectory + : config.dev.assetsSubDirectory + + return path.posix.join(assetsSubDirectory, _path) +} +exports.cssLoaders = function (options) { + options = options || {} + + const cssLoader = { + loader: 'css-loader', + options: { + sourceMap: options.sourceMap, + importLoaders: 2 // 确保 postcss 和 sass 加载器正常工作 + } + } + + const postcssLoader = { + loader: 'postcss-loader', + options: { + sourceMap: options.sourceMap, + postcssOptions: { + plugins: [ + require('autoprefixer')() + ] + } + } + } + + function generateLoaders(loader, loaderOptions) { + const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] + + if (loader) { + loaders.push({ + loader: loader + '-loader', + options: Object.assign({}, loaderOptions, { + sourceMap: options.sourceMap + }) + }) + } + + if (options.extract) { + return [MiniCssExtractPlugin.loader].concat(loaders) + } else { + return ['vue-style-loader'].concat(loaders) + } + } + + return { + css: generateLoaders(), + postcss: generateLoaders(), + less: generateLoaders('less'), + sass: generateLoaders('sass', { indentedSyntax: true }), + scss: generateLoaders('sass'), + stylus: generateLoaders('stylus'), + styl: generateLoaders('stylus') + } +} +// Generate loaders for standalone style files (outside of .vue) +exports.styleLoaders = function (options) { + const output = [] + const loaders = exports.cssLoaders(options) + + for (const extension in loaders) { + const loader = loaders[extension] + output.push({ + test: new RegExp('\\.' + extension + '$'), + use: loader + }) + } + + return output +} + +exports.createNotifierCallback = () => { + const notifier = require('node-notifier') + + return (severity, errors) => { + if (severity !== 'error') return + + const error = errors[0] + const filename = error.file && error.file.split('!').pop() + + notifier.notify({ + title: packageConfig.name, + message: severity + ': ' + error.name, + subtitle: filename || '', + icon: path.join(__dirname, 'logo.png') + }) + } +} diff --git a/build/vue-loader.conf.js b/build/vue-loader.conf.js new file mode 100644 index 0000000..5c52ac0 --- /dev/null +++ b/build/vue-loader.conf.js @@ -0,0 +1,3 @@ +module.exports = { + //You can set the vue-loader configuration by yourself. +} diff --git a/build/webpack.base.conf.js b/build/webpack.base.conf.js new file mode 100644 index 0000000..29f47f4 --- /dev/null +++ b/build/webpack.base.conf.js @@ -0,0 +1,187 @@ +'use strict' +const path = require('path') +const utils = require('./utils') +const config = require('../config') +const webpack = require('webpack') +const { VueLoaderPlugin } = require('vue-loader') +const vueLoaderConfig = require('./vue-loader.conf') +const { loader} = require('mini-css-extract-plugin') +const ESLintPlugin = require('eslint-webpack-plugin'); + +function resolve(dir) { + return path.join(__dirname, '..', dir) +} + +module.exports = { + context: path.resolve(__dirname, '../'), + entry: { + app: './src/main.js' + }, + output: { + path: config.build.assetsRoot, + filename: '[name].js', + publicPath: process.env.NODE_ENV === 'production' + ? config.build.assetsPublicPath + : config.dev.assetsPublicPath, + clean: true // 替代 CleanWebpackPlugin + }, + resolve: { + extensions: ['.js', '.vue', '.json'], + alias: { + '@': resolve('src'), + 'vue$': 'vue/dist/vue.esm.js' + }, + fallback: { + "process": require.resolve("process/browser.js"), + "path": require.resolve("path-browserify"), + "crypto": require.resolve("crypto-browserify"), + "stream": require.resolve("stream-browserify"), + "buffer": require.resolve("buffer"), + "util": require.resolve("util"), + "fs": false, + "tls": false, + "net": false, + "http": false, + "https": false, + "zlib": false + } + }, + module: { + rules: [ + { + test: /\.vue$/, + loader: 'vue-loader', + options: vueLoaderConfig + }, + { + test: /\.js$/, + loader: 'babel-loader', + exclude: /node_modules/, + include: [ + resolve('src'), + resolve('test'), + resolve('node_modules/webpack-dev-server/client') + ] + }, + { + test: /\.svg$/, + loader: 'svg-sprite-loader', + include: [resolve('src/icons')], + options: { + symbolId: 'icon-[name]' + } + }, + { + test: /\.(png|jpe?g|gif|webp)(\?.*)?$/, + type: 'asset', + parser: { + dataUrlCondition: { + maxSize: 10 * 1024 // 10kb + } + }, + generator: { + filename: utils.assetsPath('img/[name].[hash:8][ext]') + }, + exclude: [resolve('src/icons')] + }, + { + test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, + type: 'asset', + parser: { + dataUrlCondition: { + maxSize: 10 * 1024 + } + }, + generator: { + filename: utils.assetsPath('media/[name].[hash:8][ext]') + } + }, + { + test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, + type: 'asset', + parser: { + dataUrlCondition: { + maxSize: 10 * 1024 + } + }, + generator: { + filename: utils.assetsPath('fonts/[name].[hash:8][ext]') + } + }, + // 添加 CSS 文件处理规则 + { + test: /\.css$/, + use: [ + process.env.NODE_ENV === 'production' + ? loader + : 'vue-style-loader', + 'css-loader' + ], + include: /node_modules/ // 专门处理 node_modules 中的 CSS + }, + { + test: /\.css$/, + use: [ + process.env.NODE_ENV === 'production' + ? loader + : 'vue-style-loader', + 'css-loader' + ], + exclude: /node_modules/ // 处理项目中的 CSS + }, + // SCSS 规则 + { + test: /\.scss$/, + use: [ + process.env.NODE_ENV === 'production' + ? loader + : 'vue-style-loader', + 'css-loader', + { + loader: 'sass-loader', + options: { + // 使用现代 API + api: 'modern', + // 或者使用兼容模式 + // api: 'legacy', + sassOptions: { + // 其他 Sass 选项 + } + } + } + ] + }, + { + test: /\.sass$/, + use: [ + process.env.NODE_ENV === 'production' + ? loader + : 'vue-style-loader', + 'css-loader', + { + loader: 'sass-loader', + options: { + sassOptions: { + indentedSyntax: true + } + } + } + ] + } + ] + }, + plugins: [ + new VueLoaderPlugin(), + new webpack.ProvidePlugin({ + process: 'process/browser.js', + Buffer: ['buffer', 'Buffer'] + }), + // new ESLintPlugin({ + // extensions: ['js', 'vue'], + // exclude: 'node_modules', + // fix: false, // 可选:自动修复 + // emitWarning: false, // 显示警告 + // failOnError: false // 错误时不停止构建 + // }) + ] +} diff --git a/build/webpack.dev.conf.js b/build/webpack.dev.conf.js new file mode 100644 index 0000000..de16629 --- /dev/null +++ b/build/webpack.dev.conf.js @@ -0,0 +1,107 @@ +'use strict' +const path = require('path') +const utils = require('./utils') +const webpack = require('webpack') +const config = require('../config') +const { merge } = require('webpack-merge') +const baseWebpackConfig = require('./webpack.base.conf') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const ESLintPlugin = require('eslint-webpack-plugin') +const portfinder = require('portfinder') +const CopyWebpackPlugin = require('copy-webpack-plugin') +function resolve(dir) { + return path.join(__dirname, '..', dir) +} + + +const devWebpackConfig = merge(baseWebpackConfig, { + mode: 'development', + stats: 'errors-warnings', + infrastructureLogging: { + level: 'warn' + }, + devtool: 'eval-cheap-module-source-map', + cache: { + type: 'filesystem', + buildDependencies: { + config: [__filename] + } + }, + devServer: { + https: true, + historyApiFallback: true, + hot: true, + compress: true, + host: process.env.HOST || config.dev.host, + port: process.env.PORT || config.dev.port, + open: config.dev.autoOpenBrowser, + static: { + publicPath: config.dev.assetsPublicPath, + watch: true + }, + client: { + logging: 'warn', + overlay: config.dev.errorOverlay ? { errors: true, warnings: false } : false + }, + proxy: config.dev.proxyTable + }, + plugins: [ + new webpack.ProgressPlugin({ + activeModules: true, // 设置为 true 会显示当前正在处理的模块,但可能会影响性能 + entries: true, // 显示条目计数 + handler: (percentage, message, ...args) => { + // 一个简单的自定义处理函数,输出到控制台 + console.log(`构建进度: ${(percentage * 100).toFixed(2)}% ${message}`); + } + }), + new webpack.DefinePlugin({ + 'process.env': require('../config/dev.env') + }), + new webpack.HotModuleReplacementPlugin(), + new CopyWebpackPlugin({ + patterns: [ + { + from: path.resolve(__dirname, '../static'), + to: config.build.assetsSubDirectory, + globOptions: { + ignore: ['.*'] + } + } + ] + }), + new HtmlWebpackPlugin({ + filename: 'index.html', + template: 'index.html', + inject: true, + favicon: resolve('favicon.ico'), + title: '数据分析处理平台', + BASE_URL: 'static' + }), + ...(config.dev.useEslint ? [new ESLintPlugin({ + extensions: ['js', 'vue'], + formatter: require('eslint-friendly-formatter'), + emitWarning: !config.dev.showEslintErrorsInOverlay + })] : []) + ], + optimization: { + removeAvailableModules: false, + removeEmptyChunks: false, + splitChunks: false, + minimize: false + } +}) + +module.exports = new Promise((resolve, reject) => { + portfinder.basePort = process.env.PORT || config.dev.port + portfinder.getPort((err, port) => { + if (err) { + reject(err) + } else { + devWebpackConfig.devServer.port = port + process.env.PORT = port + + console.log(`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`) + resolve(devWebpackConfig) + } + }) +}) diff --git a/build/webpack.prod.conf.js b/build/webpack.prod.conf.js new file mode 100644 index 0000000..8bec0e1 --- /dev/null +++ b/build/webpack.prod.conf.js @@ -0,0 +1,133 @@ +'use strict' +const path = require('path') +const utils = require('./utils') + +const webpack = require('webpack') +const config = require('../config') +const { merge } = require('webpack-merge') +const baseWebpackConfig = require('./webpack.base.conf') +const CopyWebpackPlugin = require('copy-webpack-plugin') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const MiniCssExtractPlugin = require('mini-css-extract-plugin') +const CssMinimizerPlugin = require('css-minimizer-webpack-plugin') +const TerserPlugin = require('terser-webpack-plugin') +const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer') + +function resolve(dir) { + return path.join(__dirname, '..', dir) +} + +const env = require('../config/prod.env') + +const webpackConfig = merge(baseWebpackConfig, { + mode: 'production', + devtool: config.build.productionSourceMap ? config.build.devtool : false, + output: { + path: config.build.assetsRoot, + filename: utils.assetsPath('js/[name].[contenthash:8].js'), + chunkFilename: utils.assetsPath('js/[name].[contenthash:8].chunk.js'), + publicPath: config.build.assetsPublicPath + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': env + }), + new MiniCssExtractPlugin({ + filename: utils.assetsPath('css/[name].[contenthash:8].css'), + chunkFilename: utils.assetsPath('css/[name].[contenthash:8].css') + }), + new HtmlWebpackPlugin({ + filename: config.build.index, + template: 'index.html', + inject: true, + favicon: resolve('favicon.ico'), + title: '信息管理系统', + minify: { + removeComments: true, + collapseWhitespace: true, + removeAttributeQuotes: true, + minifyCSS: true, + minifyJS: true + } + }), + new CopyWebpackPlugin({ + patterns: [ + { + from: path.resolve(__dirname, '../static'), + to: config.build.assetsSubDirectory, + globOptions: { + ignore: ['.*'] + } + } + ] + }) + ], + optimization: { + minimize: true, + minimizer: [ + new TerserPlugin({ + parallel: true, + terserOptions: { + compress: { + drop_console: true + } + } + }), + new CssMinimizerPlugin() + ], + splitChunks: { + chunks: 'all', + cacheGroups: { + libs: { + name: 'chunk-libs', + test: /[\\/]node_modules[\\/]/, + priority: 10, + chunks: 'initial' + }, + elementUI: { + name: 'chunk-elementUI', + priority: 20, + test: /[\\/]node_modules[\\/]element-ui[\\/]/ + }, + commons: { + name: 'chunk-commons', + test: resolve('src/components'), + minChunks: 3, + priority: 5, + reuseExistingChunk: true + } + } + }, + runtimeChunk: { + name: 'runtime' + } + }, + performance: { + hints: 'warning', + maxEntrypointSize: 512000, + maxAssetSize: 512000 + } +}) + +if (config.build.productionGzip) { + const CompressionWebpackPlugin = require('compression-webpack-plugin') + webpackConfig.plugins.push( + new CompressionWebpackPlugin({ + filename: '[path][base].gz', + algorithm: 'gzip', + test: new RegExp(`\\.(${config.build.productionGzipExtensions.join('|')})$`), + threshold: 10240, + minRatio: 0.8 + }) + ) +} + +if (config.build.bundleAnalyzerReport) { + webpackConfig.plugins.push( + new BundleAnalyzerPlugin({ + analyzerPort: 8888 + }) + ) +} + +module.exports = webpackConfig diff --git a/config/index.js b/config/index.js new file mode 100644 index 0000000..d11e86e --- /dev/null +++ b/config/index.js @@ -0,0 +1,128 @@ +// Template version: 1.2.6 +// see http://vuejs-templates.github.io/webpack for documentation. + +const path = require('path') +const os = require('os') + +const networkInterfaces = os.networkInterfaces() + +// const ip = networkInterfaces['WLAN'][1] ? networkInterfaces['WLAN'][1].address : networkInterfaces['WLAN'][0].address +const ip = '127.0.0.1' +module.exports = { + dev: { + // Paths + assetsSubDirectory: 'static', + assetsPublicPath: '/', + proxyTable: { + // 代理 /api/b1s 开头的请求 + '/api/b1s': { + target: 'https://192.168.2.90:50000', // SAP B1 Service Layer 地址 + changeOrigin: true, // 修改 Origin,让服务器认为是直接访问 + secure: false, // ⚠️ 关键:忽略 HTTPS 证书验证(自签名证书可用) + pathRewrite: { + '^/api/b1s': '/b1s/v1' // 重写路径:/api/b1s/Login → /b1s/v1/Login + }, + logLevel: 'debug', + // 可选:打印代理日志(调试用) + onProxyReq: (proxyReq, req, res) => { + console.log('Proxying request:', req.method, req.url); + }, + onProxyRes: (proxyRes, req, res) => { + // 关键:移除 WWW-Authenticate 头,阻止浏览器弹窗 + delete proxyRes.headers['www-authenticate']; + delete proxyRes.headers['WWW-Authenticate']; + } + }, + '/openapi/v1':{ + target: 'http://192.168.2.90:8082', // SAP B1 Service Layer 地址 + changeOrigin: true, // 修改 Origin,让服务器认为是直接访问 + secure: false, // ⚠️ 关键:忽略 HTTPS 证书验证(自签名证书可用) + pathRewrite: { + '^/api/tm': '/openapi/v1' // 重写路径:/api/b1s/Login → /b1s/v1/Login + }, + logLevel: 'debug', + // 可选:打印代理日志(调试用) + onProxyReq: (proxyReq, req, res) => { + console.log('Proxying request:', req.method, req.url); + }, + onProxyRes: (proxyRes, req, res) => { + // 关键:移除 WWW-Authenticate 头,阻止浏览器弹窗 + delete proxyRes.headers['www-authenticate']; + delete proxyRes.headers['WWW-Authenticate']; + } + } + }, + + // Various Dev Server settings + host: ip, // can be overwritten by process.env.HOST + port: 1997, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined + autoOpenBrowser: true, + errorOverlay: false, + notifyOnErrors: false, + poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- + + // Use Eslint Loader? + // If true, your code will be linted during bundling and + // linting errors and warnings will be shown in the console. + useEslint: false, + // If true, eslint errors and warnings will also be shown in the error overlay + // in the browser. + showEslintErrorsInOverlay: false, + + /** + * Source Maps + */ + + // https://webpack.js.org/configuration/devtool/#development + devtool: 'cheap-source-map', + + // CSS Sourcemaps off by default because relative paths are "buggy" + // with this option, according to the CSS-Loader README + // (https://github.com/webpack/css-loader#sourcemaps) + // In our experience, they generally work as expected, + // just be aware of this issue when enabling this option. + cssSourceMap: false + }, + + build: { + // Template for index.html + index: path.resolve(__dirname, '../dist/index.html'), + + // Paths + assetsRoot: path.resolve(__dirname, '../dist'), + assetsSubDirectory: 'static', + + /** + * You can set by youself according to actual condition + * You will need to set this if you plan to deploy your site under a sub path, + * for example GitHub pages. If you plan to deploy your site to https://foo.github.io/bar/, + * then assetsPublicPath should be set to "/bar/". + * In most cases please use '/' !!! + */ + assetsPublicPath: '/', + + /** + * Source Maps + */ + + productionSourceMap: false, + // https://webpack.js.org/configuration/devtool/#production + devtool: 'source-map', + + // Gzip off by default as many popular static hosts such as + // Surge or Netlify already gzip all static assets for you. + // Before setting to `true`, make sure to: + // npm install --save-dev compression-webpack-plugin + productionGzip: false, + productionGzipExtensions: ['js', 'css'], + + // Run the build command with an extra argument to + // View the bundle analyzer report after build finishes: + // `npm run build --report` + // Set to `true` or `false` to always turn it on or off + bundleAnalyzerReport: process.env.npm_config_report || false, + + // `npm run build:prod --generate_report` + generateAnalyzerReport: process.env.npm_config_generate_report || false + } +} diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..93b81bf Binary files /dev/null and b/favicon.ico differ diff --git a/fix_生产管理_外协报表_查询.sql b/fix_生产管理_外协报表_查询.sql new file mode 100644 index 0000000..7d3729d --- /dev/null +++ b/fix_生产管理_外协报表_查询.sql @@ -0,0 +1,193 @@ +-- ============================================================ +-- 修复: [dbo].[生产管理_外协报表_查询] +-- 问题1: 供应商过滤在 HAVING 中,SELECT 用 MAX(供应商名称) +-- → 搜索"大连金景义"可能显示"芯泰智能" +-- 问题2: GROUP BY 加了供应商名称后,STUFF 子查询未限定供应商 +-- → 两个供应商行拿到完全相同的工序列表,看似重复 +-- 修复: +-- ① 供应商过滤移到 WHERE(分组前过滤) +-- ② GROUP BY 加入 供应商名称(每个供应商独立一行) +-- ③ STUFF 子查询加 d2.供应商名称 = d.供应商名称(各行只取自己的工序) +-- ④ ROW_NUMBER 加上 供应商名称(排序确定化) +-- 日期: 2026-05-21 +-- ============================================================ + +USE [YL_MESDB] +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +ALTER PROCEDURE [dbo].[生产管理_外协报表_查询] + @订单号 int = 0, + @合同号 nvarchar(50) = '', + @产品编码 nvarchar(50) = '', + @产品名称 nvarchar(50) = '', + @计划号 nvarchar(50) = '', + @供应商 nvarchar(100) = '', + @状态过滤 int = 0, + @PageCurrent int = 1, + @PageSize int = 20, + @PageCount int OUTPUT, + @ItemCount int OUTPUT +AS +BEGIN + SET NOCOUNT ON + + IF OBJECT_ID('tempdb..#MergedResult') IS NOT NULL DROP TABLE #MergedResult + + ;WITH 工单汇总 AS ( + SELECT + 订单号, + 拆分内码, + 供应商名称, + MAX(计划号) AS 计划号, + MAX(合同号) AS 合同号, + MAX(产品编码) AS 产品编码, + MAX(产品名称) AS 产品名称, + MAX(指派数量) AS 指派数量, + MAX(含税单价) AS 含税单价, + MAX(含税行总计) AS 含税行总计, + MAX(开始时间) AS 开始时间, + MIN(计划开始时间) AS 计划开始时间, + MIN(计划完成时间) AS 计划完成时间, + MAX(采购预计到货日期) AS 采购预计到货日期, + MAX(外协结束时间) AS 外协结束时间, + MAX(收料数量) AS 收料数量, + MAX(收检合格数) AS 收检合格数, + MAX(收检不合格数) AS 收检不合格数, + MAX(CASE WHEN ISNULL(开票数量, 0) > 0 THEN 1 ELSE 0 END) AS 开票数量, + MAX(发料数量合计) AS 发料数量合计, + MAX(收料数量_报工) AS 收料数量_报工, + MAX(CAST(材质 AS NVARCHAR(MAX))) AS 材质, + MAX(要求完工日期) AS 要求完工日期, + MAX(工序计划数量) AS 工序计划数量, + MAX(完成数量) AS 完成数量, + MAX(收检合格数) AS 上序合格数, + MAX(CASE WHEN 订单行号 = 1 OR ISNULL(收检合格数, 0) > 0 THEN 1 ELSE 0 END) AS 执行状态, + -- ============ 修复点③ ============ + -- STUFF 子查询加上 供应商名称 关联:每个供应商行只聚合自己的工序 + STUFF(( + SELECT ',' + d2.工序名称 + FROM View_外协报表视图 d2 + WHERE d2.订单号 = d.订单号 + AND d2.拆分内码 = d.拆分内码 + AND ISNULL(d2.供应商名称, '') = ISNULL(d.供应商名称, '') + ORDER BY d2.订单行号 + FOR XML PATH(''), TYPE + ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS 工序名称列表, + STUFF(( + SELECT ',' + CAST(d2.TaskAID AS VARCHAR(10)) + FROM View_外协报表视图 d2 + WHERE d2.订单号 = d.订单号 + AND d2.拆分内码 = d.拆分内码 + AND ISNULL(d2.供应商名称, '') = ISNULL(d.供应商名称, '') + ORDER BY d2.订单行号 + FOR XML PATH(''), TYPE + ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS TaskAID列表, + -- ============ 修复点④ ============ + -- ROW_NUMBER 排序加上 供应商名称,确保分页结果稳定 + ROW_NUMBER() OVER (ORDER BY 订单号, 供应商名称) AS RowNum + FROM View_外协报表视图 d + WHERE 1=1 + -- 排除供应商为空的"脏数据"(无SAP采购单关联的行) + AND ISNULL(d.供应商名称, '') <> '' + -- ============ 修复点① ============ + -- 供应商过滤放在 WHERE(分组前),不会出现"搜A显示B" + AND (@供应商 = '' OR d.供应商名称 LIKE '%' + @供应商 + '%') + -- ==================================== + AND (@订单号 = 0 OR d.订单号 = @订单号) + AND (@计划号 = '' OR d.计划号 = @计划号) + AND (@合同号 = '' OR d.合同号 LIKE '%' + @合同号 + '%') + AND (@产品编码 = '' OR d.产品编码 LIKE '%' + @产品编码 + '%') + AND (@产品名称 = '' OR d.产品名称 LIKE '%' + @产品名称 + '%') + -- ============ 修复点② ============ + -- 按 订单号 + 拆分内码 + 供应商名称 分组,每个供应商独立一行 + GROUP BY 订单号, 拆分内码, 供应商名称 + -- ==================================== + HAVING + -- 状态过滤依赖聚合值,保留在 HAVING + (@状态过滤 = 0 OR MAX(CASE WHEN ISNULL(收料数量_报工, 0) < ISNULL(发料数量合计, 0) THEN 1 ELSE 0 END) = 1) + ) + SELECT + 计划号, + 合同号, + 订单号, + 产品编码, + 产品名称, + 工序名称列表 AS 工序名称, + 供应商名称, + 指派数量, + 含税单价, + 含税行总计, + 开始时间, + 计划开始时间, + 计划完成时间, + 采购预计到货日期, + 外协结束时间, + 收料数量, + 收检合格数, + 收检不合格数, + 开票数量, + 发料数量合计, + 收料数量_报工, + 材质, + 要求完工日期, + 工序计划数量, + TaskAID列表 AS TaskAID, + 拆分内码, + 执行状态, + CASE WHEN 执行状态 = 1 THEN '可执行' ELSE '不可执行' END AS 执行状态文本, + 完成数量, + 上序合格数, + RowNum + INTO #MergedResult + FROM 工单汇总 + + SELECT @ItemCount = COUNT(*) FROM #MergedResult + + IF @ItemCount = 0 + SET @PageCount = 0 + ELSE + SET @PageCount = CEILING(CAST(@ItemCount AS FLOAT) / @PageSize) + + SELECT + 计划号, + 合同号, + 订单号, + 产品编码, + 产品名称, + 工序名称, + 供应商名称, + 指派数量, + 含税单价, + 含税行总计, + 开始时间, + 计划开始时间, + 计划完成时间, + 采购预计到货日期, + 外协结束时间, + 收料数量, + 收检合格数, + 收检不合格数, + 开票数量, + 发料数量合计, + 收料数量_报工, + 材质, + 要求完工日期, + 工序计划数量, + TaskAID, + 拆分内码, + 执行状态, + 执行状态文本, + 完成数量, + 上序合格数 + FROM #MergedResult + WHERE RowNum BETWEEN (@PageCurrent - 1) * @PageSize + 1 AND @PageCurrent * @PageSize + ORDER BY 订单号, 供应商名称 + + DROP TABLE #MergedResult +END +GO diff --git a/index.html b/index.html new file mode 100644 index 0000000..e726634 --- /dev/null +++ b/index.html @@ -0,0 +1,16 @@ + + + + + + <%= htmlWebpackPlugin.options.title %> + + + + + +
+ + + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..a11a476 --- /dev/null +++ b/package.json @@ -0,0 +1,114 @@ +{ + "name": "MacroinfManage_MES", + "version": "1.1.0", + "description": "A Management Information System of QIANG LI CO,.LTD,the template is from git+https://github.com/PanJiaChen/vue-element-admin.git", + "author": "MESWORK", + "scripts": { + "dev": "webpack serve --config build/webpack.dev.conf.js", + "start": "npm run dev", + "build": "webpack --config build/webpack.prod.conf.js && rimraf dist/static/config.js " + }, + "dependencies": { + "@fullcalendar/core": "^6.1.17", + "@fullcalendar/daygrid": "^6.1.17", + "@fullcalendar/interaction": "^6.1.17", + "@fullcalendar/timegrid": "^6.1.17", + "@fullcalendar/vue": "^6.1.19", + "axios": "^0.21.4", + "buffer": "^6.0.3", + "core-js": "^3.36.0", + "crypto-browserify": "^3.12.1", + "docxtemplater": "^3.42.0", + "echarts": "^5.4.3", + "element-ui": "^2.15.14", + "file-saver": "^2.0.5", + "html2canvas": "^1.4.1", + "install": "^0.13.0", + "jquery": "^3.7.1", + "js-cookie": "^3.0.5", + "jspdf": "^2.5.1", + "jszip-utils": "^0.1.0", + "mqtt": "^4.3.7", + "normalize.css": "^8.0.1", + "nprogress": "^0.2.0", + "path-browserify": "^1.0.1", + "pdfjs-dist": "^5.1.91", + "process": "^0.11.10", + "qrcode": "^1.5.3", + "regenerator-runtime": "^0.14.1", + "stream-browserify": "^3.0.0", + "stylus": "^0.54.8", + "stylus-loader": "^6.2.0", + "time-formater": "^1.0.3", + "util": "^0.12.5", + "uuid": "^9.0.1", + "vue": "^2.7.16", + "vue-count-to": "^1.0.13", + "vue-direction-key": "^1.0.5", + "vue-json-viewer": "^2.2.22", + "vue-print-nb": "^1.7.5", + "vue-router": "^3.6.5", + "vuex": "^3.6.2", + "xlsx": "^0.18.5", + "xlsx-style": "^0.8.13" + }, + "devDependencies": { + "@babel/core": "^7.28.4", + "@babel/eslint-parser": "^7.28.4", + "@babel/plugin-syntax-jsx": "7.27.1", + "@babel/plugin-transform-runtime": "7.28.3", + "@babel/preset-env": "^7.23.0", + "@babel/runtime": "^7.28.4", + "autoprefixer": "^10.4.16", + "babel-helper-vue-jsx-merge-props": "^2.0.3", + "babel-loader": "^9.1.3", + "babel-plugin-syntax-jsx": "^6.18.0", + "babel-plugin-transform-vue-jsx": "4.0.1", + "chalk": "^4.1.2", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.8.1", + "css-minimizer-webpack-plugin": "^5.0.1", + "eslint": "8.57.0", + "eslint-friendly-formatter": "^4.0.1", + "eslint-plugin-vue": "7.20.0", + "eslint-webpack-plugin": "^4.0.1", + "file-loader": "^6.2.0", + "html-webpack-plugin": "^5.5.3", + "mini-css-extract-plugin": "^2.7.6", + "node-notifier": "^10.0.1", + "ora": "^5.4.1", + "portfinder": "^1.0.32", + "postcss": "^8.4.31", + "postcss-import": "^12.0.1", + "postcss-loader": "^7.3.3", + "postcss-url": "^10.1.3", + "raw-loader": "^4.0.2", + "rimraf": "^3.0.2", + "sass": "^1.69.5", + "sass-loader": "^13.3.2", + "script-loader": "^0.7.2", + "semver": "^7.5.4", + "shelljs": "^0.8.5", + "svg-sprite-loader": "^6.0.11", + "svgo": "^3.2.0", + "terser-webpack-plugin": "^5.3.9", + "url-loader": "^4.1.1", + "vue-loader": "^15.10.1", + "vue-style-loader": "^4.1.3", + "vue-template-compiler": "^2.7.16", + "webpack": "^5.89.0", + "webpack-bundle-analyzer": "^4.10.0", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1", + "webpack-merge": "^5.10.0" + }, + "engines": { + "node": ">=20.0.0", + "npm": ">=9.0.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 11" + ] +} diff --git a/script.sql b/script.sql new file mode 100644 index 0000000..536fd83 Binary files /dev/null and b/script.sql differ diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..dc3f66f --- /dev/null +++ b/src/App.vue @@ -0,0 +1,33 @@ + + + + diff --git a/src/api/BasicData/EquipmentCapabilitySetting.js b/src/api/BasicData/EquipmentCapabilitySetting.js new file mode 100644 index 0000000..c63fb7d --- /dev/null +++ b/src/api/BasicData/EquipmentCapabilitySetting.js @@ -0,0 +1,75 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' + +// 初始化获取工艺 +export function getTechnology() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '车间生产管理工艺_基础表_工艺名称_查询数据', + param: '工艺分类流水号_check=0' + } + }) +} +// 查询表格数据 +export function searchtable(pageCurrent, pageSize, num1, ManufacturerNumber) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '设备管理_设备加工能力_查询数据_设备维护', + param: '设备名称_check=' + num1 + '&设备名称=' + ManufacturerNumber, + Pagination: pageCurrent + '&' + pageSize + } + }) +} +// 增加 +export function edittype(ManufacturerNumber, ManufacturerName, ManufacturerAbbreviation, address, phNumber, Fax, Remarks, category, attention, EquipmentCondition) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '设备管理_设备加工能力_增加数据_设备维护New', + param: '设备名称=' + ManufacturerNumber + '&设备型号=' + ManufacturerName + '&设备性能指标=' + ManufacturerAbbreviation + '&设备工时系数=' + address + '&工艺编号=' + phNumber + '&班次类型=' + Fax + '&设备加工能力工时=' + Remarks + '&整改工时系数=' + category + '&设备编号=' + attention + '&预留工时系数=' + EquipmentCondition + } + }) +} +// 编辑 +export function handlechange(num, ManufacturerNumber, ManufacturerName, ManufacturerAbbreviation, address, phNumber, Fax, Remarks, category, attention, EquipmentCondition) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '设备管理_设备加工能力_修改数据_设备维护New', + param: '设备流水号=' + num + '&设备名称=' + ManufacturerNumber + '&设备型号=' + ManufacturerName + '&设备性能指标=' + ManufacturerAbbreviation + '&设备工时系数=' + address + '&工艺属性代码=' + phNumber + '&班次类型=' + Fax + '&设备加工能力工时=' + Remarks + '&整改工时系数=' + category + '&设备编号=' + attention + '&预留工时系数=' + EquipmentCondition + } + }) +} +// 删除 +export function handledelete(CoManufacturerFlowNumber) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '设备管理_设备加工能力_删除数据_设备维护', + param: '设备流水号=' + CoManufacturerFlowNumber + } + }) +} diff --git a/src/api/BasicData/EquipmentMonitoringNew.js b/src/api/BasicData/EquipmentMonitoringNew.js new file mode 100644 index 0000000..8654c1e --- /dev/null +++ b/src/api/BasicData/EquipmentMonitoringNew.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' + +// 初始化工位 +export function getMachine() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '车间生产管理工艺_加工顺序调整_查询工位及人员' + } + }) +} +// 获取状态 +export function searchState() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: 'MES_机加工MES_设备状态查询_初始化' + } + }) +} + +export function getData3(num, num1, num2) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '车间生产管理_设备运行情况_查询数据_状态分布图_新', + param: '工位号=' + num + '&开始时间=' + num1 + '&结束时间=' + num2 + } + }) +} diff --git a/src/api/BasicData/FactoryCalendar.js b/src/api/BasicData/FactoryCalendar.js new file mode 100644 index 0000000..7bbe383 --- /dev/null +++ b/src/api/BasicData/FactoryCalendar.js @@ -0,0 +1,31 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' +// 初始化日历 +export function initClendar(year, month) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '车间生产管理工艺_基础表_工作日历_获得状态', + param: '工作年=' + year + '&工作月=' + month + } + }) +} +// 修改工作状态 +export function changeState(time, code) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '车间生产管理工艺_基础表_工作日历_设置状态', + param: '工作日期=' + time + '&工作日状态=' + code + } + }) +} diff --git a/src/api/BasicData/Materialmaintenance.js b/src/api/BasicData/Materialmaintenance.js new file mode 100644 index 0000000..f123e14 --- /dev/null +++ b/src/api/BasicData/Materialmaintenance.js @@ -0,0 +1,57 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' + +export function featchMaterial(num1, pageCurrent, pageSize) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '车间生产管理工艺_材质表_查询数据_根据材料名称', + param: '材料名称=' + num1, + pagination: pageCurrent + '&' + pageSize + } + }) +} +export function addMaterial(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '车间生产管理工艺_材质表_增加数据', + param: '材料=' + num1 + } + }) +} +export function delMaterial(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '车间生产管理工艺_材质表_删除数据', + param: '材料流水号=' + num1 + } + }) +} +export function editMaterial(num1, num2) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '车间生产管理工艺_材质表_修改数据', + param: '材料流水号=' + num1 + '=int&材料=' + num2 + } + }) +} diff --git a/src/api/BasicData/MenuManagement.js b/src/api/BasicData/MenuManagement.js new file mode 100644 index 0000000..e01daba --- /dev/null +++ b/src/api/BasicData/MenuManagement.js @@ -0,0 +1,105 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' +// 初始化角色 +export function getRole() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '菜单系统模块_项目角色_查询数据_MESWORK' + } + }) +} +// 根据角色查模块 +export function getModule(role) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '3', + name: `select * from [dbo].[登录基础数据_二级菜单] where 账号代码=${role} and 是否启用 = 1 order by id` + } + }) +} +// 初始化一级菜单 +export function initFisrtLevel() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '3', + name: ` select id,title from [dbo].[登录基础数据_二级菜单] where pid = 0 and 是否启用 =1 and 账号代码 = 1` + } + }) +} +// 初始化二级菜单 +export function initSecondLevel() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '3', + name: `select a.id,a.title,a.pid,b.id,b.title as title1 from (select id,title,pid from [dbo].[登录基础数据_二级菜单] where pid <> 0 and 账号代码 = 1 and 是否启用 = 1 )as a +left join (select id,title from [dbo].[登录基础数据_二级菜单] where pid = 0 and 账号代码 = 1 and 是否启用 = 1 )as b on a.pid = b.id order by b.id` + } + }) +} + +// 撤回分配模块 +export function returnModule(id, num) { + return request({ + url: '', + method: 'post', + data: { + type: '2', + name: `菜单管理_角色模块_删除数据`, + param: `id=${id}&角色编号=${num}` + } + }) +} +// 分配一级模块 +export function giveFirstLevel(idGroup, num) { + return request({ + url: '', + method: 'post', + data: { + type: '2', + name: `菜单管理_角色模块_一级_增加数据`, + param: `一级模块id组=${idGroup}&角色编号=${num}` + } + }) +} +// 分配二级模块 +export function giveSecondLevel(idGroup, num, pid) { + return request({ + url: '', + method: 'post', + data: { + type: '2', + name: `菜单管理_角色模块_二级_增加数据`, + param: `二级模块id组=${idGroup}&角色编号=${num}&pid=${pid}` + } + }) +} +// 新增一级菜单 +export function submitAdd(name) { + return request({ + url: '', + method: 'post', + data: { + type: '2', + name: `菜单管理_模块_一级_增加数据`, + param: `模块名称=${name}` + } + }) +} diff --git a/src/api/BasicData/PartsNumberMaintenance.js b/src/api/BasicData/PartsNumberMaintenance.js new file mode 100644 index 0000000..d3e0987 --- /dev/null +++ b/src/api/BasicData/PartsNumberMaintenance.js @@ -0,0 +1,398 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' + +export function projectSelect() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: 'PDM_项目名称_查询数据_按时间排序' + } + }) +} + +export function machineSelect() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: 'PDM_项目名称_查询数据' + } + }) +} + +export function groupSelect(machineValue) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: 'PDM_零件明细表_组件流水号_查询数据_根据机床', + param: `机床流水号=${machineValue}` + } + }) +} +export function searchTable5(machineCheck, machine, groupCheck, group, part_check, part) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: 'PDM_零件明细表_外购件和标准件_临时表数据查询', + param: `机床名字_check=${machineCheck}&机床名字=${machine}&组号_check=${groupCheck}&组号=${group}&物料名称_check=${part_check}&物料名称=${part}` + } + }) +} +export function searchTable6(machineCheck, machine, groupCheck, group, part_check, part) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: 'PDM_零件明细表_基本件_临时表数据查询', + param: `机床名字_check=${machineCheck}&机床名字=${machine}&组号_check=${groupCheck}&组号=${group}&零件图号_check=${part_check}&零件图号=${part}` + } + }) +} +export function basicPartsData(machine_check, machine, group_check, group, part_check, part) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: 'PDM_零件明细表_基本件_查询数据_综合gj_数量维护', + param: `机床流水号_check=${machine_check}&机床流水号=${machine}&组件流水号_check=${group_check}&组件流水号=${group}&零件图号_check=${part_check}&零件图号=${part}` + } + }) +} +export function purchasePartsData(machine_check, machine, group_check, num, part_check, part) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: 'PDM_零件明细表_标准件和外购件_查询数据_数量维护', + param: `机床流水号_check=${machine_check}&机床流水号=${machine}&组件流水号_check=${group_check}&组件流水号=${num}&物料名称_check=${part_check}&物料名称=${part}` + } + }) +} +export function deleteBasicParts(basicNum) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'PDM_零件明细表_基本件_删除数据', + param: `基本件流水号=${basicNum}` + } + }) +} +export function alldelete(basicNum) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'PDM_零件明细表_基本件_删除数据_根据组件流水号', + param: `基本件流水号组=${basicNum}` + } + }) +} +export function deleteBasicParts5(basicNum) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'PDM_零件明细表_外购件和标准件_临时表_删除', + param: `id=${basicNum}` + } + }) +} +export function alldeleteBasicParts5(machine, group) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'PDM_零件明细表_外购件和标准件_临时表_全部删除', + param: `机床=${machine}&组号=${group}` + } + }) +} +export function deleteBasicParts6(basicNum) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'PDM_零件明细表_基本件_临时表_删除', + param: `id=${basicNum}` + } + }) +} +export function alldeleteBasicParts6(machine, group) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'PDM_零件明细表_基本件_临时表_全部删除', + param: `机床=${machine}&组号=${group}` + } + }) +} +export function deletePurchaseData(num) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'PDM_零件明细表_标准件和外购件_删除数据', + param: '标准件和外购件流水号=' + num + '=int' + } + }) +} +export function alldeleteWB(num) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'PDM_零件明细表_标准件和外购件_删除数据_根据组件流水号', + param: '标准件和外购件流水号组=' + num + } + }) +} +export function editPurchaseData(num, num1, people) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'PDM_零件明细表_标准件和外购件_修改数据', + param: '标准件和外购件流水号=' + num + '&零件数量=' + num1 + '&修改人员=' + people + } + }) +} +export function editBasicParts(num, num1, num2, num3, num4, people) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'PDM_零件明细表_基本件_编辑数据', + param: '基本件流水号=' + num + '&零件数量=' + num1 + '&零件名称=' + num2 + '&零件图号=' + num3 + '&材料=' + num4 + '&修改人员=' + people + } + }) +} +export function isExitBasicParts(num, num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: 'PDM_零件明细表_基本件_编辑数据_验证图号', + param: '基本件流水号=' + num + '&零件图号=' + num1 + } + }) +} +export function getTable(num) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '车间生产管理工艺_零件工艺计划_已投产_按组查', + param: '组件流水号=' + num + '=int' + } + }) +} +export function editProductNum(num, num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'MRP_计划订单_组件零件清单_基本件_编辑数据', + param: '组件零件基本件流水号=' + num + '&数量=' + num1 + } + }) +} +export function getTable1(num, a, b, c, d, e, f, g) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '车间生产管理工艺_新排产算法_能力平衡_查询数据_要平衡的零件_数量维护', + param: '机床流水号_check=' + b + '=string&机床流水号=' + c + '=int&组件流水号_check=' + d + '=string&组件流水号=' + e + '=int&零件图号_check=' + f + '=string&零件图号=' + g + '=string&是否查询全部数据=1=string&单件是否外协=1=int&考核状态=5=int' + } + }) +} +export function editProduceNum(num, num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '车间生产管理工艺_零件工艺计划_修改数据', + param: '工艺计划流水号=' + num + '&零件数量=' + num1 + } + }) +} +// 查询表1标准件和外购件 +export function searchTable1(...params) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '采购管理_采购部采购_查询物料_数量维护', + param: `机床流水号_check=${params[0]}&机床流水号=${params[1]}&组件流水号_check=${params[2]}&组件流水号=${params[3]}&物料状态=1` + } + }) +} +// 查询表1基本件 +export function searchTable2(...params) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '采购管理_采购部采购_查询物料_基本件_数量维护', + param: `机床流水号_check=${params[0]}&机床流水号=${params[1]}&组件流水号_check=${params[2]}&组件流水号=${params[3]}&物料状态=1` + } + }) +} +export function editGroupPartNum(num, num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'MRP_计划订单_组件零件清单_编辑数据', + param: '组件零件流水号=' + num + '&零件数量=' + num1 + } + }) +} +export function editGroupBasicPartNum(num, num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'MRP_计划订单_组件零件清单_基本件_采购_编辑数据', + param: '组件零件基本件流水号=' + num + '&零件数量=' + num1 + } + }) +} +export function getmaterial() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '零件明细表_材料_查询' + } + }) +} +// 查询物料 +export function searchAllMaterial(check1, MaterialName, check2, MaterialSpec, check3, MaterialModel, pageCurrent, pageSize) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '库存管理_物料主文件_基本_查询数据_分页', + param: `物料名称_check=${check1}&物料名称=${MaterialName}&物料规格_check=${check2}&物料规格=${MaterialSpec}&物料型号_check=${check3}&物料型号=${MaterialModel}&PageCurrent=${pageCurrent}=int&PageSize=${pageSize}=int&PageCount=1=int=output&ItemCount=1=int=output` + } + }) +} +// 物料变更 +export function materialChange(num1, num2, num3, num4, person) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '采购管理_采购物料修改_零件数量维护_修改数据', + param: `组件零件流水号=${num1}&标准件和外购件流水号=${num2}&原物料流水号=${num3}&新物料流水号=${num4}&申请人=${person}` + } + }) +} +// 修改组件数量 +export function editgroupNum(num, num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'PDM_零件明细表_组件流水号_组件数量_修改数据', + param: '组件流水号=' + num + '&数量=' + num1 + } + }) +} diff --git a/src/api/BasicData/PersonnelManagement.js b/src/api/BasicData/PersonnelManagement.js new file mode 100644 index 0000000..4c438ac --- /dev/null +++ b/src/api/BasicData/PersonnelManagement.js @@ -0,0 +1,430 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' +export function getTree() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_部门关系_查询节点', + param: '子节点=0=int' + } + }) +} +export function tree(data, pid) { + const result = [] + let temp + for (let i = 0; i < data.length; i++) { + if (data[i].父节点 === pid) { + const obj = { label: data[i].节点名称, id: data[i].子节点 } + temp = tree(data, data[i].子节点) + if (temp.length > 0) { + obj.children = temp + } + result.push(obj) + } + } + return result +} +export function getTablePeople(code, pageCurrent, pageSize) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_人员_部门与人员_查询数据_根据部门编号', + param: '考核部门编号=' + code + '=int', + pagination: pageCurrent + '&' + pageSize + } + }) +} +export function getTablePeopleForName(name) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_人员名单_查询数据_根据姓名_MESWORK', + param: '姓名=' + name + '=string' + } + }) +} +// 新增部门 +export function addDepartmentName(num1, num2, num3) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_部门关系_增加节点', + param: '父节点=' + num1 + '=int&节点名称=' + num2 + '=string&子节点=' + num3 + } + }) +} +// 删除部门 +export function delList(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_部门关系_删除节点', + param: '子节点=' + num1 + '=int' + } + }) +} +// 编辑部门 +export function editList(num1, num2) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_部门关系_修改节点', + param: '子节点=' + num1 + '=int&节点名称=' + num2 + '=string' + } + }) +} +export function delPeopleList(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_人员名单_删除数据_MESWORK', + param: '人员编号=' + num1 + '=int' + } + }) +} +export function initUniversity() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_基础表_毕业院校_查询数据' + } + }) +} +export function fetchEducationData() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_基础表_学历_查询数据' + } + }) +} +export function initMajor() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_基础表_所学专业_查询数据' + } + }) +} +export function fetchForeignLanguageLevelDate() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_基础表_外语及熟练程度_查询数据' + } + }) +} +export function fetchTitleData() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_基础表_职称_查询数据' + } + }) +} +export function fetchPostData() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_基础表_人员岗位_查询数据' + } + }) +} +export function fetchPositionStatusData() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_基础表_岗位状态_查询数据' + } + }) +} +export function addPeople(id, Sex, Education, Address, Nation, Post, AccountNumber, Password, Name, IDcard, TimeOfEntry, Birthday, ContactInformation, TeamValue) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_人员名单_增加数据_MESWORK', + param: '考核部门编号=' + id + '=int&性别编号=' + Sex + '=int&学历编号=' + Education + '=int&家庭住址=' + Address + '&民族=' + Nation + '&岗位编号=' + Post + '=int&考勤编号=' + AccountNumber + '=string&密码=' + Password + '=string&姓名=' + Name + '=string&身份证号=' + IDcard + '=string&入公司时间=' + TimeOfEntry + '=string&出生日期=' + Birthday + '=string&联系电话=' + ContactInformation + '=string&班组=' + TeamValue + } + }) +} +export function editPeople(id, Sex, Education, Address, Nation, Post, AccountNumber, Password, Name, IDcard, TimeOfEntry, Birthday, ContactInformation, TeamValue) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_人员名单_修改数据_MESWORK', + param: '人员编号=' + id + '=int&性别编号=' + Sex + '=int&学历编号=' + Education + '=int&家庭住址=' + Address + '&民族=' + Nation + '&岗位编号=' + Post + '=int&考勤编号=' + AccountNumber + '=string&密码=' + Password + '=string&姓名=' + Name + '=string&身份证号=' + IDcard + '=string&入公司时间=' + TimeOfEntry + '=string&出生日期=' + Birthday + '=string&联系电话=' + ContactInformation + '=string&班组=' + TeamValue + } + }) +} +export function moveGroups(num1, num2) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_人员名单_移动数据_MESWORK', + param: '人员编号=' + num1 + '=int&考核部门编号=' + num2 + '=int' + } + }) +} +export function feacthUniversity(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_基础表_毕业院校_查询数据_根据学校名_MESWORK', + param: '毕业院校名称=' + num1 + '=string' + } + }) +} +export function addUniversity(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_基础表_毕业院校_增加数据', + param: '毕业院校名称=' + num1 + '=string' + } + }) +} +export function editUniversity(num1, num2) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_基础表_毕业院校_修改数据', + param: '毕业院校编号=' + num1 + '=int&毕业院校名称=' + num2 + '=string' + } + }) +} +export function delUniversity(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_基础表_毕业院校_删除数据', + param: '毕业院校编号=' + num1 + '=int' + } + }) +} +export function fetchMajor(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_基础表_所学专业_查询数据_根据专业名_MESWORK', + param: '专业名称=' + num1 + '=string' + } + }) +} +export function addMajor(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_基础表_所学专业_增加数据', + param: '专业名称=' + num1 + '=string' + } + }) +} +export function editMajor(num1, num2) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_基础表_所学专业_修改数据', + param: '专业编号=' + num1 + '=int&专业名称=' + num2 + '=string' + } + }) +} +export function delMajor(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_基础表_所学专业_删除数据', + param: '专业编号=' + num1 + '=int' + } + }) +} +export function fetchPost(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_基础表_人员岗位_查询数据_根据岗位名_MESWORK', + param: '岗位名称=' + num1 + '=string' + } + }) +} +export function addPost(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_基础表_人员岗位_增加数据', + param: '岗位名称=' + num1 + '=string' + } + }) +} +export function editPost(num1, num2) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_基础表_人员岗位_修改数据', + param: '岗位编号=' + num1 + '=int&岗位名称=' + num2 + '=string' + } + }) +} +export function delPost(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_基础表_人员岗位_删除数据', + param: '岗位编号=' + num1 + '=int' + } + }) +} +export function quit(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '人事档案管理_人员_离职操作', + param: '人员编号=' + num1 + '=int' + } + }) +} +export function searchLeavingList(pageCurrent, pageSize) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_人员_离职人员查询', + pagination: pageCurrent + '&' + pageSize + } + }) +} +export function fetchteamviwer() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '班组管理_班组查询' + } + }) +} diff --git a/src/api/BasicData/ProjectManagementDisplay.js b/src/api/BasicData/ProjectManagementDisplay.js new file mode 100644 index 0000000..6ec9b3f --- /dev/null +++ b/src/api/BasicData/ProjectManagementDisplay.js @@ -0,0 +1,58 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' + +// 项目 +export function getProject() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: 'PDM_项目名称_查询数据_是否显示_初始化', + param: '项目流水号_check=0=int&项目流水号=0' + } + }) +} +// 机床 +export function getToolNum(check, num) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: 'PDM_项目名称_查询数据_是否显示_初始化', + param: '项目流水号_check=' + check + '=int&项目流水号=' + num + } + }) +} +export function searchTable(check, num, check1, num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: 'PDM_项目名称_查询数据_是否显示', + param: '项目流水号_check=' + check + '=int&项目流水号=' + num + '&机床流水号_check=' + check1 + '=int&机床流水号=' + num1 + } + }) +} +export function upData(num, show) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'PDM_项目名称_查询数据_是否显示_更改状态', + param: '机床流水号=' + num + '&是否显示=' + show + } + }) +} diff --git a/src/api/BasicData/ShiftManagement.js b/src/api/BasicData/ShiftManagement.js new file mode 100644 index 0000000..21381c4 --- /dev/null +++ b/src/api/BasicData/ShiftManagement.js @@ -0,0 +1,88 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' + +// 查询班次 +export function getScheduling(SchedulingType) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '设备管理_基础表_班次表_查询数据', + param: '班次类型=' + SchedulingType + } + }) +} +// 查询班次 +export function searchProgramme() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '设备管理_基础表_班次表_查询班次' + } + }) +} + +// 新增班次 +export function addShift(starttime, endtime, shifttype, shiftnumber, nightwork, work, temporary, difficult, note) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '设备管理_基础表_班次表_增加数据', + param: '开始工作时间=' + starttime + '&结束工作时间=' + endtime + '&班次类型=' + shifttype + '&班次代码=' + shiftnumber + '&是否夜班=' + nightwork + '&是否工作=' + work + '=int&是否可以安排临时件=' + temporary + '=int&是否可以安排高难度件=' + difficult + '=int&备注=' + note + } + }) +} +// 编辑班次 +export function editShift(shiftCode, starttime, endtime, shifttype, shiftnumber, nightwork, work, temporary, difficult, note) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '设备管理_基础表_班次表_修改数据', + param: '序号=' + shiftCode + '=int&开始工作时间=' + starttime + '=datetime&结束工作时间=' + endtime + '=datetime&班次类型=' + shifttype + '=int&班次代码=' + shiftnumber + '=int&是否夜班=' + nightwork + '=int&是否工作=' + work + '=int&是否可以安排临时件=' + temporary + '=int&是否可以安排高难度件=' + difficult + '=int&备注=' + note + } + }) +} +// 删除班次 +export function deleteShift(shiftCode) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '设备管理_基础表_班次表_删除数据', + param: '序号=' + shiftCode + } + }) +} +// 班次类型与工作时间增加 +export function addShiftType() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '设备管理_基础表_班次表_班次类型与工作时间_增加' + } + }) +} + diff --git a/src/api/BasicData/SystemRrolemaintenance.js b/src/api/BasicData/SystemRrolemaintenance.js new file mode 100644 index 0000000..e5eb3fb --- /dev/null +++ b/src/api/BasicData/SystemRrolemaintenance.js @@ -0,0 +1,68 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' +export function InitRolefunction() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '菜单系统模块_项目角色_查询数据_MESWORK' + } + }) +} +export function deleteData(code) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '菜单系统模块_项目角色_删除_MESWORK', + param: '角色编号=' + code + '=int' + } + }) +} +export function searchTable(num) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '菜单系统模块_项目角色_查询数据_MESWORK', + param: '角色功能=' + num + '=string' + } + }) +} +export function addData(code) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '菜单系统模块_项目角色_增加_MESWORK', + param: '角色功能=' + code + '=string' + } + }) +} +export function addData2(code1, num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '菜单系统模块_项目角色_修改数据_MESWORK', + param: '角色功能=' + code1 + '&角色编号=' + num1 + } + }) +} + diff --git a/src/api/BasicData/UserRightsManagement.js b/src/api/BasicData/UserRightsManagement.js new file mode 100644 index 0000000..8a03946 --- /dev/null +++ b/src/api/BasicData/UserRightsManagement.js @@ -0,0 +1,97 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' +export function getRole() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '菜单模块系统_项目角色_查询数据' + } + }) +} + +export function getModule(role_check, role) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '菜单模块系统_项目主模块列表_查询数据', + param: `角色编号_check=${role_check}&角色编号=${role}=int` + } + }) +} +export function addModule(module, role) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '菜单模块系统_项目角色模块列表_增加数据', + param: `角色编号=${role}=int&主模块编号=${module}=int` + } + }) +} +export function deleteModule(module, role) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '菜单模块系统_项目角色模块列表_删除数据', + param: `角色编号=${role}=int&主模块编号=${module}=int` + } + }) +} +// 周一从这里开始改!!! +export function getModelData(role) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '菜单模块系统_项目主模块列表_查询单个模块', + param: `主模块编号=${role}=int` + } + }) +} + +export function addModelData(component, title, icons) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '菜单模块系统_项目主模块列表_增加单个模块', + param: `父路径=/${icons}&子名称=${icons}&子组件=${component}&标题=${title}&图标=${icons}` + } + }) +} + +export function editModelData(modelNum, component, title, icons) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '菜单模块系统_项目主模块列表_修改单个模块', + param: `主模块编号=${modelNum}&父路径=/${icons}&子名称=${icons}&子组件=${component}&标题=${title}&图标=${icons}` + } + }) +} diff --git a/src/api/BasicData/WorkshopPersonnelRoleMana.js b/src/api/BasicData/WorkshopPersonnelRoleMana.js new file mode 100644 index 0000000..16eaea6 --- /dev/null +++ b/src/api/BasicData/WorkshopPersonnelRoleMana.js @@ -0,0 +1,176 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' + +// 查询项目名称 +export function dialogtablevisible() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '人事档案管理_部门关系_查询节点', + param: '子节点=0' + } + }) +} +export function dialogtablevisible1() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '人事档案管理_部门关系_查询节点', + param: '子节点=0' + } + }) +} +export function addData1(code, groupNum) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '菜单系统模块_项目角色员工综合_增加数据', + param: '人员编号=' + code + '=int&角色编号=' + groupNum + '=int&项目编号=10=int' + } + }) +} +export function addData2(lsh, code, groupNum) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '菜单系统模块_项目角色员工综合_修改数据', + param: '人员角色流水号=' + lsh + '&人员编号=' + code + '&角色编号=' + groupNum + } + }) +} +// 初始化科室 +export function initDepartment() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '人事档案管理_部门关系_查询节点' + } + }) +} +// 初始化人员信息 弹出框 +export function getTree() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_部门关系_查询节点', + param: '子节点=0=int' + } + }) +} +export function fn(data, pid) { + const result = [] + let temp + for (let i = 0; i < data.length; i++) { + if (data[i].父节点 === pid) { + const obj = { label: data[i].节点名称, id: data[i].子节点 } + temp = fn(data, data[i].子节点) + if (temp.length > 0) { + obj.children = temp + } + result.push(obj) + } + } + return result +} +export function getTable8(code) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 1, + name: '人事档案管理_人员_部门与人员_查询数据_根据部门编号', + param: '考核部门编号=' + code + '=int' + } + }) +} +export function handledelete(ryjslsh) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: 2, + name: '菜单系统模块_项目角色员工综合_删除数据', + param: '人员角色流水号=' + ryjslsh + '=string' + } + }) +} +export function deleteData(Number) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '菜单系统模块_项目角色员工综合_删除数据', + param: '人员角色流水号=' + Number + '=int' + } + }) +} +export function searchdesigner(num2) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '人事档案管理_人员_部门与人员_查询数据_根据部门编号', + param: '考核部门编号=' + num2 + '=int' + } + }) +} +export function initOrderType() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '菜单系统模块_项目角色_查询数据_new' + } + }) +} +export function searchTable(check1, staffName, check2, systemAdministrator) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '菜单系统模块_项目角色员工综合_查询数据', + param: '姓名_check=' + check1 + '=int&姓名=' + staffName + '=string&角色编号_check=' + check2 + ' =int&角色编号=' + systemAdministrator + '=int' + } + }) +} diff --git a/src/api/BasicData/WorkshopProcessMaintenance.js b/src/api/BasicData/WorkshopProcessMaintenance.js new file mode 100644 index 0000000..4c6fdcf --- /dev/null +++ b/src/api/BasicData/WorkshopProcessMaintenance.js @@ -0,0 +1,184 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' +// 查工艺分类名称 +export function searchProcessClassification() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '车间生产管理工艺_基础表_工艺分类名称_查询数据' + } + }) +} +// 增加工艺分类 +export function addProcessClassification(ProcessClassification) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '车间生产管理工艺_基础表_工艺分类名称_增加数据', + param: '工艺分类名称=' + ProcessClassification + } + }) +} +// 编辑工艺分类 +export function editProcessClassification(ProcessClassificationNum, ProcessClassification) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '车间生产管理工艺_基础表_工艺分类名称_修改数据', + param: '工艺分类流水号=' + ProcessClassificationNum + '&工艺分类名称=' + ProcessClassification + } + }) +} +// 通过工艺编分类流水号查工艺分类名称 +export function searchProcessClassificationOfProcessClassificationNum(ProcessNum) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '车间生产管理工艺_基础表_工艺分类名称_根据流水号_查询数据_MESWORK', + param: '工艺分类流水号=' + ProcessNum + } + }) +} +// 删除工艺分类 +export function delProcessClassification(ProcessClassificationNum) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '车间生产管理工艺_基础表_工艺分类名称_删除数据', + param: '工艺分类流水号=' + ProcessClassificationNum + } + }) +} +// 通过工艺分类流水号查工艺名称 +export function searchProcessNameOfProcessClassification(ProcessClassificationNum) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '车间生产管理工艺_基础表_工艺名称_查询数据_按工艺分类流水号查_MESWORK', + param: '工艺分类流水号=' + ProcessClassificationNum + } + }) +} +// 通过工艺编号查工艺要求 +export function searchTechnologicalRequirementsOfProcessNum(ProcessNum) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '车间生产管理_基础表_工艺要求_查询数据', + param: '工艺编号=' + ProcessNum + } + }) +} +// 增加工艺 +export function addProcess(ProcessClassificationNum, ProcessName, ShortName) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: 'dbo.车间生产管理工艺_基础表_工艺名称_增加数据', + param: '工艺分类流水号=' + ProcessClassificationNum + '&工艺名称=' + ProcessName + '&工艺名称简称=' + ShortName + } + }) +} +// 编辑工艺 +export function editProcess(ProcessClassificationNum, ProcessName, ShortName, Requirement) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '车间生产管理工艺_基础表_工艺名称_修改名称及简称', + param: '工艺编号=' + ProcessClassificationNum + '&工艺名称=' + ProcessName + '&工艺名称简称=' + ShortName + '&工艺要求=' + Requirement + } + }) +} +// 删除工艺 +export function delProcess(ProcessNum) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '车间生产管理工艺_基础表_工艺名称_删除数据', + param: '工艺编号=' + ProcessNum + } + }) +} +// 新增工艺要求 +export function addTechnologicalRequirements(ProcessClassificationNum, ProcessName) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '车间生产管理_基础表_工艺要求_增加数据', + param: '工艺编号=' + ProcessClassificationNum + '&工艺要求=' + ProcessName + } + }) +} +// 编辑工艺要求 +export function editTechnologicalRequirements(ProcessClassificationNum, ProcessName) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '车间生产管理_基础表_工艺要求_修改数据', + param: '工艺要求流水号=' + ProcessClassificationNum + '&工艺要求=' + ProcessName + } + }) +} +// 删除工艺要求 +export function delTechnologicalRequirements(ProcessClassificationNum) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '车间生产管理_基础表_工艺要求_删除数据', + param: '工艺要求流水号=' + ProcessClassificationNum + } + }) +} diff --git a/src/api/BasicData/maintenanceEquipmentPerson.js b/src/api/BasicData/maintenanceEquipmentPerson.js new file mode 100644 index 0000000..ee60d7e --- /dev/null +++ b/src/api/BasicData/maintenanceEquipmentPerson.js @@ -0,0 +1,115 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' + +// 初始化设备名称 +export function getEquipment(id, equipmentNum) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '设备管理_设备名称与班次关系_查询数据', + param: `查询代码=${id}=int&设备流水号=${equipmentNum}` + } + }) +} + +export function getDepartment() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '设备管理_部门查询' + } + }) +} + +export function getTablePeople(number) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '人事档案管理_人员_部门与人员_查询数据_根据部门编号', + param: `考核部门编号=${number}` + } + }) +} + +export function getTableData(equipmentCheck, equipmentNameValue, operatorCheck, operatorNumber, pageCurrent, pageSize) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '设备管理_设备名称_人员关系_查询数据', + param: `设备流水号_check=${equipmentCheck}&设备流水号=${equipmentNameValue}&操作者编号_check=${operatorCheck}&操作者编号=${operatorNumber}`, + pagination: pageCurrent + '&' + pageSize + } + }) +} + +export function deleteTable(number) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '设备管理_设备名称_人员关系_删除数据', + param: '设备人员关系流水号=' + number + '=int' + } + }) +} + +export function getStaff() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '设备管理_基础表_班次表_查询班次' + } + }) +} + +export function addTable(equipmentNumber, shift, operator, operatorNumber) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '设备管理_设备名称_人员关系_增加数据', + param: '设备流水号=' + equipmentNumber + '=int&班次代码=' + shift + '=int&操作者=' + operator + '=string&操作者编号=' + operatorNumber + '=int' + } + }) +} + +export function editTable(equipmentNumber, shift, operator, operatorNumber, Number) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '设备管理_设备名称_人员关系_修改数据', + param: '设备流水号=' + equipmentNumber + '=int&班次代码=' + shift + '=int&操作者=' + operator + '=string&操作者编号=' + operatorNumber + '=int&设备人员关系流水号=' + Number + '=int' + } + }) +} diff --git a/src/api/FactoryCalendar.js b/src/api/FactoryCalendar.js new file mode 100644 index 0000000..166b01c --- /dev/null +++ b/src/api/FactoryCalendar.js @@ -0,0 +1,5 @@ +import axios from 'axios' + +export function getLine() { + return axios.post(window.dt_Config.ip + '/submit/QualityData_NormalDistribution.ashx?type=GetBaseTrendData') +} diff --git a/src/api/ManufacturingCenter/maintainInformation.js b/src/api/ManufacturingCenter/maintainInformation.js new file mode 100644 index 0000000..6ba2f91 --- /dev/null +++ b/src/api/ManufacturingCenter/maintainInformation.js @@ -0,0 +1,198 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' + +// 获取工位 表1 +export function getTableData1() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '3', + name: ` + SELECT 基础数据_点检类型名称.*,[基础数据_设备工位点检表].*,[MES_计划BOM_工位与名称].工位名称 FROM [基础数据_设备工位点检表] + inner join dbo.基础数据_点检类型名称 + on [基础数据_设备工位点检表].点检表类型 = 基础数据_点检类型名称.点检表类型流水号 + inner join [MES_计划BOM_工位与名称] + on [MES_计划BOM_工位与名称].工位号 = [基础数据_设备工位点检表].工位号 + ` + } + }) +} +// 点检类型 表2 +export function getTableData2() { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '3', + name: 'select * from 基础数据_点检类型名称' + } + }) +} +// 点检内容 表3 +export function getTableData3(num) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '3', + name: `select * from 基础数据_点检内容 where 点检表类型 = ${num}` + } + }) +} +// 表1 编辑 +export function editType(num1, num2) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '4', + name: `update [基础数据_设备工位点检表] set 点检表类型 = ${num1} where ID = ${num2}` + } + }) +} +export function confirmEdit1(num1, num2) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '4', + name: `update [基础数据_点检类型名称] set 点检表类型名称 = '${num1}' where 点检表类型流水号 = ${num2}` + } + }) +} +export function confirmEdit2(num1, num2, num3) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '4', + name: `update 基础数据_点检内容 set 保养周期 = ${num1} ,保养项目 = '${num2}' where ID = ${num3}` + } + }) +} +export function openDelete1(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '4', + name: `delete 基础数据_点检类型名称 where 点检表类型流水号 = ${num1}` + } + }) +} +export function selectCount(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '3', + name: `SELECT 工位号 FROM [基础数据_设备工位点检表] where 点检表类型 = ${num1}` + } + }) +} +export function openDelete2(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '4', + name: `delete 基础数据_点检内容 where ID = ${num1}` + } + }) +} +export function submit1(num1) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '4', + name: `insert into 基础数据_点检类型名称 (点检表类型名称) values ('${num1}')` + } + }) +} +export function submit2(num1, num2, num3) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '4', + name: ` declare @id int = 0 + SELECT top 1 @id = ID FROM [dbo].基础数据_点检内容 order by ID desc + set @id = @id + 1 + insert into 基础数据_点检内容 (点检任务编号,点检表类型,保养项目,保养周期) values (@id,${num1},'${num2}',${num3})` + } + }) +} +export function exportOut(num1, num2, num3) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '3', + name: `SELECT * + ,case when [FN1] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN1]) else '' end as [姓名1] + ,case when [FN2] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN2]) else '' end as [姓名2] + ,case when [FN3] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN3]) else '' end as [姓名3] + ,case when [FN4] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN4]) else '' end as [姓名4] + ,case when [FN5] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN5]) else '' end as [姓名5] + ,case when [FN6] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN6]) else '' end as [姓名6] + ,case when [FN7] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN7]) else '' end as [姓名7] + ,case when [FN8] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN8]) else '' end as [姓名8] + ,case when [FN9] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN9]) else '' end as [姓名9] + ,case when [FN10] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN10]) else '' end as [姓名10] + ,case when [FN11] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN11]) else '' end as [姓名11] + ,case when [FN12] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN12]) else '' end as [姓名12] + ,case when [FN13] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN13]) else '' end as [姓名13] + ,case when [FN14] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN14]) else '' end as [姓名14] + ,case when [FN15] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN15]) else '' end as [姓名15] + ,case when [FN16] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN16]) else '' end as [姓名16] + ,case when [FN17] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN17]) else '' end as [姓名17] + ,case when [FN18] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN18]) else '' end as [姓名18] + ,case when [FN19] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN19]) else '' end as [姓名19] + ,case when [FN20] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN20]) else '' end as [姓名20] + ,case when [FN21] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN21]) else '' end as [姓名21] + ,case when [FN22] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN22]) else '' end as [姓名22] + ,case when [FN23] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN23]) else '' end as [姓名23] + ,case when [FN24] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN24]) else '' end as [姓名24] + ,case when [FN25] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN25]) else '' end as [姓名25] + ,case when [FN26] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN26]) else '' end as [姓名26] + ,case when [FN27] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN27]) else '' end as [姓名27] + ,case when [FN28] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN28]) else '' end as [姓名28] + ,case when [FN29] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN29]) else '' end as [姓名29] + ,case when [FN30] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN30]) else '' end as [姓名30] + ,case when [FN31] in (select 人员编号 from 人事档案管理_人员名单) then (select 姓名 from 人事档案管理_人员名单 where 人员编号 = [FN31]) else '' end as [姓名31] + FROM + [基础数据_设备工位点检表] inner join [工位日点检任务记录] + on [基础数据_设备工位点检表].工位号 = [工位日点检任务记录].工位号 + inner join [基础数据_点检内容] + on [工位日点检任务记录].点检任务编号 = [基础数据_点检内容].点检任务编号 + where [基础数据_设备工位点检表].工位号 = '${num1}' and 年 = '${num2}' and 月 = '${num3}' order by [工位日点检任务记录].点检任务编号` + } + }) +} diff --git a/src/api/SPCanalysis/QualityData_XR.js b/src/api/SPCanalysis/QualityData_XR.js new file mode 100644 index 0000000..dbf0e18 --- /dev/null +++ b/src/api/SPCanalysis/QualityData_XR.js @@ -0,0 +1,15 @@ +import { ip } from '@/api/ipAddress' +import axios from 'axios' + +// 排列表图 +export function GetChart(OPNameCheck, opName, shaftNameCheck, shaftName, itemNameCheck, itemName, EngineTypeIDCheck, EngineTypeID, startTime, endTime, yangben, num) { + return axios.post(ip + '/submit/QualityData_XR.ashx?type=GetChart&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + shaftName + '&itemNameCheck=' + itemNameCheck + '&itemName=' + itemName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + EngineTypeID + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num) +} +// 均值图&极差图&正态分布图 +export function GetBaseTrendData(OPNameCheck, opName, shaftNameCheck, shaftName, itemNameCheck, itemName, EngineTypeIDCheck, EngineTypeID, startTime, endTime, yangben, num) { + return axios.post(ip + '/submit/QualityData_XR.ashx?type=GetBaseTrendData&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + shaftName + '&itemNameCheck=' + itemNameCheck + '&itemName=' + itemName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + EngineTypeID + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num) +} +// 分析线及Y轴/X轴 +export function GetMarkLineByConditent(OPNameCheck, opName, shaftNameCheck, shaftName, itemNameCheck, itemName, EngineTypeIDCheck, EngineTypeID, startTime, endTime, yangben, num) { + return axios.post(ip + '/submit/QualityData_XR.ashx?type=GetMarkLineByConditent&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + shaftName + '&itemNameCheck=' + itemNameCheck + '&itemName=' + itemName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + EngineTypeID + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num) +} diff --git a/src/api/SPCanalysis/QualityData_XS.js b/src/api/SPCanalysis/QualityData_XS.js new file mode 100644 index 0000000..e9abdc8 --- /dev/null +++ b/src/api/SPCanalysis/QualityData_XS.js @@ -0,0 +1,11 @@ +import { ip } from '@/api/ipAddress' +import axios from 'axios' + +// 均值图&极差图&正态分布图 +export function GetBaseTrendData(OPNameCheck, opName, shaftNameCheck, shaftName, itemNameCheck, itemName, EngineTypeIDCheck, EngineTypeID, startTime, endTime, yangben, num) { + return axios.post(ip + '/submit/QualityData_XS.ashx?type=GetBaseTrendData&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + shaftName + '&itemNameCheck=' + itemNameCheck + '&itemName=' + itemName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + EngineTypeID + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num) +} +// 分析线及Y轴/X轴 +export function GetMarkLineByConditent(OPNameCheck, opName, shaftNameCheck, shaftName, itemNameCheck, itemName, EngineTypeIDCheck, EngineTypeID, startTime, endTime, yangben, num) { + return axios.post(ip + '/submit/QualityData_XS.ashx?type=GetMarkLineByConditent&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + shaftName + '&itemNameCheck=' + itemNameCheck + '&itemName=' + itemName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + EngineTypeID + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num) +} diff --git a/src/api/SPCanalysis/_system~.ini b/src/api/SPCanalysis/_system~.ini new file mode 100644 index 0000000..e69de29 diff --git a/src/api/SPCanalysis/arrangeChart.js b/src/api/SPCanalysis/arrangeChart.js new file mode 100644 index 0000000..bdea302 --- /dev/null +++ b/src/api/SPCanalysis/arrangeChart.js @@ -0,0 +1,11 @@ +import { ip } from '@/api/ipAddress' +import axios from 'axios' + +// 获取表格数据--质量数据查询_综合查询_数据分组_大柴 +export function getList(OPNameCheck, opName, shaftNameCheck, measureName, EngineTypeIDCheck, model, itemNameCheck, measureContent, startTime, endTime, yangben, num, pageSize, pageCurrent) { + return axios.post(ip + '/submit/QualityData_Histogram.ashx?type=GetDataTableByConditent&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + measureName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + model + '&itemNameCheck=' + itemNameCheck + '&itemName=' + measureContent + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num + '&page=' + pageCurrent + '&rows=' + pageSize) +} +// 获取图形数据--质量数据查询_综合查询_数据分组_绘趋势图_DC +export function getLine(OPNameCheck, opName, shaftNameCheck, measureName, EngineTypeIDCheck, model, itemNameCheck, measureContent, startTime, endTime, yangben, num) { + return axios.post(ip + '/submit/QualityData_Pareto.ashx?type=GetChart&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + measureName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + model + '&itemNameCheck=' + itemNameCheck + '&itemName=' + measureContent + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num) +} diff --git a/src/api/SPCanalysis/basicTrendTap.js b/src/api/SPCanalysis/basicTrendTap.js new file mode 100644 index 0000000..f92e9ec --- /dev/null +++ b/src/api/SPCanalysis/basicTrendTap.js @@ -0,0 +1,15 @@ +import { ip } from '@/api/ipAddress' +import axios from 'axios' + +// 获取表格数据--质量数据_发动机质量数据_各个工位_视图_综合查询_趋势图_LLJ +export function getList(OPNameCheck, opName, shaftNameCheck, shaftName, itemNameCheck, itemName, EngineTypeIDCheck, EngineTypeID, timeValue, pageSize, pageCurrent) { + return axios.post(ip + '/submit/QualityData_TrendPictureBasic.ashx?type=GetDataTableByConditent&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + shaftName + '&itemNameCheck=' + itemNameCheck + '&itemName=' + itemName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + EngineTypeID + '&startTime=' + timeValue[0] + '&endTime=' + timeValue[1] + '&page=' + pageCurrent + '&rows=' + pageSize) +} +// ------质量数据_发动机质量数据_各个工位_视图_综合查询_趋势图 +export function getLine(OPNameCheck, opName, shaftNameCheck, shaftName, itemNameCheck, itemName, EngineTypeIDCheck, EngineTypeID, startTime, endTime, pageSize, pageCurrent) { + return axios.post(ip + '/submit/QualityData_TrendPictureBasic.ashx?type=GetMarkLineByConditent&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + shaftName + '&itemNameCheck=' + itemNameCheck + '&itemName=' + itemName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + EngineTypeID + '&startTime=' + startTime + '&endTime=' + endTime + '&page=' + pageCurrent + '&rows=' + pageSize) +} +// 获取图形数据--质量数据查询_综合查询_绘趋势图_DC +export function getEchart(OPNameCheck, opName, shaftNameCheck, shaftName, itemNameCheck, itemName, EngineTypeIDCheck, EngineTypeID, startTime, endTime) { + return axios.post(ip + '/submit/QualityData_TrendPictureBasic.ashx?type=GetBaseTrendData&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + shaftName + '&itemNameCheck=' + itemNameCheck + '&itemName=' + itemName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + EngineTypeID + '&startTime=' + startTime + '&endTime=' + endTime) +} diff --git a/src/api/SPCanalysis/histogram.js b/src/api/SPCanalysis/histogram.js new file mode 100644 index 0000000..f09ed04 --- /dev/null +++ b/src/api/SPCanalysis/histogram.js @@ -0,0 +1,15 @@ +import { ip } from '@/api/ipAddress' +import axios from 'axios' + +// 获取表格数据--质量数据查询_综合查询_数据分组_大柴 +export function getList(OPNameCheck, opName, shaftNameCheck, measureName, EngineTypeIDCheck, model, itemNameCheck, measureContent, startTime, endTime, yangben, num, pageSize, pageCurrent) { + return axios.post(ip + '/submit/QualityData_Histogram.ashx?type=GetDataTableByConditent&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + measureName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + model + '&itemNameCheck=' + itemNameCheck + '&itemName=' + measureContent + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num + '&page=' + pageCurrent + '&rows=' + pageSize) +} +// 获取图形数据--质量数据查询_综合查询_数据分组_大柴 +export function getLine(OPNameCheck, opName, shaftNameCheck, measureName, EngineTypeIDCheck, model, itemNameCheck, measureContent, startTime, endTime, yangben, num) { + return axios.post(ip + '/submit/QualityData_Histogram.ashx?type=data1&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + measureName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + model + '&itemNameCheck=' + itemNameCheck + '&itemName=' + measureContent + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num) +} +// 获取x轴数据--质量数据查询_综合查询_数据分组_大柴 +export function getxData(OPNameCheck, opName, shaftNameCheck, measureName, EngineTypeIDCheck, model, itemNameCheck, measureContent, startTime, endTime, yangben, num) { + return axios.post(ip + '/submit/QualityData_Histogram.ashx?type=data&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + measureName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + model + '&itemNameCheck=' + itemNameCheck + '&itemName=' + measureContent + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num) +} diff --git a/src/api/SPCanalysis/normal_distribution.js b/src/api/SPCanalysis/normal_distribution.js new file mode 100644 index 0000000..53cd339 --- /dev/null +++ b/src/api/SPCanalysis/normal_distribution.js @@ -0,0 +1,24 @@ +import { ip } from '@/api/ipAddress' +import axios from 'axios' + +// 获取表格数据--质量数据查询_综合查询_数据分组_大柴 +export function bargetList(OPNameCheck, opName, shaftNameCheck, measureName, EngineTypeIDCheck, model, itemNameCheck, measureContent, startTime, endTime, yangben, num, pageSize, pageCurrent) { + return axios.post(ip + '/submit/QualityData_Histogram.ashx?type=GetDataTableByConditent&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + measureName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + model + '&itemNameCheck=' + itemNameCheck + '&itemName=' + measureContent + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num + '&page=' + pageCurrent + '&rows=' + pageSize) +} +// 获取图形数据--质量数据查询_综合查询_数据分组_大柴 +export function bargetLine(OPNameCheck, opName, shaftNameCheck, measureName, EngineTypeIDCheck, model, itemNameCheck, measureContent, startTime, endTime, yangben, num) { + return axios.post(ip + '/submit/QualityData_Histogram.ashx?type=data1&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + measureName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + model + '&itemNameCheck=' + itemNameCheck + '&itemName=' + measureContent + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num) +} +// 获取x轴数据--质量数据查询_综合查询_数据分组_大柴 +export function bargetxData(OPNameCheck, opName, shaftNameCheck, measureName, EngineTypeIDCheck, model, itemNameCheck, measureContent, startTime, endTime, yangben, num) { + return axios.post(ip + '/submit/QualityData_Histogram.ashx?type=data&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + measureName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + model + '&itemNameCheck=' + itemNameCheck + '&itemName=' + measureContent + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num) +} + +// 获取表格数据--质量数据查询_综合查询_数据分组_大柴 +export function linegetList(OPNameCheck, opName, shaftNameCheck, measureName, EngineTypeIDCheck, model, itemNameCheck, measureContent, startTime, endTime, yangben, num, pageSize, pageCurrent) { + return axios.post(ip + '/submit/QualityData_Histogram.ashx?type=GetDataTableByConditent&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + measureName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + model + '&itemNameCheck=' + itemNameCheck + '&itemName=' + measureContent + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num + '&page=' + pageCurrent + '&rows=' + pageSize) +} +// 获取图形数据 +export function linegetLine(OPNameCheck, opName, shaftNameCheck, measureName, EngineTypeIDCheck, model, itemNameCheck, measureContent, startTime, endTime, yangben, num, Usl, Lsl) { + return axios.post(ip + '/submit/QualityData_NormalDistribution.ashx?type=GetBaseTrendData&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + measureName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + model + '&itemNameCheck=' + itemNameCheck + '&itemName=' + measureContent + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num + '&Usl=' + Usl + '&Lsl=' + Lsl) +} diff --git a/src/api/SPCanalysis/processCapabilityAnalysis.js b/src/api/SPCanalysis/processCapabilityAnalysis.js new file mode 100644 index 0000000..f05e2b4 --- /dev/null +++ b/src/api/SPCanalysis/processCapabilityAnalysis.js @@ -0,0 +1,11 @@ +import { ip } from '@/api/ipAddress' +import axios from 'axios' + +// 获取表格数据--质量数据查询_综合查询_数据分组_大柴 +export function getList(OPNameCheck, opName, shaftNameCheck, measureName, EngineTypeIDCheck, model, itemNameCheck, measureContent, startTime, endTime, yangben, num, pageSize, pageCurrent) { + return axios.post(ip + '/submit/QualityData_Histogram.ashx?type=GetDataTableByConditent&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + measureName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + model + '&itemNameCheck=' + itemNameCheck + '&itemName=' + measureContent + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num + '&page=' + pageCurrent + '&rows=' + pageSize) +} +// 获取图形数据 +export function getLine(OPNameCheck, opName, shaftNameCheck, measureName, EngineTypeIDCheck, model, itemNameCheck, measureContent, startTime, endTime, yangben, num, Usl, Lsl) { + return axios.post(ip + '/submit/QualityData_NormalDistribution.ashx?type=GetBaseTrendData&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + measureName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + model + '&itemNameCheck=' + itemNameCheck + '&itemName=' + measureContent + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num + '&Usl=' + Usl + '&Lsl=' + Lsl) +} diff --git a/src/api/SPCanalysis/sampleTrendChart.js b/src/api/SPCanalysis/sampleTrendChart.js new file mode 100644 index 0000000..7d079d7 --- /dev/null +++ b/src/api/SPCanalysis/sampleTrendChart.js @@ -0,0 +1,11 @@ +import { ip } from '@/api/ipAddress' +import axios from 'axios' + +// 获取表格数据--质量数据查询_综合查询_数据分组_大柴 +export function getList(OPNameCheck, opName, shaftNameCheck, measureName, EngineTypeIDCheck, model, itemNameCheck, measureContent, startTime, endTime, yangben, num, pageSize, pageCurrent) { + return axios.post(ip + '/submit/QualityData_TrendPicture.ashx?type=GetDataTableByConditent&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + measureName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + model + '&itemNameCheck=' + itemNameCheck + '&itemName=' + measureContent + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num + '&page=' + pageCurrent + '&rows=' + pageSize) +} +// 获取图形数据--质量数据查询_综合查询_数据分组_绘趋势图_DC +export function getLine(OPNameCheck, opName, shaftNameCheck, measureName, EngineTypeIDCheck, model, itemNameCheck, measureContent, startTime, endTime, yangben, num) { + return axios.post(ip + '/submit/QualityData_TrendPicture.ashx?type=GetBaseTrendData&OPNameCheck=' + OPNameCheck + '&OPName=' + opName + '&shaftNameCheck=' + shaftNameCheck + '&shaftName=' + measureName + '&EngineTypeIDCheck=' + EngineTypeIDCheck + '&EngineTypeID=' + model + '&itemNameCheck=' + itemNameCheck + '&itemName=' + measureContent + '&startTime=' + startTime + '&endTime=' + endTime + '&Yangben=' + yangben + '&Num=' + num) +} diff --git a/src/api/b1s.js b/src/api/b1s.js new file mode 100644 index 0000000..fcae96e --- /dev/null +++ b/src/api/b1s.js @@ -0,0 +1,98 @@ +// src/api/b1s.js +import axios from 'axios'; + + +// 创建 axios 实例 +const b1s = axios.create({ + timeout: 100000, + baseURL: window.dt_Config.baseURLB1, + headers: { + 'Content-Type': 'application/json' + } +}); + + +export async function getB1(url, params) { + try { + + // const paramsGet = { + // func:"GET", + // cmd: url.replace('/', ''), + // content: new URLSearchParams(params).toString()//.replace('%24', '') + // } + const paramsGet = { + func:"GET", + cmd: url.replace('/', ''), + content: JSON.stringify(params) + } + const res = await b1s.post('',paramsGet); + return { success: true, data: res.data }; + } catch (error) { + console.log('GET', error) + const msg = extractB1Error(error); + return { success: false, message: msg }; + } +} + +export async function postB1(url, data) { + try { + const params = { + func:"POST", + cmd: url.replace('/', ''), + content: JSON.stringify(data) + } + const res = await b1s.post('', params); + console.log(res) + return { success: true, data: res.data }; + } catch (error) { + console.log('POST', error) + const msg = extractB1Error(error); + return { success: false, message: msg }; + } +} +export async function patchB1(url, data) { + try { + const params = { + func:"PATCH", + cmd: url.replace('/', ''), + content: JSON.stringify(data) + } + const res = await b1s.post('', params); + console.log('PATCH 请求成功:', res); + return { success: true, data: res.data }; + } catch (error) { + console.log('PATCH', error) + const msg = extractB1Error(error); // 複用你的錯誤提取函數 + console.error('PATCH 请求失败:', msg); + return { success: false, message: msg }; + } +} + +// src/api/b1s.js 内部定义 +function extractB1Error(error) { + if (!error) return '未知错误'; + + // 优先取 SAP B1 返回的错误信息 + if ( + error.response && + error.response.data && + error.response.data.error + ) { + const b1Error = error.response.data.error; + if (b1Error.message && b1Error.message.value) { + return b1Error.message.value; + } else if (typeof b1Error.message === 'string') { + return b1Error.message; + } else { + return b1Error.code || 'SAP B1 错误'; + } + } + + // 网络错误、超时等 + if (error.message) { + return error.message; + } + + return '请求失败,请检查网络或服务状态'; +} + diff --git a/src/api/ipAddress.js b/src/api/ipAddress.js new file mode 100644 index 0000000..65b86f9 --- /dev/null +++ b/src/api/ipAddress.js @@ -0,0 +1,4 @@ +export const ip = 'http://localhost:8051' +// export const ip = 'http://124.220.15.242:8154' // AP +// export const ip = 'http://124.220.15.242:8153' // 福田 + diff --git a/src/api/login.js b/src/api/login.js new file mode 100644 index 0000000..c94be09 --- /dev/null +++ b/src/api/login.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' +import state from '@/store' +import router from '@/router' +export function login(username, password) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '菜单模块系统_用户名密码_查询数据', + param: `用户名=${username}&密码=${password}` + } + }) +} +// +export function getInfo(token) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '1', + name: '菜单模块系统_项目角色模块列表_二级_查询数据', + param: `角色编号=${token}` + } + }) +} +// 修改密码 +export function editPassword(num1, num2, num3, num4) { + return request({ + url: '', + method: 'post', + data: { + UserID: state.state.user.id, + ModularID: router.currentRoute.path, + type: '2', + name: '账号信息_修改密码_MESWORK', + param: '考勤编号=' + num1 + '=string&原始密码=' + num2 + '=string&新密码=' + num3 + '=string&返回=' + num4 + '=string=output' + } + }) +} diff --git a/src/api/tm.js b/src/api/tm.js new file mode 100644 index 0000000..97c2c15 --- /dev/null +++ b/src/api/tm.js @@ -0,0 +1,96 @@ +// src/api/b1s.js +import axios from 'axios'; + +// 创建 axios 实例 +const tm = axios.create({ + timeout: 100000, + baseURL: window.dt_Config.baseURLtm, + headers: { + 'Content-Type': 'application/json' + } +}); + + +export async function gettm(url, params) { + try { + + // const paramsGet = { + // func:"GET", + // cmd: url.replace('/', ''), + // content: new URLSearchParams(params).toString()//.replace('%24', '') + // } + const paramsGet = { + func:"GET", + cmd: url.replace('/', ''), + content: JSON.stringify(params) + } + const res = await tm.post('',paramsGet); + return { success: true, data: res.data }; + } catch (error) { + console.log('GET', error) + const msg = extractB1Error(error); + return { success: false, message: msg }; + } +} + +export async function posttm(url, data) { + try { + const params = { + func:"POST", + cmd: url.replace('/', ''), + content: JSON.stringify(data) + } + const res = await tm.post('', params); + console.log(res) + return { success: true, data: res.data }; + } catch (error) { + console.log('POST', error) + const msg = extractB1Error(error); + return { success: false, message: msg }; + } +} +export async function patchtm(url, data) { + try { + const params = { + func:"PATCH", + cmd: url.replace('/', ''), + content: JSON.stringify(data) + } + const res = await tm.post('', params); + console.log('PATCH 请求成功:', res); + return { success: true, data: res.data }; + } catch (error) { + console.log('PATCH', error) + const msg = extractB1Error(error); // 複用你的錯誤提取函數 + console.error('PATCH 请求失败:', msg); + return { success: false, message: msg }; + } +} + +// src/api/b1s.js 内部定义 +function extractB1Error(error) { + if (!error) return '未知错误'; + + // 优先取 SAP B1 返回的错误信息 + if ( + error.response && + error.response.data && + error.response.data.error + ) { + const b1Error = error.response.data.error; + if (b1Error.message && b1Error.message.value) { + return b1Error.message.value; + } else if (typeof b1Error.message === 'string') { + return b1Error.message; + } else { + return b1Error.code || 'SAP B1 错误'; + } + } + + // 网络错误、超时等 + if (error.message) { + return error.message; + } + + return '请求失败,请检查网络或服务状态'; +} diff --git a/src/assets/404_images/404.png b/src/assets/404_images/404.png new file mode 100644 index 0000000..3d8e230 Binary files /dev/null and b/src/assets/404_images/404.png differ diff --git a/src/assets/404_images/404_cloud.png b/src/assets/404_images/404_cloud.png new file mode 100644 index 0000000..c6281d0 Binary files /dev/null and b/src/assets/404_images/404_cloud.png differ diff --git a/src/assets/img/DFlogo.png b/src/assets/img/DFlogo.png new file mode 100644 index 0000000..93b81bf Binary files /dev/null and b/src/assets/img/DFlogo.png differ diff --git a/src/assets/img/Init1.png b/src/assets/img/Init1.png new file mode 100644 index 0000000..0553eb9 Binary files /dev/null and b/src/assets/img/Init1.png differ diff --git a/src/assets/img/blueTWinkle.gif b/src/assets/img/blueTWinkle.gif new file mode 100644 index 0000000..42deff1 Binary files /dev/null and b/src/assets/img/blueTWinkle.gif differ diff --git a/src/assets/img/gray.png b/src/assets/img/gray.png new file mode 100644 index 0000000..5cb1c3f Binary files /dev/null and b/src/assets/img/gray.png differ diff --git a/src/assets/img/grayTwinkle.gif b/src/assets/img/grayTwinkle.gif new file mode 100644 index 0000000..9a11d35 Binary files /dev/null and b/src/assets/img/grayTwinkle.gif differ diff --git a/src/assets/img/green.png b/src/assets/img/green.png new file mode 100644 index 0000000..e1cc704 Binary files /dev/null and b/src/assets/img/green.png differ diff --git a/src/assets/img/index.png b/src/assets/img/index.png new file mode 100644 index 0000000..a546e97 Binary files /dev/null and b/src/assets/img/index.png differ diff --git a/src/assets/img/leftPic.png b/src/assets/img/leftPic.png new file mode 100644 index 0000000..f51f83b Binary files /dev/null and b/src/assets/img/leftPic.png differ diff --git a/src/assets/img/logo.png b/src/assets/img/logo.png new file mode 100644 index 0000000..5a1a117 Binary files /dev/null and b/src/assets/img/logo.png differ diff --git a/src/assets/img/user.jpg b/src/assets/img/user.jpg new file mode 100644 index 0000000..a968d95 Binary files /dev/null and b/src/assets/img/user.jpg differ diff --git a/src/assets/img/yellowTwinkle.gif b/src/assets/img/yellowTwinkle.gif new file mode 100644 index 0000000..7e277d0 Binary files /dev/null and b/src/assets/img/yellowTwinkle.gif differ diff --git a/src/components/AmountInputBox/AmountInputBox.js b/src/components/AmountInputBox/AmountInputBox.js new file mode 100644 index 0000000..e73c383 --- /dev/null +++ b/src/components/AmountInputBox/AmountInputBox.js @@ -0,0 +1,92 @@ +/** + * @desc 验证整数类型数字方法 + * @param {Object} e + * @param {regular} reg 正则 + * @param {Number} charcode 键盘code + * */ +const checkNumber = (e, reg, charcode) => { + if (!reg.test(String.fromCharCode(charcode)) && charcode > 9 && !e.ctrlKey) { + if (e.preventDefault) { + e.preventDefault() + } else { + e.returnValue = false + } + } +} + +/** + * @desc 验证浮点类型小数方法(建议用text类型的表单) + * @param {Object} e + * @param {regular} reg 正则 + * @param {Number} charcode 键盘code + * @param {Object} el dom对象 + * */ +const checkFloat = (e, reg, charcode, el) => { + if (charcode === 46) { + if (el.children[0].value.includes('.')) { + e.preventDefault() + } + return + } else if ( + !reg.test(String.fromCharCode(charcode)) && + charcode > 9 && + !e.ctrlKey + ) { + if (e.preventDefault) { + e.preventDefault() + } else { + e.returnValue = false + } + } +} +const loading = (e, el, bind) => { + el.disabled = true + setTimeout(function() { + el.disabled = false + }, 3000) +} +/** + * @author LeeYunxiang + * @description 限制数字输入格式 int => 正整数 , num => 自然数(正整数包括0) , float => 正数包括小数(建议用text类型的input表单) + * */ +export default { + key: 'positive', + func: { + inserted(el, bind) { + el.addEventListener('keypress', e => { + e = e || window.event + const charcode = typeof e.charCode === 'number' ? e.charCode : e.keyCode + let reg = null + switch (bind.value) { + case 'num': + reg = /\d/ + checkNumber(e, reg, charcode) + break + case 'int': + if (el.children[0].value.length === 0) { + reg = /^[1-9]$/ + } else { + reg = /\d/ + } + checkNumber(e, reg, charcode) + break + case 'float': + reg = /\d/ + checkFloat(e, reg, charcode, el) + break + case 'notZero': + reg = (/^[1-9][0-9]*$/) + checkFloat(e, reg, charcode, el) + break + } + }) + el.addEventListener('click', e => { + switch (bind.value) { + case 'loading': + loading(e, el, bind) + break + } + }) + } + } +} diff --git a/src/components/AmountInputBox/index.js b/src/components/AmountInputBox/index.js new file mode 100644 index 0000000..75190d5 --- /dev/null +++ b/src/components/AmountInputBox/index.js @@ -0,0 +1,11 @@ +import AmountInputBox from './AmountInputBox.js' +const directives = [AmountInputBox] +export default { + install: Vue => { + if (directives.length && directives.length > 0) { + directives.map(item => { + Vue.directive(item.key, item.func) + }) + } + } +} diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue new file mode 100644 index 0000000..ba8dcfb --- /dev/null +++ b/src/components/Breadcrumb/index.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/src/components/Calendar/calendar.js b/src/components/Calendar/calendar.js new file mode 100644 index 0000000..3f736c3 --- /dev/null +++ b/src/components/Calendar/calendar.js @@ -0,0 +1,526 @@ +/** +* @1900-2100区间内的公历、农历互转 +* @charset UTF-8 +* @Author Jea杨(JJonline@JJonline.Cn) +* @Time 2014-7-21 +* @Time 2016-8-13 Fixed 2033hex、Attribution Annals +* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug +* @Version 1.0.2 +* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] +* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] +*/ +/* eslint-disable */ +var calendar = { + + /** + * 农历1900-2100的润大小信息表 + * @Array Of Property + * @return Hex + */ + lunarInfo:[0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,//1900-1909 + 0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,//1910-1919 + 0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,//1920-1929 + 0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,//1930-1939 + 0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,//1940-1949 + 0x06ca0,0x0b550,0x15355,0x04da0,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,//1950-1959 + 0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,//1960-1969 + 0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,0x195a6,//1970-1979 + 0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,//1980-1989 + 0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,//1990-1999 + 0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,//2000-2009 + 0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,//2010-2019 + 0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,//2020-2029 + 0x05aa0,0x076a3,0x096d0,0x04afb,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,//2030-2039 + 0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,//2040-2049 + /**Add By JJonline@JJonline.Cn**/ + 0x14b63,0x09370,0x049f8,0x04970,0x064b0,0x168a6,0x0ea50, 0x06b20,0x1a6c4,0x0aae0,//2050-2059 + 0x0a2e0,0x0d2e3,0x0c960,0x0d557,0x0d4a0,0x0da50,0x05d55,0x056a0,0x0a6d0,0x055d4,//2060-2069 + 0x052d0,0x0a9b8,0x0a950,0x0b4a0,0x0b6a6,0x0ad50,0x055a0,0x0aba4,0x0a5b0,0x052b0,//2070-2079 + 0x0b273,0x06930,0x07337,0x06aa0,0x0ad50,0x14b55,0x04b60,0x0a570,0x054e4,0x0d160,//2080-2089 + 0x0e968,0x0d520,0x0daa0,0x16aa6,0x056d0,0x04ae0,0x0a9d4,0x0a2d0,0x0d150,0x0f252,//2090-2099 + 0x0d520],//2100 + + /** + * 公历每个月份的天数普通表 + * @Array Of Property + * @return Number + */ + solarMonth:[31,28,31,30,31,30,31,31,30,31,30,31], + + /** + * 天干地支之天干速查表 + * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] + * @return Cn string + */ + Gan:["\u7532","\u4e59","\u4e19","\u4e01","\u620a","\u5df1","\u5e9a","\u8f9b","\u58ec","\u7678"], + + /** + * 天干地支之地支速查表 + * @Array Of Property + * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] + * @return Cn string + */ + Zhi:["\u5b50","\u4e11","\u5bc5","\u536f","\u8fb0","\u5df3","\u5348","\u672a","\u7533","\u9149","\u620c","\u4ea5"], + + /** + * 天干地支之地支速查表<=>生肖 + * @Array Of Property + * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] + * @return Cn string + */ + Animals:["\u9f20","\u725b","\u864e","\u5154","\u9f99","\u86c7","\u9a6c","\u7f8a","\u7334","\u9e21","\u72d7","\u732a"], + + /** + * 24节气速查表 + * @Array Of Property + * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] + * @return Cn string + */ + solarTerm:["\u5c0f\u5bd2","\u5927\u5bd2","\u7acb\u6625","\u96e8\u6c34","\u60ca\u86f0","\u6625\u5206","\u6e05\u660e","\u8c37\u96e8","\u7acb\u590f","\u5c0f\u6ee1","\u8292\u79cd","\u590f\u81f3","\u5c0f\u6691","\u5927\u6691","\u7acb\u79cb","\u5904\u6691","\u767d\u9732","\u79cb\u5206","\u5bd2\u9732","\u971c\u964d","\u7acb\u51ac","\u5c0f\u96ea","\u5927\u96ea","\u51ac\u81f3"], + + /** + * 1900-2100各年的24节气日期速查表 + * @Array Of Property + * @return 0x string For splice + */ + sTermInfo:['9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e','97bcf97c3598082c95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f','b027097bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f','97bd0b06bdb0722c965ce1cfcc920f','b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e','97bcf97c359801ec95f8c965cc920f','97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa','9778397bd19801ec9210c965cc920e','97b6b97bd19801ec95f8c965cc920f', + '97bd09801d98082c95f8e1cfcc920f','97bd097bd097c36b0b6fc9210c8dc2','9778397bd197c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e','97bd09801d98082c95f8e1cfcc920f','97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa','97b6b97bd19801ec95f8c965cc920e','97bcf97c3598082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2','9778397bd097c36c9210c9274c91aa','97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f','97bd097bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e','97bcf97c3598082c95f8c965cc920f','97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e','97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f','97bd097bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e','97bcf97c359801ec95f8c965cc920f','97bd097bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2','9778397bd19801ec9210c9274c920e','97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722','7f0e397bd097c36b0b6fc9210c8dc2','9778397bd097c36c9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f','97bd07f5307f595b0b0bc920fb0722','7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa','97b6b97bd19801ec9210c965cc920e','97bd07f1487f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2','9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e','97bcf7f1487f595b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e','97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722','7f0e397bd07f595b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c9274c920e','97bcf7f0e47f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa','97b6b97bd197c36c9210c9274c920e','97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722','9778397bd097c36b0b6fc9210c8dc2','9778397bd097c36c9210c9274c920e', + '97b6b7f0e47f531b0723b0b6fb0722','7f0e37f5307f595b0b0bc920fb0722','7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b70c9274c91aa','97b6b7f0e47f531b0723b0b6fb0721','7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2','9778397bd097c36b0b6fc9274c91aa','97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f595b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa','97b6b7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa','97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722','9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0787b0721','7f0e27f0e47f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa','97b6b7f0e47f149b0723b0787b0721','7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722','9778397bd097c36b0b6fc9210c8dc2','977837f0e37f149b0723b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722','7f0e37f5307f595b0b0bc920fb0722','7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b0721','7f07e7f0e47f531b0723b0b6fb0721','7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2','977837f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722','977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722','977837f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722','977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721','7f0e27f0e47f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0723b06bd','7f07e7f0e37f149b0723b0787b0721','7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722','977837f0e37f14898082b0723b02d5','7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722','7f0e37f1487f595b0b0bb0b6fb0722','7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721','7f07e7f0e47f531b0723b0b6fb0722','7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5','7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f531b0b0bb0b6fb0722','7f0e37f0e37f14898082b072297c35','7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722','7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35','7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f149b0723b0787b0721', + '7f0e27f1487f531b0b0bb0b6fb0722','7f0e37f0e366aa89801eb072297c35','7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e47f149b0723b0787b0721','7f0e27f0e47f531b0723b0b6fb0722','7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd','7f07e7f0e37f14998083b0787b0721','7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35','7ec967f0e37f14898082b0723b02d5','7f07e7f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722','7f0e36665b66aa89801e9808297c35','665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721','7f07e7f0e47f531b0723b0b6fb0722','7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b0723b02d5','7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721', + '7f0e36665b66a449801e9808297c35','665f67f0e37f14898082b072297c35','7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721','7f0e26665b66a449801e9808297c35','665f67f0e37f1489801eb072297c35', + '7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722'], + + /** + * 数字转中文速查表 + * @Array Of Property + * @trans ['日','一','二','三','四','五','六','七','八','九','十'] + * @return Cn string + */ + nStr1:["\u65e5","\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341"], + + /** + * 日期转农历称呼速查表 + * @Array Of Property + * @trans ['初','十','廿','卅'] + * @return Cn string + */ + nStr2:["\u521d","\u5341","\u5eff","\u5345"], + + /** + * 月份转农历称呼速查表 + * @Array Of Property + * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] + * @return Cn string + */ + nStr3:["\u6b63","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u51ac","\u814a"], + + /** + * 返回农历y年一整年的总天数 + * @param lunar Year + * @return Number + * @eg:var count = calendar.lYearDays(1987) ;//count=387 + */ + lYearDays:function(y) { + var i, sum = 348; + for(i=0x8000; i>0x8; i>>=1) { sum += (calendar.lunarInfo[y-1900] & i)? 1: 0; } + return(sum+calendar.leapDays(y)); + }, + + /** + * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 + * @param lunar Year + * @return Number (0-12) + * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 + */ + leapMonth:function(y) { //闰字编码 \u95f0 + return(calendar.lunarInfo[y-1900] & 0xf); + }, + + /** + * 返回农历y年闰月的天数 若该年没有闰月则返回0 + * @param lunar Year + * @return Number (0、29、30) + * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 + */ + leapDays:function(y) { + if(calendar.leapMonth(y)) { + return((calendar.lunarInfo[y-1900] & 0x10000)? 30: 29); + } + return(0); + }, + + /** + * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 + * @param lunar Year + * @return Number (-1、29、30) + * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 + */ + monthDays:function(y,m) { + if(m>12 || m<1) {return -1}//月份参数从1至12,参数错误返回-1 + return( (calendar.lunarInfo[y-1900] & (0x10000>>m))? 30: 29 ); + }, + + /** + * 返回公历(!)y年m月的天数 + * @param solar Year + * @return Number (-1、28、29、30、31) + * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 + */ + solarDays:function(y,m) { + if(m>12 || m<1) {return -1} //若参数错误 返回-1 + var ms = m-1; + if(ms==1) { //2月份的闰平规律测算后确认返回28或29 + return(((y%4 == 0) && (y%100 != 0) || (y%400 == 0))? 29: 28); + }else { + return(calendar.solarMonth[ms]); + } + }, + + /** + * 农历年份转换为干支纪年 + * @param lYear 农历年的年份数 + * @return Cn string + */ + toGanZhiYear:function(lYear) { + var ganKey = (lYear - 3) % 10; + var zhiKey = (lYear - 3) % 12; + if(ganKey == 0) ganKey = 10;//如果余数为0则为最后一个天干 + if(zhiKey == 0) zhiKey = 12;//如果余数为0则为最后一个地支 + return calendar.Gan[ganKey-1] + calendar.Zhi[zhiKey-1]; + + }, + + /** + * 公历月、日判断所属星座 + * @param cMonth [description] + * @param cDay [description] + * @return Cn string + */ + toAstro:function(cMonth,cDay) { + var s = "\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf"; + var arr = [20,19,21,21,21,22,23,23,23,23,22,22]; + return s.substr(cMonth*2 - (cDay < arr[cMonth-1] ? 2 : 0),2) + "\u5ea7";//座 + }, + + /** + * 传入offset偏移量返回干支 + * @param offset 相对甲子的偏移量 + * @return Cn string + */ + toGanZhi:function(offset) { + return calendar.Gan[offset%10] + calendar.Zhi[offset%12]; + }, + + /** + * 传入公历(!)y年获得该年第n个节气的公历日期 + * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 + * @return day Number + * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 + */ + getTerm:function(y,n) { + if(y<1900 || y>2100) {return -1;} + if(n<1 || n>24) {return -1;} + var _table = calendar.sTermInfo[y-1900]; + var _info = [ + parseInt('0x'+_table.substr(0,5)).toString() , + parseInt('0x'+_table.substr(5,5)).toString(), + parseInt('0x'+_table.substr(10,5)).toString(), + parseInt('0x'+_table.substr(15,5)).toString(), + parseInt('0x'+_table.substr(20,5)).toString(), + parseInt('0x'+_table.substr(25,5)).toString() + ]; + var _calday = [ + _info[0].substr(0,1), + _info[0].substr(1,2), + _info[0].substr(3,1), + _info[0].substr(4,2), + + _info[1].substr(0,1), + _info[1].substr(1,2), + _info[1].substr(3,1), + _info[1].substr(4,2), + + _info[2].substr(0,1), + _info[2].substr(1,2), + _info[2].substr(3,1), + _info[2].substr(4,2), + + _info[3].substr(0,1), + _info[3].substr(1,2), + _info[3].substr(3,1), + _info[3].substr(4,2), + + _info[4].substr(0,1), + _info[4].substr(1,2), + _info[4].substr(3,1), + _info[4].substr(4,2), + + _info[5].substr(0,1), + _info[5].substr(1,2), + _info[5].substr(3,1), + _info[5].substr(4,2), + ]; + return parseInt(_calday[n-1]); + }, + + /** + * 传入农历数字月份返回汉语通俗表示法 + * @param lunar month + * @return Cn string + * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' + */ + toChinaMonth:function(m) { // 月 => \u6708 + if(m>12 || m<1) {return -1} //若参数错误 返回-1 + var s = calendar.nStr3[m-1]; + s+= "\u6708";//加上月字 + return s; + }, + + /** + * 传入农历日期数字返回汉字表示法 + * @param lunar day + * @return Cn string + * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' + */ + toChinaDay:function(d){ //日 => \u65e5 + var s; + switch (d) { + case 10: + s = '\u521d\u5341'; break; + case 20: + s = '\u4e8c\u5341'; break; + break; + case 30: + s = '\u4e09\u5341'; break; + break; + default : + s = calendar.nStr2[Math.floor(d/10)]; + s += calendar.nStr1[d%10]; + } + return(s); + }, + + /** + * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” + * @param y year + * @return Cn string + * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' + */ + getAnimal: function(y) { + return calendar.Animals[(y - 4) % 12] + }, + + /** + * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON + * @param y solar year + * @param m solar month + * @param d solar day + * @return JSON object + * @eg:console.log(calendar.solar2lunar(1987,11,01)); + */ + solar2lunar:function (y,m,d) { //参数区间1900.1.31~2100.12.31 + if(y<1900 || y>2100) {return -1;}//年份限定、上限 + if(y==1900&&m==1&&d<31) {return -1;}//下限 + if(!y) { //未传参 获得当天 + var objDate = new Date(); + }else { + var objDate = new Date(y,parseInt(m)-1,d) + } + var i, leap=0, temp=0; + //修正ymd参数 + var y = objDate.getFullYear(),m = objDate.getMonth()+1,d = objDate.getDate(); + var offset = (Date.UTC(objDate.getFullYear(),objDate.getMonth(),objDate.getDate()) - Date.UTC(1900,0,31))/86400000; + for(i=1900; i<2101 && offset>0; i++) { temp=calendar.lYearDays(i); offset-=temp; } + if(offset<0) { offset+=temp; i--; } + + //是否今天 + var isTodayObj = new Date(),isToday=false; + if(isTodayObj.getFullYear()==y && isTodayObj.getMonth()+1==m && isTodayObj.getDate()==d) { + isToday = true; + } + //星期几 + var nWeek = objDate.getDay(),cWeek = calendar.nStr1[nWeek]; + if(nWeek==0) {nWeek =7;}//数字表示周几顺应天朝周一开始的惯例 + //农历年 + var year = i; + + var leap = calendar.leapMonth(i); //闰哪个月 + var isLeap = false; + + //效验闰月 + for(i=1; i<13 && offset>0; i++) { + //闰月 + if(leap>0 && i==(leap+1) && isLeap==false){ + --i; + isLeap = true; temp = calendar.leapDays(year); //计算农历闰月天数 + } + else{ + temp = calendar.monthDays(year, i);//计算农历普通月天数 + } + //解除闰月 + if(isLeap==true && i==(leap+1)) { isLeap = false; } + offset -= temp; + } + + if(offset==0 && leap>0 && i==leap+1) + if(isLeap){ + isLeap = false; + }else{ + isLeap = true; --i; + } + if(offset<0){ offset += temp; --i; } + //农历月 + var month = i; + //农历日 + var day = offset + 1; + + //天干地支处理 + var sm = m-1; + var gzY = calendar.toGanZhiYear(year); + + //月柱 1900年1月小寒以前为 丙子月(60进制12) + var firstNode = calendar.getTerm(year,(m*2-1));//返回当月「节」为几日开始 + var secondNode = calendar.getTerm(year,(m*2));//返回当月「节」为几日开始 + + //依据12节气修正干支月 + var gzM = calendar.toGanZhi((y-1900)*12+m+11); + if(d>=firstNode) { + gzM = calendar.toGanZhi((y-1900)*12+m+12); + } + + //传入的日期的节气与否 + var isTerm = false; + var Term = null; + if(firstNode==d) { + isTerm = true; + Term = calendar.solarTerm[m*2-2]; + } + if(secondNode==d) { + isTerm = true; + Term = calendar.solarTerm[m*2-1]; + } + //日柱 当月一日与 1900/1/1 相差天数 + var dayCyclical = Date.UTC(y,sm,1,0,0,0,0)/86400000+25567+10; + var gzD = calendar.toGanZhi(dayCyclical+d-1); + //该日期所属的星座 + var astro = calendar.toAstro(m,d); + + return {'lYear':year,'lMonth':month,'lDay':day,'Animal':calendar.getAnimal(year),'IMonthCn':(isLeap?"\u95f0":'')+calendar.toChinaMonth(month),'IDayCn':calendar.toChinaDay(day),'cYear':y,'cMonth':m,'cDay':d,'gzYear':gzY,'gzMonth':gzM,'gzDay':gzD,'isToday':isToday,'isLeap':isLeap,'nWeek':nWeek,'ncWeek':"\u661f\u671f"+cWeek,'isTerm':isTerm,'Term':Term,'astro':astro}; + }, + + /** + * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON + * @param y lunar year + * @param m lunar month + * @param d lunar day + * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] + * @return JSON object + * @eg:console.log(calendar.lunar2solar(1987,9,10)); + */ + lunar2solar:function(y,m,d,isLeapMonth) { //参数区间1900.1.31~2100.12.1 + var isLeapMonth = !!isLeapMonth; + var leapOffset = 0; + var leapMonth = calendar.leapMonth(y); + var leapDay = calendar.leapDays(y); + if(isLeapMonth&&(leapMonth!=m)) {return -1;}//传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 + if(y==2100&&m==12&&d>1 || y==1900&&m==1&&d<31) {return -1;}//超出了最大极限值 + var day = calendar.monthDays(y,m); + var _day = day; + //bugFix 2016-9-25 + //if month is leap, _day use leapDays method + if(isLeapMonth) { + _day = calendar.leapDays(y,m); + } + if(y < 1900 || y > 2100 || d > _day) {return -1;}//参数合法性效验 + + //计算农历的时间差 + var offset = 0; + for(var i=1900;i0) { + offset+=calendar.leapDays(y);isAdd = true; + } + } + offset+=calendar.monthDays(y,i); + } + //转换闰月农历 需补充该年闰月的前一个月的时差 + if(isLeapMonth) {offset+=day;} + //1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) + var stmap = Date.UTC(1900,1,30,0,0,0); + var calObj = new Date((offset+d-31)*86400000+stmap); + var cY = calObj.getUTCFullYear(); + var cM = calObj.getUTCMonth()+1; + var cD = calObj.getUTCDate(); + + return calendar.solar2lunar(cY,cM,cD); + } +}; + +export default calendar +/* eslint-disable */ diff --git a/src/components/Calendar/calendar.vue b/src/components/Calendar/calendar.vue new file mode 100644 index 0000000..b0976ff --- /dev/null +++ b/src/components/Calendar/calendar.vue @@ -0,0 +1,837 @@ + + + + + diff --git a/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue new file mode 100644 index 0000000..9a407dc --- /dev/null +++ b/src/components/Hamburger/index.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/components/Scrollpane/index.vue b/src/components/Scrollpane/index.vue new file mode 100644 index 0000000..1472464 --- /dev/null +++ b/src/components/Scrollpane/index.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/components/Sticky/index.vue b/src/components/Sticky/index.vue new file mode 100644 index 0000000..fa165bc --- /dev/null +++ b/src/components/Sticky/index.vue @@ -0,0 +1,91 @@ + + + diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue new file mode 100644 index 0000000..12a1f58 --- /dev/null +++ b/src/components/SvgIcon/index.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/components/Tinymce/components/editorImage.vue b/src/components/Tinymce/components/editorImage.vue new file mode 100644 index 0000000..bcd8209 --- /dev/null +++ b/src/components/Tinymce/components/editorImage.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/src/components/Tinymce/index.vue b/src/components/Tinymce/index.vue new file mode 100644 index 0000000..b8d0328 --- /dev/null +++ b/src/components/Tinymce/index.vue @@ -0,0 +1,204 @@ +