Compare commits
	
		
			297 Commits
		
	
	
		
			13c8c2bfbc
			...
			projects/m
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| ab56bc354a | |||
| 1c7c10205e | |||
|  | 74003e9d89 | ||
|  | cb72e2b68a | ||
| 025b061ec2 | |||
|  | f2912eaee1 | ||
|  | 8025d00709 | ||
| 60edd8f2c4 | |||
| c0214c9eb7 | |||
| da85e5211a | |||
| 23afb0db0d | |||
| d0adf3a63e | |||
|  | b81c95f796 | ||
| e7f21456a3 | |||
|  | 1537b1be58 | ||
|  | b2304941a4 | ||
| 14b2a49053 | |||
|  | 6adac714f0 | ||
|  | 0349f3cde0 | ||
|  | 4cafa78908 | ||
| 61ef172534 | |||
|  | 19d913a49e | ||
|  | 70c3fd44d6 | ||
| 78d6f0bb23 | |||
|  | cf51eff0b7 | ||
|  | 539dddf217 | ||
|  | 317d01934b | ||
|  | cdfe5c9c1b | ||
| c1ea5157a5 | |||
| 41ceefc20e | |||
| 54425859b5 | |||
| a2a4f8dccd | |||
|  | fd3b054108 | ||
|  | dacae0cbd8 | ||
|  | be83c8196e | ||
|  | ef3f5d3fe7 | ||
|  | ec550f22ec | ||
|  | 60633ac581 | ||
|  | 9351b82d11 | ||
| 5e4227ba25 | |||
| 82f63dc4ff | |||
| 9a29185410 | |||
| 43e824f958 | |||
|  | de831b339f | ||
|  | f0105c377c | ||
| 3ba5574669 | |||
|  | 082988d6d7 | ||
|  | 7acb861919 | ||
| c41153a946 | |||
| 6d658d9212 | |||
| bf4bab2f3c | |||
| 20f0efa413 | |||
|  | c48f81b1d9 | ||
|  | 7233720c2e | ||
| 6a491ff498 | |||
|  | be607e4bf3 | ||
|  | 87ef42e277 | ||
| aa65a7e97e | |||
|  | b8d26c87d8 | ||
| b89f510e61 | |||
|  | 0e60f426bc | ||
|  | 21f4879394 | ||
| 067cd4765e | |||
| 3c4fe6daaa | |||
|  | e24f9c1079 | ||
|  | 61567ce86a | ||
| 2ee66714ca | |||
| ab5867c4fd | |||
| 9a53391999 | |||
| ec0c09a674 | |||
|  | 90e9b179eb | ||
|  | 8e2b332c7b | ||
| f37a12d2e1 | |||
| cb19872012 | |||
|  | 8ba79185d4 | ||
|  | 104cda5a41 | ||
|  | 151c5708c4 | ||
| 837735b7e8 | |||
|  | e00a08385f | ||
|  | a8c3d2c585 | ||
| eb097e77bd | |||
|  | 30eecb8bd1 | ||
|  | f4a6229170 | ||
| ab593bff20 | |||
| 4b01dd3ec3 | |||
| ed3ea7dde8 | |||
| 1d9e272f99 | |||
|  | 43c9153777 | ||
|  | c6d504583b | ||
|  | 22f3c87f02 | ||
|  | 1f54c9179d | ||
| f7247f5161 | |||
|  | c8856f34b5 | ||
|  | 42c42abc08 | ||
| 0fffed9b0e | |||
|  | d251daa3f5 | ||
|  | ed5120ca97 | ||
|  | becf34d089 | ||
| f0d64de77b | |||
| 56819176b3 | |||
| d302179f6f | |||
| 8c117fae8e | |||
|  | b6cf7b2ddc | ||
|  | 2f98b42bd2 | ||
| fb8ae9226a | |||
| 3d3763c4ef | |||
| ea675b9dea | |||
| bda065e4be | |||
|  | 5ea4c219ed | ||
|  | 16186667da | ||
|  | c7cd6e7b1e | ||
|  | 29c3a9fb72 | ||
|  | 1e1313d090 | ||
| d0eb1d84c8 | |||
|  | 445d8f4818 | ||
|  | 46ce982cfc | ||
| 391e06a382 | |||
| 72e1b4e8f9 | |||
| b41ba04cb4 | |||
|  | 4482ce0433 | ||
|  | ecf6745c8a | ||
| c9128ce946 | |||
| ba08175de8 | |||
|  | 22f8322baf | ||
|  | 6f8abc9758 | ||
| 59d53b60c7 | |||
| d448280782 | |||
| 0337b54202 | |||
|  | 9dec81e0b2 | ||
|  | 64de2c50b6 | ||
|  | bd0f9e24fd | ||
|  | f3043ee11f | ||
| 5584a47575 | |||
| b0078cb099 | |||
| e5acd497b5 | |||
| 6b452dce36 | |||
| aacf87f6d3 | |||
|  | bfa17e422d | ||
|  | e25f872589 | ||
| 83b834d2fc | |||
| 1b2c16fcdb | |||
| 475ec35ec5 | |||
| 1328da9616 | |||
| 92b9ec7da7 | |||
| c1af47db81 | |||
| 15afbcd612 | |||
|  | dabbc6b63a | ||
|  | cfab3353d3 | ||
|  | 2298fc56b6 | ||
| bb77d0f8c6 | |||
|  | e8938a62eb | ||
|  | 2a599d96b3 | ||
|  | 6050eb4df5 | ||
| 02c3b3db0d | |||
| 3308fcbef9 | |||
| cb7135bad5 | |||
| 4a56f92961 | |||
|  | 8f11c2f47c | ||
|  | b41dc9593c | ||
| 862fe20760 | |||
| 1ed409a98e | |||
| 68e738cf12 | |||
|  | 4866198a98 | ||
|  | 49df8a72bd | ||
|  | 087af452de | ||
|  | 63a753d7d6 | ||
| b1cdf083dd | |||
| 673ddcb996 | |||
| a9e60dbe82 | |||
|  | 92d197a513 | ||
|  | e7f440a142 | ||
| 5d3622bf62 | |||
| 5ccb9297e1 | |||
| ce528f18b6 | |||
|  | 024060182e | ||
|  | 4f111a95d6 | ||
| 8fc6b73179 | |||
| 7f504e5cdd | |||
| 7c5d8bde0b | |||
|  | 0b1761e83c | ||
|  | cafa156d72 | ||
| ed46ed7d09 | |||
|  | f89c6dfe14 | ||
|  | a3b2eae33f | ||
| e70ff40554 | |||
| d3d93acd0f | |||
| 93236f9828 | |||
|  | fef8824844 | ||
| a4fceeb981 | |||
| 84468cc883 | |||
| ea04d55fc1 | |||
| ef1078360a | |||
| 60f6c3a8fe | |||
| a4b340ac5d | |||
|  | 2592551e66 | ||
|  | 1fde96e677 | ||
| 0b16e1fe0d | |||
| abcec3bcdc | |||
| bdd14eec70 | |||
| 44e7e219a4 | |||
|  | ec51beb8ea | ||
|  | 433618e71d | ||
| 812b72f10d | |||
|  | 05f10ab51d | ||
|  | e7828fd277 | ||
| 58457487d1 | |||
|  | 6c54c223c5 | ||
|  | b2cc509f8e | ||
| b6236e89b1 | |||
| cbc7cbc574 | |||
| b5b952e1cc | |||
| 33ed9f15fa | |||
| c85c6e4323 | |||
| 30d22b34e1 | |||
| 3d3fa2ccee | |||
| f960ece594 | |||
| 949675b3a2 | |||
| f52815abe6 | |||
|  | ac4cea0c7e | ||
|  | 93fea84c79 | ||
| a06682de3f | |||
| e1773dae03 | |||
| f6d866907c | |||
| 7fe8d7e72c | |||
| 1e4a33a703 | |||
| d1ad913bab | |||
|  | 38edf00925 | ||
|  | bf231f7157 | ||
| 04e2471a54 | |||
|  | 9e2ce5f636 | ||
|  | 8a54c046d9 | ||
| 3fa702cc12 | |||
| 8ebff703ee | |||
|  | 02e267e647 | ||
|  | a6ffba4cf8 | ||
| 3de4d5c5f2 | |||
| c6c2d1c3b1 | |||
|  | 1bbd749094 | ||
|  | 073b4b8e20 | ||
| 3ec82a6a41 | |||
| 7c83268e0c | |||
| 49cb1e6877 | |||
|  | 481dde003a | ||
|  | 43e54e8ee7 | ||
| 28dbe075a4 | |||
|  | 4571786780 | ||
|  | 21cef13168 | ||
| 5f5e0ffc69 | |||
| 4d0841bd32 | |||
| b6d3b17300 | |||
| dad71db912 | |||
| 94c7f803cc | |||
| 0dae8cd16d | |||
|  | 1fd547893f | ||
|  | ad5812df96 | ||
|  | c01106e389 | ||
| 021182e873 | |||
|  | 71834ef906 | ||
|  | 412ec6ab0c | ||
| 9aca4874c1 | |||
|  | c9d25e5e88 | ||
|  | 610090c2a0 | ||
| 83917eaf4a | |||
|  | d64e9b9535 | ||
|  | b0f44c2332 | ||
| 8ae9efe4bd | |||
|  | 15358fd7e2 | ||
|  | dfabc9ed23 | ||
| 78f6165cfc | |||
|  | 7944824ffe | ||
| 984cf2e7d5 | |||
|  | 07bc6aab69 | ||
|  | 7a14b2846a | ||
| db7d4745dd | |||
| 6b99175574 | |||
|  | 34aeb029b5 | ||
|  | caf614ca35 | ||
| b8f9d3626f | |||
|  | c8913f192c | ||
|  | 0fa651fccf | ||
| 33782e189c | |||
| ee828ec4a7 | |||
| e75d2f1810 | |||
| ff9ee438ae | |||
| df10a757bf | |||
| cea7fb622f | |||
| 6924566ab0 | |||
| f80f648771 | |||
| 5d16c37965 | |||
| cb9456358f | |||
| 23334b5017 | |||
| 63e9100368 | |||
| 2e5e423a38 | |||
| 3b8c8b047b | |||
| d9b354f0c4 | |||
| 783cb0c3fe | |||
| 17f31863f9 | 
| @@ -1,3 +1,3 @@ | |||||||
| .dockerignore | .dockerignore | ||||||
| dist | #dist | ||||||
| node_modules | node_modules | ||||||
|   | |||||||
							
								
								
									
										59
									
								
								.drone.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								.drone.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | |||||||
|  | --- | ||||||
|  | kind: pipeline | ||||||
|  | type: docker | ||||||
|  | name: default | ||||||
|  |  | ||||||
|  | steps: | ||||||
|  | - name: build | ||||||
|  |   image: node:16-alpine | ||||||
|  |   pull: if_not_exists | ||||||
|  |   environment: | ||||||
|  |     NODE_ENV: "" | ||||||
|  |   commands: | ||||||
|  |   #- yarn install --frozen-lockfile | ||||||
|  |   - yarn install  | ||||||
|  |   - env ${NODE_ENV} yarn build:prod  | ||||||
|  |  | ||||||
|  | - name: publish | ||||||
|  |   image: docker:dind | ||||||
|  |   pull: if_not_exists | ||||||
|  |   volumes: | ||||||
|  |   - name: dockersock | ||||||
|  |     path: /var/run/docker.sock | ||||||
|  |   - name: dockerconfig | ||||||
|  |     path: /root/.docker | ||||||
|  |   commands: | ||||||
|  |   - docker build -t hub.kszny.picaiba.com/kszny/xcac-ui ./ | ||||||
|  |   - docker push hub.kszny.picaiba.com/kszny/xcac-ui | ||||||
|  |   depends_on: | ||||||
|  |   - build | ||||||
|  |  | ||||||
|  | - name: deploy | ||||||
|  |   image: appleboy/drone-ssh | ||||||
|  |   pull: if-not-exists | ||||||
|  |   settings: | ||||||
|  |     host: | ||||||
|  |       - 172.24.145.74 | ||||||
|  |     username: root | ||||||
|  |     password: Root@123 | ||||||
|  |     port: 22 | ||||||
|  |     command_timeout: 2m | ||||||
|  |     script: | ||||||
|  |     - docker pull hub.kszny.picaiba.com/kszny/xcac-ui | ||||||
|  |     - docker run --rm -v /data/www/xcac:/tmp hub.kszny.picaiba.com/kszny/xcac-ui sh -c "rm -rf /tmp/* && mv -f /html /tmp" | ||||||
|  |   depends_on: | ||||||
|  |   - publish | ||||||
|  |  | ||||||
|  | volumes: | ||||||
|  | - name: dockersock | ||||||
|  |   host: | ||||||
|  |     path: /var/run/docker.sock | ||||||
|  | - name: dockerconfig | ||||||
|  |   host: | ||||||
|  |     path: /root/.docker | ||||||
|  |  | ||||||
|  | trigger: | ||||||
|  |   branch: | ||||||
|  |   - projects/mesxc-test | ||||||
|  |   event: | ||||||
|  |   - push | ||||||
							
								
								
									
										29
									
								
								.env.dev
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								.env.dev
									
									
									
									
									
								
							| @@ -1,7 +1,7 @@ | |||||||
| ### | ### | ||||||
|  # @Author: Do not edit |  # @Author: zhp | ||||||
|  # @Date: 2023-08-29 09:40:39 |  # @Date: 2024-04-12 14:30:48 | ||||||
|  # @LastEditTime: 2024-03-25 15:59:53 |  # @LastEditTime: 2024-04-25 10:07:02 | ||||||
|  # @LastEditors: zhp |  # @LastEditors: zhp | ||||||
|  # @Description: |  # @Description: | ||||||
| ### | ### | ||||||
| @@ -12,24 +12,19 @@ ENV = 'development' | |||||||
| VUE_APP_TITLE = MES系统 | VUE_APP_TITLE = MES系统 | ||||||
|  |  | ||||||
| # 芋道管理系统/开发环境 | # 芋道管理系统/开发环境 | ||||||
| # VUE_APP_BASE_API = 'http://100.64.0.26:48082' | # VUE_APP_BASE_API = 'http://192.168.0.33:48082' | ||||||
|  | VUE_APP_BASE_API = 'http://192.168.1.104:48082' | ||||||
| # VUE_APP_BASE_API = 'http://10.70.2.2:8080' | # VUE_APP_BASE_API = 'http://10.70.2.2:8080' | ||||||
| # VUE_APP_BASE_API = 'http://192.168.1.20:48080' | # 积木报表指向地址 | ||||||
| # VUE_APP_BASE_API = 'http://192.168.2.173:48080' | VUE_APP_JIMU_API = 'http://192.168.1.101:48082' | ||||||
| # VUE_APP_BASE_API = 'http://192.168.1.49:48082' |  | ||||||
| # VUE_APP_BASE_API = 'http://192.168.1.8:48082' | # socket地址(现场) | ||||||
| # VUE_APP_BASE_API = 'http://192.168.4.159:48080' |  | ||||||
| # VUE_APP_BASE_API = 'http://192.168.1.104:48082' |  | ||||||
| VUE_APP_BASE_API = 'http://192.168.0.33:48082' |  | ||||||
| # VUE_APP_BASE_API = 'http://192.168.1.62:48082' |  | ||||||
| # VUE_APP_BASE_API = 'http://192.168.1.78:48082' |  | ||||||
| # VUE_APP_BASE_API = 'http://192.168.1.47:48082' |  | ||||||
| # socket地址 |  | ||||||
| VUE_APP_Socket_API = 'ws://10.70.2.2:8080' | VUE_APP_Socket_API = 'ws://10.70.2.2:8080' | ||||||
|  | # socket地址(公司线上) | ||||||
|  | # VUE_APP_Socket_API = 'ws://192.168.0.33:48082' | ||||||
|  | # socket dcs地址(只有现场) | ||||||
| VUE_APP_Socket_Dcs_API = 'ws://10.70.180.10:8081' | VUE_APP_Socket_Dcs_API = 'ws://10.70.180.10:8081' | ||||||
|  |  | ||||||
| # 积木报表指向地址 |  | ||||||
| VUE_APP_JIMU_API = 'http://10.70.2.22:8080' |  | ||||||
|  |  | ||||||
| # 路由懒加载 | # 路由懒加载 | ||||||
| VUE_CLI_BABEL_TRANSPILE_MODULES = true | VUE_CLI_BABEL_TRANSPILE_MODULES = true | ||||||
|   | |||||||
| @@ -1,11 +1,4 @@ | |||||||
| ### | # 生产环境配置(许昌现场) | ||||||
|  # @Author: zhp |  | ||||||
|  # @Date: 2023-11-07 19:11:40 |  | ||||||
|  # @LastEditTime: 2023-11-16 16:40:59 |  | ||||||
|  # @LastEditors: zhp |  | ||||||
|  # @Description: |  | ||||||
| ### |  | ||||||
| # 生产环境配置 |  | ||||||
| ENV = 'production' | ENV = 'production' | ||||||
|  |  | ||||||
| # 页面标题 | # 页面标题 | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| # 生产环境配置 | # 公司线上环境(33服务器) | ||||||
| ENV = 'production' | ENV = 'production' | ||||||
|  |  | ||||||
| # 页面标题 | # 页面标题 | ||||||
| @@ -7,15 +7,12 @@ VUE_APP_TITLE = MES系统 | |||||||
| # 芋道管理系统/生产环境 | # 芋道管理系统/生产环境 | ||||||
| VUE_APP_BASE_API = '/prod-api' | VUE_APP_BASE_API = '/prod-api' | ||||||
|  |  | ||||||
| # dcs地址 |  | ||||||
| VUE_APP_Socket_Dcs_API = 'ws://10.70.180.10:8081' |  | ||||||
| # socket地址 |  | ||||||
| VUE_APP_Socket_API = 'ws://10.70.2.2:8080' |  | ||||||
|  |  | ||||||
| # 积木报表指向地址 | # 积木报表指向地址 | ||||||
| VUE_APP_JIMU_API = 'http://192.168.0.33:48082' | VUE_APP_JIMU_API = 'http://192.168.0.33:48082' | ||||||
| # socket地址 | # socket地址 | ||||||
| VUE_APP_Socket_API = 'ws://192.168.0.33:48082' | VUE_APP_Socket_API = 'ws://192.168.0.33:48082' | ||||||
|  | # dcs地址(只有现场的) | ||||||
|  | VUE_APP_Socket_Dcs_API = 'ws://10.70.180.10:8081' | ||||||
|  |  | ||||||
|  |  | ||||||
| # 根据服务器或域名修改 | # 根据服务器或域名修改 | ||||||
|   | |||||||
							
								
								
									
										24
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								Dockerfile
									
									
									
									
									
								
							| @@ -1,21 +1,3 @@ | |||||||
| FROM node:16-alpine as build-stage | FROM busybox  | ||||||
|  | LABEL maintainer thomas.hairong@gmail.com | ||||||
| WORKDIR /admim | COPY dist /html/ | ||||||
|  |  | ||||||
| COPY .npmrc package.json yarn.lock ./ |  | ||||||
| RUN --mount=type=cache,id=yarn-store,target=/root/.yarn-store \ |  | ||||||
|     yarn install --frozen-lockfile |  | ||||||
|  |  | ||||||
| COPY . . |  | ||||||
| ARG NODE_ENV="" |  | ||||||
| RUN env ${NODE_ENV} yarn build:prod |  | ||||||
|  |  | ||||||
| ## -- stage: dist => nginx -- |  | ||||||
| FROM nginx:alpine |  | ||||||
|  |  | ||||||
| ENV TZ=Asia/Shanghai |  | ||||||
|  |  | ||||||
| COPY ./nginx.conf /etc/nginx/conf.d/default.conf |  | ||||||
| COPY --from=build-stage /admim/dist /usr/share/nginx/html |  | ||||||
|  |  | ||||||
| EXPOSE 80 |  | ||||||
|   | |||||||
| @@ -50,7 +50,7 @@ | |||||||
|     "benz-amr-recorder": "^1.1.5", |     "benz-amr-recorder": "^1.1.5", | ||||||
|     "bpmn-js-token-simulation": "0.10.0", |     "bpmn-js-token-simulation": "0.10.0", | ||||||
|     "clipboard": "2.0.8", |     "clipboard": "2.0.8", | ||||||
|     "code-brick-zj": "^1.0.5", |     "code-brick-zj": "^1.1.0", | ||||||
|     "core-js": "^3.26.0", |     "core-js": "^3.26.0", | ||||||
|     "crypto-js": "^4.0.0", |     "crypto-js": "^4.0.0", | ||||||
|     "diagram-js": "^12.3.0", |     "diagram-js": "^12.3.0", | ||||||
|   | |||||||
| @@ -34,4 +34,22 @@ export function getQoq(data) { | |||||||
|     method: 'post', |     method: 'post', | ||||||
|     data: data |     data: data | ||||||
|   }) |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获取能源设备树 | ||||||
|  | export function getTree() { | ||||||
|  |   return request({ | ||||||
|  |     url: '/analysis/energy-analysis/getTree', | ||||||
|  |     method: 'get' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 导出(走势分析) | ||||||
|  | export function exportTrend(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/analysis/energy-analysis/exportTrend', | ||||||
|  |     method: 'post', | ||||||
|  |     responseType: 'blob', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
| } | } | ||||||
| @@ -1,7 +1,7 @@ | |||||||
| /* | /* | ||||||
|  * @Author: Do not edit |  * @Author: Do not edit | ||||||
|  * @Date: 2023-10-21 11:50:46 |  * @Date: 2023-10-21 11:50:46 | ||||||
|  * @LastEditTime: 2023-10-30 14:37:28 |  * @LastEditTime: 2024-04-19 17:13:24 | ||||||
|  * @LastEditors: DY |  * @LastEditors: DY | ||||||
|  * @Description:  |  * @Description:  | ||||||
|  */ |  */ | ||||||
| @@ -65,4 +65,13 @@ export function getCoreDepartmentList(query) { | |||||||
|     method: 'get', |     method: 'get', | ||||||
|     params: query |     params: query | ||||||
|   }) |   }) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // 设备获得所有列表 | ||||||
|  | export function getDepartmentList(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/system/dept/list-all-simple', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
|   | |||||||
| @@ -53,4 +53,28 @@ export function energyQuantityManualExport(data) { | |||||||
|     data: data, |     data: data, | ||||||
|     responseType: 'blob' |     responseType: 'blob' | ||||||
|   }) |   }) | ||||||
|  | } | ||||||
|  | // 获得能源表名配置分页 | ||||||
|  | export function energyTablePage(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/base/energy-table/page', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  | // 获得能源表名配置 | ||||||
|  | export function energyTableGet(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/base/energy-table/get', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  | // 更新能源表名配置 | ||||||
|  | export function energyTableUpdate(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/base/energy-table/update', | ||||||
|  |     method: 'put', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
| } | } | ||||||
| @@ -68,3 +68,4 @@ export function exportEnergyTypeExcel(query) { | |||||||
|     responseType: 'blob' |     responseType: 'blob' | ||||||
|   }) |   }) | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| /* | /* | ||||||
|  * @Author: zhp |  * @Author: zhp | ||||||
|  * @Date: 2023-11-06 15:38:12 |  * @Date: 2023-11-06 15:38:12 | ||||||
|  * @LastEditTime: 2023-12-15 15:29:16 |  * @LastEditTime: 2024-04-11 14:57:02 | ||||||
|  * @LastEditors: zhp |  * @LastEditors: zhp | ||||||
|  * @Description: |  * @Description: | ||||||
|  */ |  */ | ||||||
| @@ -94,7 +94,7 @@ export function getWorkerList(query) { | |||||||
|  |  | ||||||
| export function getMaterialCheckList(query) { | export function getMaterialCheckList(query) { | ||||||
|   return request({ |   return request({ | ||||||
|     url: '/base/core-hot-material-check/listByMaterial', |     url: 'base/quality-hot-material-det/filterList', | ||||||
|     method: 'get', |     method: 'get', | ||||||
|     params: query |     params: query | ||||||
|   }) |   }) | ||||||
| @@ -102,7 +102,7 @@ export function getMaterialCheckList(query) { | |||||||
|  |  | ||||||
| export function createQualityHotMaterialDet(query){ | export function createQualityHotMaterialDet(query){ | ||||||
|    return request({ |    return request({ | ||||||
|     url: '/base/quality-hot-material-det/create', |     url: 'base/quality-hot-material-det/createBatch', | ||||||
|     method: 'post', |     method: 'post', | ||||||
|     data: query |     data: query | ||||||
|   }) |   }) | ||||||
| @@ -110,7 +110,7 @@ export function createQualityHotMaterialDet(query){ | |||||||
|  |  | ||||||
| export function updateQualityHotMaterialDet(query){ | export function updateQualityHotMaterialDet(query){ | ||||||
|    return request({ |    return request({ | ||||||
|     url: '/base/quality-hot-material-det/listbyfilter', |     url: 'base/quality-hot-material-det/updateBatch', | ||||||
|     method: 'put', |     method: 'put', | ||||||
|     data: query |     data: query | ||||||
|   }) |   }) | ||||||
| @@ -118,7 +118,7 @@ export function updateQualityHotMaterialDet(query){ | |||||||
|  |  | ||||||
| export function getQualityHotMaterialDetList(query){ | export function getQualityHotMaterialDetList(query){ | ||||||
|    return request({ |    return request({ | ||||||
|     url: '/base/quality-hot-material-det/listbyfilter', |     url: '/base/quality-hot-material-det/filterList', | ||||||
|     method: 'get', |     method: 'get', | ||||||
|     params: query |     params: query | ||||||
|   }) |   }) | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| /* | /* | ||||||
|  * @Author: zhp |  * @Author: zhp | ||||||
|  * @Date: 2023-11-07 15:02:37 |  * @Date: 2023-11-07 15:02:37 | ||||||
|  * @LastEditTime: 2023-11-07 18:32:07 |  * @LastEditTime: 2024-04-09 15:14:42 | ||||||
|  * @LastEditors: zhp |  * @LastEditors: zhp | ||||||
|  * @Description: |  * @Description: | ||||||
|  */ |  */ | ||||||
|   | |||||||
							
								
								
									
										20
									
								
								src/api/infra/apiAccessLog.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/api/infra/apiAccessLog.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | import request from '@/utils/request' | ||||||
|  |  | ||||||
|  | // 获得API 访问日志分页 | ||||||
|  | export function getApiAccessLogPage(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/api-access-log/page', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 导出API 访问日志 Excel | ||||||
|  | export function exportApiAccessLogExcel(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/api-access-log/export-excel', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query, | ||||||
|  |     responseType: 'blob' | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										28
									
								
								src/api/infra/apiErrorLog.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/api/infra/apiErrorLog.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | import request from '@/utils/request' | ||||||
|  |  | ||||||
|  | // 更新 API 错误日志的处理状态 | ||||||
|  | export function updateApiErrorLogProcess(id, processStatus) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/api-error-log/update-status?id=' + id + '&processStatus=' + processStatus, | ||||||
|  |     method: 'put', | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获得API 错误日志分页 | ||||||
|  | export function getApiErrorLogPage(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/api-error-log/page', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 导出API 错误日志 Excel | ||||||
|  | export function exportApiErrorLogExcel(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/api-error-log/export-excel', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query, | ||||||
|  |     responseType: 'blob' | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										90
									
								
								src/api/infra/codegen.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								src/api/infra/codegen.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | |||||||
|  | import request from '@/utils/request' | ||||||
|  |  | ||||||
|  | // 获得表定义分页 | ||||||
|  | export function getCodegenTablePage(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/codegen/table/page', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获得表和字段的明细 | ||||||
|  | export function getCodegenDetail(tableId) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/codegen/detail?tableId=' + tableId, | ||||||
|  |     method: 'get', | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 修改代码生成信息 | ||||||
|  | export function updateCodegen(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/codegen/update', | ||||||
|  |     method: 'put', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 基于数据库的表结构,同步数据库的表和字段定义 | ||||||
|  | export function syncCodegenFromDB(tableId) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/codegen/sync-from-db?tableId=' + tableId, | ||||||
|  |     method: 'put' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 基于 SQL 建表语句,同步数据库的表和字段定义 | ||||||
|  | export function syncCodegenFromSQL(tableId, sql) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/codegen/sync-from-sql?tableId=' + tableId, | ||||||
|  |     method: 'put', | ||||||
|  |     headers:{ | ||||||
|  |       'Content-type': 'application/x-www-form-urlencoded' | ||||||
|  |     }, | ||||||
|  |     data: 'tableId=' + tableId + "&sql=" + sql, | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 预览生成代码 | ||||||
|  | export function previewCodegen(tableId) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/codegen/preview?tableId=' + tableId, | ||||||
|  |     method: 'get', | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 下载生成代码 | ||||||
|  | export function downloadCodegen(tableId) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/codegen/download?tableId=' + tableId, | ||||||
|  |     method: 'get', | ||||||
|  |     responseType: 'blob' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获得表定义分页 | ||||||
|  | export function getSchemaTableList(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/codegen/db/table/list', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 基于数据库的表结构,创建代码生成器的表定义 | ||||||
|  | export function createCodegenList(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/codegen/create-list', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 删除数据库的表和字段定义 | ||||||
|  | export function deleteCodegen(tableId) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/codegen/delete?tableId=' + tableId, | ||||||
|  |     method: 'delete' | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										62
									
								
								src/api/infra/config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								src/api/infra/config.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | |||||||
|  | import request from '@/utils/request' | ||||||
|  |  | ||||||
|  | // 查询参数列表 | ||||||
|  | export function listConfig(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/config/page', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 查询参数详细 | ||||||
|  | export function getConfig(configId) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/config/get?id=' + configId, | ||||||
|  |     method: 'get' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 根据参数键名查询参数值 | ||||||
|  | export function getConfigKey(configKey) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/config/get-value-by-key?key=' + configKey, | ||||||
|  |     method: 'get' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 新增参数配置 | ||||||
|  | export function addConfig(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/config/create', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 修改参数配置 | ||||||
|  | export function updateConfig(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/config/update', | ||||||
|  |     method: 'put', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 删除参数配置 | ||||||
|  | export function delConfig(configId) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/config/delete?id=' + configId, | ||||||
|  |     method: 'delete' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 导出参数 | ||||||
|  | export function exportConfig(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/config/export', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query, | ||||||
|  |     responseType: 'blob' | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										43
									
								
								src/api/infra/dataSourceConfig.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/api/infra/dataSourceConfig.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | |||||||
|  | import request from '@/utils/request' | ||||||
|  |  | ||||||
|  | // 创建数据源配置 | ||||||
|  | export function createDataSourceConfig(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/data-source-config/create', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 更新数据源配置 | ||||||
|  | export function updateDataSourceConfig(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/data-source-config/update', | ||||||
|  |     method: 'put', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 删除数据源配置 | ||||||
|  | export function deleteDataSourceConfig(id) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/data-source-config/delete?id=' + id, | ||||||
|  |     method: 'delete' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获得数据源配置 | ||||||
|  | export function getDataSourceConfig(id) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/data-source-config/get?id=' + id, | ||||||
|  |     method: 'get' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获得数据源配置列表 | ||||||
|  | export function getDataSourceConfigList() { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/data-source-config/list', | ||||||
|  |     method: 'get', | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										26
									
								
								src/api/infra/dbDoc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/api/infra/dbDoc.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | // 导出参数 | ||||||
|  | import request from "@/utils/request"; | ||||||
|  |  | ||||||
|  | export function exportHtml() { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/db-doc/export-html', | ||||||
|  |     method: 'get', | ||||||
|  |     responseType: 'blob' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function exportWord() { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/db-doc/export-word', | ||||||
|  |     method: 'get', | ||||||
|  |     responseType: 'blob' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function exportMarkdown() { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/db-doc/export-markdown', | ||||||
|  |     method: 'get', | ||||||
|  |     responseType: 'blob' | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								src/api/infra/file.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/api/infra/file.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | import request from '@/utils/request' | ||||||
|  |  | ||||||
|  | // 删除文件 | ||||||
|  | export function deleteFile(id) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/file/delete?id=' + id, | ||||||
|  |     method: 'delete' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获得文件分页 | ||||||
|  | export function getFilePage(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/file/page', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										59
									
								
								src/api/infra/fileConfig.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/api/infra/fileConfig.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | |||||||
|  | import request from '@/utils/request' | ||||||
|  |  | ||||||
|  | // 创建文件配置 | ||||||
|  | export function createFileConfig(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/file-config/create', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 更新文件配置 | ||||||
|  | export function updateFileConfig(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/file-config/update', | ||||||
|  |     method: 'put', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 更新文件配置为主配置 | ||||||
|  | export function updateFileConfigMaster(id) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/file-config/update-master?id=' + id, | ||||||
|  |     method: 'put' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 删除文件配置 | ||||||
|  | export function deleteFileConfig(id) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/file-config/delete?id=' + id, | ||||||
|  |     method: 'delete' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获得文件配置 | ||||||
|  | export function getFileConfig(id) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/file-config/get?id=' + id, | ||||||
|  |     method: 'get' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获得文件配置分页 | ||||||
|  | export function getFileConfigPage(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/file-config/page', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function testFileConfig(id) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/file-config/test?id=' + id, | ||||||
|  |     method: 'get' | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										82
									
								
								src/api/infra/job.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								src/api/infra/job.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | |||||||
|  | import request from '@/utils/request' | ||||||
|  |  | ||||||
|  | // 查询定时任务调度列表 | ||||||
|  | export function listJob(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/job/page', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 查询定时任务调度详细 | ||||||
|  | export function getJob(jobId) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/job/get?id=' + jobId, | ||||||
|  |     method: 'get' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 新增定时任务调度 | ||||||
|  | export function addJob(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/job/create', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 修改定时任务调度 | ||||||
|  | export function updateJob(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/job/update', | ||||||
|  |     method: 'put', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 删除定时任务调度 | ||||||
|  | export function delJob(jobId) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/job/delete?id=' + jobId, | ||||||
|  |     method: 'delete' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 导出定时任务调度 | ||||||
|  | export function exportJob(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/job/export-excel', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query, | ||||||
|  |     responseType: 'blob' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 任务状态修改 | ||||||
|  | export function updateJobStatus(jobId, status) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/job/update-status', | ||||||
|  |     method: 'put', | ||||||
|  |     headers:{ | ||||||
|  |       'Content-type': 'application/x-www-form-urlencoded' | ||||||
|  |     }, | ||||||
|  |     data: 'id=' + jobId + "&status=" + status, | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 定时任务立即执行一次 | ||||||
|  | export function runJob(jobId) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/job/trigger?id=' + jobId, | ||||||
|  |     method: 'put' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获得定时任务的下 n 次执行时间 | ||||||
|  | export function getJobNextTimes(jobId) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/job/get_next_times?id=' + jobId, | ||||||
|  |     method: 'get' | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										28
									
								
								src/api/infra/jobLog.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/api/infra/jobLog.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | import request from '@/utils/request' | ||||||
|  |  | ||||||
|  | // 获得定时任务 | ||||||
|  | export function getJobLog(id) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/job-log/get?id=' + id, | ||||||
|  |     method: 'get' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获得定时任务分页 | ||||||
|  | export function getJobLogPage(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/job-log/page', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 导出定时任务 Excel | ||||||
|  | export function exportJobLogExcel(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/job-log/export-excel', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query, | ||||||
|  |     responseType: 'blob' | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								src/api/infra/redis.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/api/infra/redis.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | import request from '@/utils/request' | ||||||
|  |  | ||||||
|  | // 查询缓存详细 | ||||||
|  | export function getCache() { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/redis/get-monitor-info', | ||||||
|  |     method: 'get' | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										54
									
								
								src/api/infra/testDemo.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								src/api/infra/testDemo.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | |||||||
|  | import request from '@/utils/request' | ||||||
|  |  | ||||||
|  | // 创建字典类型 | ||||||
|  | export function createTestDemo(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/test-demo/create', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 更新字典类型 | ||||||
|  | export function updateTestDemo(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/test-demo/update', | ||||||
|  |     method: 'put', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 删除字典类型 | ||||||
|  | export function deleteTestDemo(id) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/test-demo/delete?id=' + id, | ||||||
|  |     method: 'delete' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获得字典类型 | ||||||
|  | export function getTestDemo(id) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/test-demo/get?id=' + id, | ||||||
|  |     method: 'get' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获得字典类型分页 | ||||||
|  | export function getTestDemoPage(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/test-demo/page', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 导出字典类型 Excel | ||||||
|  | export function exportTestDemoExcel(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/infra/test-demo/export-excel', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query, | ||||||
|  |     responseType: 'blob' | ||||||
|  |   }) | ||||||
|  | } | ||||||
| @@ -1,7 +1,7 @@ | |||||||
| /* | /* | ||||||
|  * @Author: zhp |  * @Author: zhp | ||||||
|  * @Date: 2023-11-07 14:10:18 |  * @Date: 2023-11-07 14:10:18 | ||||||
|  * @LastEditTime: 2023-11-16 17:49:52 |  * @LastEditTime: 2024-04-11 16:16:05 | ||||||
|  * @LastEditors: zhp |  * @LastEditors: zhp | ||||||
|  * @Description: |  * @Description: | ||||||
|  */ |  */ | ||||||
| @@ -18,14 +18,14 @@ export function getStatisticalDataPage(query) { | |||||||
|  |  | ||||||
| export function getWorkOrderList(query) { | export function getWorkOrderList(query) { | ||||||
|   return request({ |   return request({ | ||||||
|     url: '/base/core-work-order/listbyfilter', |     url: 'base/core-work-order/listbyfilter', | ||||||
|     method: 'get', |     method: 'get', | ||||||
|     params: query, |     params: query, | ||||||
|   }) |   }) | ||||||
| } | } | ||||||
| export function getProductList(query) { | export function getProductList(query) { | ||||||
|   return request({ |   return request({ | ||||||
|     url: '/base/core-product/listAll', |     url: 'base/core-product/listAll', | ||||||
|     method: 'get', |     method: 'get', | ||||||
|     params: query, |     params: query, | ||||||
|   }) |   }) | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| /* | /* | ||||||
|  * @Author: zhp |  * @Author: zhp | ||||||
|  * @Date: 2023-10-31 10:55:20 |  * @Date: 2023-10-31 10:55:20 | ||||||
|  * @LastEditTime: 2023-12-06 14:09:14 |  * @LastEditTime: 2024-04-25 15:28:44 | ||||||
|  * @LastEditors: zhp |  * @LastEditors: DY | ||||||
|  * @Description: |  * @Description: | ||||||
|  */ |  */ | ||||||
| import request from '@/utils/request' | import request from '@/utils/request' | ||||||
| @@ -34,11 +34,11 @@ export function exportEnergyPlcExcel(query) { | |||||||
|   }) |   }) | ||||||
| } | } | ||||||
|  |  | ||||||
| export function getOriginalGlassRetrace(query) { | export function getOriginalGlassRetrace(data) { | ||||||
|    return request({ |    return request({ | ||||||
|     url: '/base/original-glass-statistics/originalGlassRetrace', |     url: '/base/original-glass-statistics/originalGlassRetrace', | ||||||
|     method: 'get', |     method: 'post', | ||||||
|     params: query, |     data | ||||||
|   }) |   }) | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										45
									
								
								src/api/report/customizedReports.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/api/report/customizedReports.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | import request from '@/utils/request' | ||||||
|  | // 原片工段数据 | ||||||
|  | export function originalSection(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/extend/customized-reports/originalSection', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 原片产线数据 | ||||||
|  | export function getOriginalLine(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/extend/customized-reports/getOriginalLine', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 深加工产线数据 | ||||||
|  | export function getProcessingLine(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/extend/customized-reports/getProcessingLine', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 深加工工段数据 | ||||||
|  | export function processing(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/extend/customized-reports/processing', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // isra数据记录 | ||||||
|  | export function israData(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/extend/customized-reports/isra', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
| @@ -1,7 +1,7 @@ | |||||||
| /* | /* | ||||||
|  * @Author: Do not edit |  * @Author: Do not edit | ||||||
|  * @Date: 2023-12-08 10:26:48 |  * @Date: 2023-12-08 10:26:48 | ||||||
|  * @LastEditTime: 2023-12-13 17:16:00 |  * @LastEditTime: 2024-04-24 16:31:37 | ||||||
|  * @LastEditors: DY |  * @LastEditors: DY | ||||||
|  * @Description:  |  * @Description:  | ||||||
|  */ |  */ | ||||||
| @@ -59,3 +59,39 @@ export function exportGlasscExcel(query) { | |||||||
|     responseType: 'blob' |     responseType: 'blob' | ||||||
|   }) |   }) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // 生产月报查询--冷端生产线 | ||||||
|  | export function productionMonthY(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/extend/customized-reports/productionMonthY', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 生产月报查询--深加工生产线 | ||||||
|  | export function productionMonthD(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/extend/customized-reports/productionMonthD', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 生产年报查询--冷端生产线 | ||||||
|  | export function productionYearY(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/extend/customized-reports/productionYearY', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 生产年报查询--冷端生产线 | ||||||
|  | export function productionYearD(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/extend/customized-reports/productionYearD', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										96
									
								
								src/api/report/qcReport.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								src/api/report/qcReport.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | |||||||
|  | /* | ||||||
|  |  * @Author: zhp | ||||||
|  |  * @Date: 2024-04-18 09:27:54 | ||||||
|  |  * @LastEditTime: 2024-04-23 15:16:12 | ||||||
|  |  * @LastEditors: zhp | ||||||
|  |  * @Description: | ||||||
|  |  */ | ||||||
|  | import request from '@/utils/request' | ||||||
|  |  | ||||||
|  | // 更新质量检测类型基础 | ||||||
|  | export function getOriginalData(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: 'extend/customized-reports/original', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  | export function getIngredientData(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: 'extend/customized-reports/materialCost', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function getCuttingtData(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: 'extend/customized-reports/cutting', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function getAutoDailyData(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: 'base/report-auto-daily/listAll', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function getQualityRecordReport(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: 'base/quality-inspection-record/qualityRecordReport', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function getProductChildData(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: 'base/report-auto-ydaily-det/list', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function updateAutoDailyData(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: 'base/report-auto-daily/update', | ||||||
|  |     method: 'put', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function getCWSectionList(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: 'base/core-production-line/listAll', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function getCuttingReportDataList(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: 'extend/customized-reports/cuttingReport', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function getProcessingLineDataList(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: 'extend/customized-reports/getProcessingLine', | ||||||
|  |     method: 'get', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function getOriginalLineDataList(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: 'extend/customized-reports/getOriginalLine', | ||||||
|  |     method: 'get', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 141 KiB | 
| @@ -19,13 +19,15 @@ body { | |||||||
| //   font-weight: 700; | //   font-weight: 700; | ||||||
| // } | // } | ||||||
| .searchBarBox .el-form-item--medium .el-form-item__label { | .searchBarBox .el-form-item--medium .el-form-item__label { | ||||||
|   line-height: 40px; | 	line-height: 40px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .searchBarBox .el-form-item--medium .el-form-item__content { | .searchBarBox .el-form-item--medium .el-form-item__content { | ||||||
|   line-height: 40px; | 	line-height: 40px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .searchBarBox .el-range-editor--small.el-input__inner { | .searchBarBox .el-range-editor--small.el-input__inner { | ||||||
|   height: 34px; | 	height: 34px; | ||||||
| } | } | ||||||
|  |  | ||||||
| html { | html { | ||||||
| @@ -153,13 +155,11 @@ aside { | |||||||
| 	text-align: right; | 	text-align: right; | ||||||
| 	padding-right: 20px; | 	padding-right: 20px; | ||||||
| 	transition: 600ms ease position; | 	transition: 600ms ease position; | ||||||
| 	background: linear-gradient( | 	background: linear-gradient(90deg, | ||||||
| 		90deg, | 			rgba(32, 182, 249, 1) 0%, | ||||||
| 		rgba(32, 182, 249, 1) 0%, | 			rgba(32, 182, 249, 1) 0%, | ||||||
| 		rgba(32, 182, 249, 1) 0%, | 			rgba(33, 120, 241, 1) 100%, | ||||||
| 		rgba(33, 120, 241, 1) 100%, | 			rgba(33, 120, 241, 1) 100%); | ||||||
| 		rgba(33, 120, 241, 1) 100% |  | ||||||
| 	); |  | ||||||
|  |  | ||||||
| 	.subtitle { | 	.subtitle { | ||||||
| 		font-size: 20px; | 		font-size: 20px; | ||||||
| @@ -204,10 +204,85 @@ aside { | |||||||
| 	z-index: 1000 !important; | 	z-index: 1000 !important; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // 滚动条 | ||||||
|  | ::-webkit-scrollbar { | ||||||
|  | 	width: 8px; | ||||||
|  | 	height: 8px; | ||||||
|  | 	background-color: transparent; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ::-webkit-scrollbar-track-piece { | ||||||
|  | 	background-color: rgba(144, 147, 153, 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ::-webkit-scrollbar-corner { | ||||||
|  | 	background-color: rgba(144, 147, 153, 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ::-webkit-scrollbar-track { | ||||||
|  | 	width: 6px; | ||||||
|  | 	background: rgba(144, 147, 153, 0); | ||||||
|  | 	-webkit-border-radius: 2em; | ||||||
|  | 	-moz-border-radius: 2em; | ||||||
|  | 	border-radius: 2em; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ::-webkit-scrollbar-thumb { | ||||||
|  | 	background-color: #EDEDED; | ||||||
|  | 	background-clip: padding-box; | ||||||
|  | 	min-height: 28px; | ||||||
|  | 	-webkit-border-radius: 2em; | ||||||
|  | 	-moz-border-radius: 2em; | ||||||
|  | 	border-radius: 2em; | ||||||
|  | 	transition: background-color .3s; | ||||||
|  | 	cursor: pointer; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ::-webkit-scrollbar-thumb:hover { | ||||||
|  | 	background-color: #D9D9D9; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 抽屉head区域---start | ||||||
|  | .el-drawer__header { | ||||||
|  | 	padding-bottom: 20px; | ||||||
|  | 	padding-left: 30px; | ||||||
|  | 	margin-bottom: 23px; | ||||||
|  | 	font-size: 20px; | ||||||
|  | 	font-weight: 500; | ||||||
|  | 	color: rgba(0, 0, 0, 0.85); | ||||||
|  | 	border-bottom: 1px solid rgba(233, 233, 233, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .el-drawer__header> :first-child::before { | ||||||
|  | 	content: ''; | ||||||
|  | 	display: inline-block; | ||||||
|  | 	width: 4px; | ||||||
|  | 	height: 24px; | ||||||
|  | 	background-color: #0b58ff; | ||||||
|  | 	margin-right: 8px; | ||||||
|  | 	vertical-align: middle; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 抽屉head区域---end | ||||||
|  | // 弹出框,上下分布,去掉label的padding-bottom | ||||||
|  | .el-form--label-top .el-form-item__label { | ||||||
|  | 	padding: 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 大屏滚动表格 | ||||||
|  | .dv-scroll-board .rows .ceil, | ||||||
|  | .dv-scroll-board .header .header-item { | ||||||
|  | 	border-right: 1px solid rgba(13, 23, 40, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .dv-scroll-board .rows .ceil:last-child, | ||||||
|  | .dv-scroll-board .header .header-item:last-child { | ||||||
|  | 	border-right: none; | ||||||
|  | } | ||||||
|  |  | ||||||
| .no-data-bg { | .no-data-bg { | ||||||
| 	height: 240px; | 	height: 240px; | ||||||
| 	background: url(../images/no-data-bg.png) 50% 100% / contain | 	background: url(../images/no-data-bg.png) 50% 100% / contain no-repeat; | ||||||
| 		no-repeat; |  | ||||||
| 	position: relative; | 	position: relative; | ||||||
|  |  | ||||||
| 	&::after { | 	&::after { | ||||||
| @@ -220,4 +295,4 @@ aside { | |||||||
| 		font-size: 18px; | 		font-size: 18px; | ||||||
| 		letter-spacing: 1px; | 		letter-spacing: 1px; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -1,8 +1,9 @@ | |||||||
| <template> | <template> | ||||||
|   <el-breadcrumb class="app-breadcrumb" separator="/"> |   <el-breadcrumb class="app-breadcrumb" separator="/"> | ||||||
|     <transition-group name="breadcrumb"> |     <transition-group name="breadcrumb"> | ||||||
|       <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path"> |       <el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path"> | ||||||
|         <span v-if="item.redirect==='noRedirect'||index===levelList.length-1" class="no-redirect">{{ item.meta.title }}</span> |         <span v-if="item.redirect === 'noRedirect' || index === levelList.length - 1" class="no-redirect">{{ item.meta.title | ||||||
|  |           }}</span> | ||||||
|         <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a> |         <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a> | ||||||
|       </el-breadcrumb-item> |       </el-breadcrumb-item> | ||||||
|     </transition-group> |     </transition-group> | ||||||
| @@ -35,7 +36,7 @@ export default { | |||||||
|       const first = matched[0] |       const first = matched[0] | ||||||
|  |  | ||||||
|       if (!this.isDashboard(first)) { |       if (!this.isDashboard(first)) { | ||||||
|         matched = [{ path: '/', meta: { title: '首页' }}].concat(matched) |         matched = [{ path: '/', meta: { title: '首页' } }].concat(matched) | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false) |       this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false) | ||||||
| @@ -64,7 +65,7 @@ export default { | |||||||
| .app-breadcrumb.el-breadcrumb { | .app-breadcrumb.el-breadcrumb { | ||||||
|   display: inline-block; |   display: inline-block; | ||||||
|   font-size: 14px; |   font-size: 14px; | ||||||
|   line-height: 56px; |   line-height: 48px; | ||||||
|   margin-left: 8px; |   margin-left: 8px; | ||||||
|  |  | ||||||
|   .no-redirect { |   .no-redirect { | ||||||
| @@ -73,7 +74,8 @@ export default { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| .app-breadcrumb .el-breadcrumb__inner a, .el-breadcrumb__inner.is-link { | .app-breadcrumb .el-breadcrumb__inner a, | ||||||
|  | .el-breadcrumb__inner.is-link { | ||||||
|   color: rgba(0, 0, 0, 0.45); |   color: rgba(0, 0, 0, 0.45); | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|   | |||||||
							
								
								
									
										138
									
								
								src/components/ButtonNav/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								src/components/ButtonNav/index.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,138 @@ | |||||||
|  | <!--  | ||||||
|  |     filename: index.vue | ||||||
|  |     author: liubin | ||||||
|  |     date: 2024-04-02 09:49:36 | ||||||
|  |     description:  | ||||||
|  | --> | ||||||
|  |  | ||||||
|  | <template> | ||||||
|  | 	<!-- 按钮切换 --> | ||||||
|  | 	<div | ||||||
|  | 		v-if="buttonMode" | ||||||
|  | 		class="button-nav"> | ||||||
|  | 		<button | ||||||
|  | 			v-for="m in menus" | ||||||
|  | 			:key="m" | ||||||
|  | 			@click="currentMenu = m" | ||||||
|  | 			:data-text="m" | ||||||
|  | 			:class="[m === currentMenu ? 'active' : '']"></button> | ||||||
|  | 	</div> | ||||||
|  | 	<!-- 标签切换 --> | ||||||
|  | 	<div | ||||||
|  | 		v-else | ||||||
|  | 		class="custom-tabs" | ||||||
|  | 		style="height: 100%; width: 100%"> | ||||||
|  | 		<el-tabs | ||||||
|  | 			class="tag-nav" | ||||||
|  | 			v-model="currentMenu" | ||||||
|  | 			style="height: 100%"> | ||||||
|  | 			<el-tab-pane | ||||||
|  | 				v-for="(m, idx) in menus" | ||||||
|  | 				:key="m" | ||||||
|  | 				:label="idx == 0 ? `\u2002${m}\u2002` : `\u3000${m}\u3000`" | ||||||
|  | 				:name="m"> | ||||||
|  | 				<slot :name="`tab${idx + 1}`"></slot> | ||||||
|  | 			</el-tab-pane> | ||||||
|  | 		</el-tabs> | ||||||
|  | 	</div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | export default { | ||||||
|  | 	name: 'ButtonNav', | ||||||
|  | 	props: { | ||||||
|  | 		menus: { | ||||||
|  | 			type: Array, | ||||||
|  | 			required: true, | ||||||
|  | 			default: () => [], | ||||||
|  | 			validator: (val) => { | ||||||
|  | 				return val.length > 0; | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		buttonMode: { | ||||||
|  | 			type: Boolean, | ||||||
|  | 			default: true, | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			currentMenu: '', | ||||||
|  | 		}; | ||||||
|  | 	}, | ||||||
|  | 	created() { | ||||||
|  | 		this.currentMenu = this.menus[0]; | ||||||
|  | 	}, | ||||||
|  | 	watch: { | ||||||
|  | 		currentMenu(val) { | ||||||
|  | 			this.$emit('change', val); | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | }; | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <style scoped lang="scss"> | ||||||
|  | .button-nav { | ||||||
|  | 	width: 100%; | ||||||
|  | 	// padding: 12px 0; | ||||||
|  | 	display: flex; | ||||||
|  | 	gap: 12px; | ||||||
|  |  | ||||||
|  | 	* { | ||||||
|  | 		user-select: none; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	button { | ||||||
|  | 		cursor: pointer; | ||||||
|  | 		appearance: none; | ||||||
|  | 		outline: none; | ||||||
|  | 		border: none; | ||||||
|  | 		background: #fff; | ||||||
|  | 		border-radius: 8px; | ||||||
|  | 		padding: 20px; | ||||||
|  | 		color: #888; | ||||||
|  | 		letter-spacing: 2px; | ||||||
|  | 		flex: 1; | ||||||
|  | 		box-sizing: padding-box; | ||||||
|  | 		position: relative; | ||||||
|  |  | ||||||
|  | 		&::after { | ||||||
|  | 			content: attr(data-text); | ||||||
|  | 			position: absolute; | ||||||
|  | 			top: 10px; | ||||||
|  | 			left: 50%; | ||||||
|  | 			font-size: 18px; | ||||||
|  | 			font-weight: 500; | ||||||
|  | 			transform: translate(-50%); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		&.active { | ||||||
|  | 			color: #111; | ||||||
|  | 			border-bottom: 4px solid #0b58ff; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | </style> | ||||||
|  |  | ||||||
|  | <style scoped> | ||||||
|  | .custom-tabs >>> .el-tabs__header { | ||||||
|  | 	margin-bottom: 8px; | ||||||
|  | 	display: inline-block; | ||||||
|  | 	/* transform: translateY(-12px); */ | ||||||
|  | } | ||||||
|  | .custom-tabs >>> .el-tabs__item { | ||||||
|  | 	padding-left: 0px !important; | ||||||
|  | 	padding-right: 0px !important; | ||||||
|  | 	line-height: 36px !important; | ||||||
|  | 	height: 36px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .custom-tabs >>> .el-tabs__content { | ||||||
|  | 	height: calc(100% - 42px); | ||||||
|  | } | ||||||
|  | .custom-tabs >>> .el-tab-pane { | ||||||
|  | 	box-sizing: border-box; | ||||||
|  | 	height: 100%; | ||||||
|  | 	padding: 20px; | ||||||
|  | 	border: 10px solid #f002; | ||||||
|  | } | ||||||
|  | </style> | ||||||
							
								
								
									
										160
									
								
								src/components/Crontab/day.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								src/components/Crontab/day.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,160 @@ | |||||||
|  | <template> | ||||||
|  | 	<el-form size="small"> | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="1"> | ||||||
|  | 				日,允许的通配符[, - * ? / L W] | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="2"> | ||||||
|  | 				不指定 | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="3"> | ||||||
|  | 				周期从 | ||||||
|  | 				<el-input-number v-model='cycle01' :min="1" :max="30" /> - | ||||||
|  | 				<el-input-number v-model='cycle02' :min="cycle01 ? cycle01 + 1 : 2" :max="31" /> 日 | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="4"> | ||||||
|  | 				从 | ||||||
|  | 				<el-input-number v-model='average01' :min="1" :max="30" /> 号开始,每 | ||||||
|  | 				<el-input-number v-model='average02' :min="1" :max="31 - average01 || 1" /> 日执行一次 | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="5"> | ||||||
|  | 				每月 | ||||||
|  | 				<el-input-number v-model='workday' :min="1" :max="31" /> 号最近的那个工作日 | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="6"> | ||||||
|  | 				本月最后一天 | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="7"> | ||||||
|  | 				指定 | ||||||
|  | 				<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%"> | ||||||
|  | 					<el-option v-for="item in 31" :key="item" :value="item">{{item}}</el-option> | ||||||
|  | 				</el-select> | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  | 	</el-form> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | export default { | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			radioValue: 1, | ||||||
|  | 			workday: 1, | ||||||
|  | 			cycle01: 1, | ||||||
|  | 			cycle02: 2, | ||||||
|  | 			average01: 1, | ||||||
|  | 			average02: 1, | ||||||
|  | 			checkboxList: [], | ||||||
|  | 			checkNum: this.$options.propsData.check | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	name: 'crontab-day', | ||||||
|  | 	props: ['check', 'cron'], | ||||||
|  | 	methods: { | ||||||
|  | 		// 单选按钮值变化时 | ||||||
|  | 		radioChange() { | ||||||
|  | 			('day rachange'); | ||||||
|  | 			if (this.radioValue !== 2 && this.cron.week !== '?') { | ||||||
|  | 				this.$emit('update', 'week', '?', 'day') | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			switch (this.radioValue) { | ||||||
|  | 				case 1: | ||||||
|  | 					this.$emit('update', 'day', '*'); | ||||||
|  | 					break; | ||||||
|  | 				case 2: | ||||||
|  | 					this.$emit('update', 'day', '?'); | ||||||
|  | 					break; | ||||||
|  | 				case 3: | ||||||
|  | 					this.$emit('update', 'day', this.cycleTotal); | ||||||
|  | 					break; | ||||||
|  | 				case 4: | ||||||
|  | 					this.$emit('update', 'day', this.averageTotal); | ||||||
|  | 					break; | ||||||
|  | 				case 5: | ||||||
|  | 					this.$emit('update', 'day', this.workday + 'W'); | ||||||
|  | 					break; | ||||||
|  | 				case 6: | ||||||
|  | 					this.$emit('update', 'day', 'L'); | ||||||
|  | 					break; | ||||||
|  | 				case 7: | ||||||
|  | 					this.$emit('update', 'day', this.checkboxString); | ||||||
|  | 					break; | ||||||
|  | 			} | ||||||
|  | 			('day rachange end'); | ||||||
|  | 		}, | ||||||
|  | 		// 周期两个值变化时 | ||||||
|  | 		cycleChange() { | ||||||
|  | 			if (this.radioValue === '3') { | ||||||
|  | 				this.$emit('update', 'day', this.cycleTotal); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 平均两个值变化时 | ||||||
|  | 		averageChange() { | ||||||
|  | 			if (this.radioValue === '4') { | ||||||
|  | 				this.$emit('update', 'day', this.averageTotal); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 最近工作日值变化时 | ||||||
|  | 		workdayChange() { | ||||||
|  | 			if (this.radioValue === '5') { | ||||||
|  | 				this.$emit('update', 'day', this.workdayCheck + 'W'); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// checkbox值变化时 | ||||||
|  | 		checkboxChange() { | ||||||
|  | 			if (this.radioValue === '7') { | ||||||
|  | 				this.$emit('update', 'day', this.checkboxString); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	watch: { | ||||||
|  | 		'radioValue': 'radioChange', | ||||||
|  | 		'cycleTotal': 'cycleChange', | ||||||
|  | 		'averageTotal': 'averageChange', | ||||||
|  | 		'workdayCheck': 'workdayChange', | ||||||
|  | 		'checkboxString': 'checkboxChange', | ||||||
|  | 	}, | ||||||
|  | 	computed: { | ||||||
|  | 		// 计算两个周期值 | ||||||
|  | 		cycleTotal: function () { | ||||||
|  | 			const cycle01 = this.checkNum(this.cycle01, 1, 30) | ||||||
|  | 			const cycle02 = this.checkNum(this.cycle02, cycle01 ? cycle01 + 1 : 2, 31, 31) | ||||||
|  | 			return cycle01 + '-' + cycle02; | ||||||
|  | 		}, | ||||||
|  | 		// 计算平均用到的值 | ||||||
|  | 		averageTotal: function () { | ||||||
|  | 			const average01 = this.checkNum(this.average01, 1, 30) | ||||||
|  | 			const average02 = this.checkNum(this.average02, 1, 31 - average01 || 0) | ||||||
|  | 			return average01 + '/' + average02; | ||||||
|  | 		}, | ||||||
|  | 		// 计算工作日格式 | ||||||
|  | 		workdayCheck: function () { | ||||||
|  | 			return this.checkNum(this.workday, 1, 31); | ||||||
|  | 		}, | ||||||
|  | 		// 计算勾选的checkbox值合集 | ||||||
|  | 		checkboxString: function () { | ||||||
|  | 			let str = this.checkboxList.join(); | ||||||
|  | 			return str === '' ? '*' : str; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | </script> | ||||||
							
								
								
									
										114
									
								
								src/components/Crontab/hour.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								src/components/Crontab/hour.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | |||||||
|  | <template> | ||||||
|  | 	<el-form size="small"> | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="1"> | ||||||
|  | 				小时,允许的通配符[, - * /] | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="2"> | ||||||
|  | 				周期从 | ||||||
|  | 				<el-input-number v-model='cycle01' :min="0" :max="22" /> - | ||||||
|  | 				<el-input-number v-model='cycle02' :min="cycle01 ? cycle01 + 1 : 1" :max="23" /> 小时 | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="3"> | ||||||
|  | 				从 | ||||||
|  | 				<el-input-number v-model='average01' :min="0" :max="22" /> 小时开始,每 | ||||||
|  | 				<el-input-number v-model='average02' :min="1" :max="23 - average01 || 0" /> 小时执行一次 | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="4"> | ||||||
|  | 				指定 | ||||||
|  | 				<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%"> | ||||||
|  | 					<el-option v-for="item in 24" :key="item" :value="item-1">{{item-1}}</el-option> | ||||||
|  | 				</el-select> | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  | 	</el-form> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | export default { | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			radioValue: 1, | ||||||
|  | 			cycle01: 0, | ||||||
|  | 			cycle02: 1, | ||||||
|  | 			average01: 0, | ||||||
|  | 			average02: 1, | ||||||
|  | 			checkboxList: [], | ||||||
|  | 			checkNum: this.$options.propsData.check | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	name: 'crontab-hour', | ||||||
|  | 	props: ['check', 'cron'], | ||||||
|  | 	methods: { | ||||||
|  | 		// 单选按钮值变化时 | ||||||
|  | 		radioChange() { | ||||||
|  | 			switch (this.radioValue) { | ||||||
|  | 				case 1: | ||||||
|  |         	this.$emit('update', 'hour', '*') | ||||||
|  |         	break; | ||||||
|  | 				case 2: | ||||||
|  | 					this.$emit('update', 'hour', this.cycleTotal); | ||||||
|  | 					break; | ||||||
|  | 				case 3: | ||||||
|  | 					this.$emit('update', 'hour', this.averageTotal); | ||||||
|  | 					break; | ||||||
|  | 				case 4: | ||||||
|  | 					this.$emit('update', 'hour', this.checkboxString); | ||||||
|  | 					break; | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 周期两个值变化时 | ||||||
|  | 		cycleChange() { | ||||||
|  | 			if (this.radioValue === '2') { | ||||||
|  | 				this.$emit('update', 'hour', this.cycleTotal); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 平均两个值变化时 | ||||||
|  | 		averageChange() { | ||||||
|  | 			if (this.radioValue === '3') { | ||||||
|  | 				this.$emit('update', 'hour', this.averageTotal); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// checkbox值变化时 | ||||||
|  | 		checkboxChange() { | ||||||
|  | 			if (this.radioValue === '4') { | ||||||
|  | 				this.$emit('update', 'hour', this.checkboxString); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	watch: { | ||||||
|  | 		'radioValue': 'radioChange', | ||||||
|  | 		'cycleTotal': 'cycleChange', | ||||||
|  | 		'averageTotal': 'averageChange', | ||||||
|  | 		'checkboxString': 'checkboxChange' | ||||||
|  | 	}, | ||||||
|  | 	computed: { | ||||||
|  | 		// 计算两个周期值 | ||||||
|  | 		cycleTotal: function () { | ||||||
|  | 			const cycle01 = this.checkNum(this.cycle01, 0, 22) | ||||||
|  | 			const cycle02 = this.checkNum(this.cycle02, cycle01 ? cycle01 + 1 : 1, 23) | ||||||
|  | 			return cycle01 + '-' + cycle02; | ||||||
|  | 		}, | ||||||
|  | 		// 计算平均用到的值 | ||||||
|  | 		averageTotal: function () { | ||||||
|  | 			const average01 = this.checkNum(this.average01, 0, 22) | ||||||
|  | 			const average02 = this.checkNum(this.average02, 1, 23 - average01 || 0) | ||||||
|  | 			return average01 + '/' + average02; | ||||||
|  | 		}, | ||||||
|  | 		// 计算勾选的checkbox值合集 | ||||||
|  | 		checkboxString: function () { | ||||||
|  | 			let str = this.checkboxList.join(); | ||||||
|  | 			return str === '' ? '*' : str; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | </script> | ||||||
							
								
								
									
										430
									
								
								src/components/Crontab/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										430
									
								
								src/components/Crontab/index.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,430 @@ | |||||||
|  | <template> | ||||||
|  |   <div> | ||||||
|  |     <el-tabs type="border-card"> | ||||||
|  |       <el-tab-pane label="秒" v-if="shouldHide('second')"> | ||||||
|  |         <CrontabSecond | ||||||
|  |           @update="updateCrontabValue" | ||||||
|  |           :check="checkNumber" | ||||||
|  |           :cron="crontabValueObj" | ||||||
|  |           ref="cronsecond" | ||||||
|  |         /> | ||||||
|  |       </el-tab-pane> | ||||||
|  |  | ||||||
|  |       <el-tab-pane label="分钟" v-if="shouldHide('min')"> | ||||||
|  |         <CrontabMin | ||||||
|  |           @update="updateCrontabValue" | ||||||
|  |           :check="checkNumber" | ||||||
|  |           :cron="crontabValueObj" | ||||||
|  |           ref="cronmin" | ||||||
|  |         /> | ||||||
|  |       </el-tab-pane> | ||||||
|  |  | ||||||
|  |       <el-tab-pane label="小时" v-if="shouldHide('hour')"> | ||||||
|  |         <CrontabHour | ||||||
|  |           @update="updateCrontabValue" | ||||||
|  |           :check="checkNumber" | ||||||
|  |           :cron="crontabValueObj" | ||||||
|  |           ref="cronhour" | ||||||
|  |         /> | ||||||
|  |       </el-tab-pane> | ||||||
|  |  | ||||||
|  |       <el-tab-pane label="日" v-if="shouldHide('day')"> | ||||||
|  |         <CrontabDay | ||||||
|  |           @update="updateCrontabValue" | ||||||
|  |           :check="checkNumber" | ||||||
|  |           :cron="crontabValueObj" | ||||||
|  |           ref="cronday" | ||||||
|  |         /> | ||||||
|  |       </el-tab-pane> | ||||||
|  |  | ||||||
|  |       <el-tab-pane label="月" v-if="shouldHide('month')"> | ||||||
|  |         <CrontabMonth | ||||||
|  |           @update="updateCrontabValue" | ||||||
|  |           :check="checkNumber" | ||||||
|  |           :cron="crontabValueObj" | ||||||
|  |           ref="cronmonth" | ||||||
|  |         /> | ||||||
|  |       </el-tab-pane> | ||||||
|  |  | ||||||
|  |       <el-tab-pane label="周" v-if="shouldHide('week')"> | ||||||
|  |         <CrontabWeek | ||||||
|  |           @update="updateCrontabValue" | ||||||
|  |           :check="checkNumber" | ||||||
|  |           :cron="crontabValueObj" | ||||||
|  |           ref="cronweek" | ||||||
|  |         /> | ||||||
|  |       </el-tab-pane> | ||||||
|  |  | ||||||
|  |       <el-tab-pane label="年" v-if="shouldHide('year')"> | ||||||
|  |         <CrontabYear | ||||||
|  |           @update="updateCrontabValue" | ||||||
|  |           :check="checkNumber" | ||||||
|  |           :cron="crontabValueObj" | ||||||
|  |           ref="cronyear" | ||||||
|  |         /> | ||||||
|  |       </el-tab-pane> | ||||||
|  |     </el-tabs> | ||||||
|  |  | ||||||
|  |     <div class="popup-main"> | ||||||
|  |       <div class="popup-result"> | ||||||
|  |         <p class="title">时间表达式</p> | ||||||
|  |         <table> | ||||||
|  |           <thead> | ||||||
|  |             <th v-for="item of tabTitles" width="40" :key="item">{{item}}</th> | ||||||
|  |             <th>Cron 表达式</th> | ||||||
|  |           </thead> | ||||||
|  |           <tbody> | ||||||
|  |             <td> | ||||||
|  |               <span>{{crontabValueObj.second}}</span> | ||||||
|  |             </td> | ||||||
|  |             <td> | ||||||
|  |               <span>{{crontabValueObj.min}}</span> | ||||||
|  |             </td> | ||||||
|  |             <td> | ||||||
|  |               <span>{{crontabValueObj.hour}}</span> | ||||||
|  |             </td> | ||||||
|  |             <td> | ||||||
|  |               <span>{{crontabValueObj.day}}</span> | ||||||
|  |             </td> | ||||||
|  |             <td> | ||||||
|  |               <span>{{crontabValueObj.month}}</span> | ||||||
|  |             </td> | ||||||
|  |             <td> | ||||||
|  |               <span>{{crontabValueObj.week}}</span> | ||||||
|  |             </td> | ||||||
|  |             <td> | ||||||
|  |               <span>{{crontabValueObj.year}}</span> | ||||||
|  |             </td> | ||||||
|  |             <td> | ||||||
|  |               <span>{{crontabValueString}}</span> | ||||||
|  |             </td> | ||||||
|  |           </tbody> | ||||||
|  |         </table> | ||||||
|  |       </div> | ||||||
|  |       <CrontabResult :ex="crontabValueString"></CrontabResult> | ||||||
|  |  | ||||||
|  |       <div class="pop_btn"> | ||||||
|  |         <el-button size="small" type="primary" @click="submitFill">确定</el-button> | ||||||
|  |         <el-button size="small" type="warning" @click="clearCron">重置</el-button> | ||||||
|  |         <el-button size="small" @click="hidePopup">取消</el-button> | ||||||
|  |       </div> | ||||||
|  |     </div> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | import CrontabSecond from "./second.vue"; | ||||||
|  | import CrontabMin from "./min.vue"; | ||||||
|  | import CrontabHour from "./hour.vue"; | ||||||
|  | import CrontabDay from "./day.vue"; | ||||||
|  | import CrontabMonth from "./month.vue"; | ||||||
|  | import CrontabWeek from "./week.vue"; | ||||||
|  | import CrontabYear from "./year.vue"; | ||||||
|  | import CrontabResult from "./result.vue"; | ||||||
|  |  | ||||||
|  | export default { | ||||||
|  |   data() { | ||||||
|  |     return { | ||||||
|  |       tabTitles: ["秒", "分钟", "小时", "日", "月", "周", "年"], | ||||||
|  |       tabActive: 0, | ||||||
|  |       myindex: 0, | ||||||
|  |       crontabValueObj: { | ||||||
|  |         second: "*", | ||||||
|  |         min: "*", | ||||||
|  |         hour: "*", | ||||||
|  |         day: "*", | ||||||
|  |         month: "*", | ||||||
|  |         week: "?", | ||||||
|  |         year: "", | ||||||
|  |       }, | ||||||
|  |     }; | ||||||
|  |   }, | ||||||
|  |   name: "vcrontab", | ||||||
|  |   props: ["expression", "hideComponent"], | ||||||
|  |   methods: { | ||||||
|  |     shouldHide(key) { | ||||||
|  |       return !(this.hideComponent && this.hideComponent.includes(key)); | ||||||
|  |  | ||||||
|  |     }, | ||||||
|  |     resolveExp() { | ||||||
|  |       // 反解析 表达式 | ||||||
|  |       if (this.expression) { | ||||||
|  |         let arr = this.expression.split(" "); | ||||||
|  |         if (arr.length >= 6) { | ||||||
|  |           //6 位以上是合法表达式 | ||||||
|  |           let obj = { | ||||||
|  |             second: arr[0], | ||||||
|  |             min: arr[1], | ||||||
|  |             hour: arr[2], | ||||||
|  |             day: arr[3], | ||||||
|  |             month: arr[4], | ||||||
|  |             week: arr[5], | ||||||
|  |             year: arr[6] ? arr[6] : "", | ||||||
|  |           }; | ||||||
|  |           this.crontabValueObj = { | ||||||
|  |             ...obj, | ||||||
|  |           }; | ||||||
|  |           for (let i in obj) { | ||||||
|  |             if (obj[i]) this.changeRadio(i, obj[i]); | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } else { | ||||||
|  |         // 没有传入的表达式 则还原 | ||||||
|  |         this.clearCron(); | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     // tab切换值 | ||||||
|  |     tabCheck(index) { | ||||||
|  |       this.tabActive = index; | ||||||
|  |     }, | ||||||
|  |     // 由子组件触发,更改表达式组成的字段值 | ||||||
|  |     updateCrontabValue(name, value, from) { | ||||||
|  |       "updateCrontabValue", name, value, from; | ||||||
|  |       this.crontabValueObj[name] = value; | ||||||
|  |       if (from && from !== name) { | ||||||
|  |         console.log(`来自组件 ${from} 改变了 ${name} ${value}`); | ||||||
|  |         this.changeRadio(name, value); | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     // 赋值到组件 | ||||||
|  |     changeRadio(name, value) { | ||||||
|  |       let arr = ["second", "min", "hour", "month"], | ||||||
|  |         refName = "cron" + name, | ||||||
|  |         insValue; | ||||||
|  |  | ||||||
|  |       if (!this.$refs[refName]) return; | ||||||
|  |  | ||||||
|  |       if (arr.includes(name)) { | ||||||
|  |         if (value === "*") { | ||||||
|  |           insValue = 1; | ||||||
|  |         } else if (value.indexOf("-") > -1) { | ||||||
|  |           let indexArr = value.split("-"); | ||||||
|  |           isNaN(indexArr[0]) | ||||||
|  |             ? (this.$refs[refName].cycle01 = 0) | ||||||
|  |             : (this.$refs[refName].cycle01 = indexArr[0]); | ||||||
|  |           this.$refs[refName].cycle02 = indexArr[1]; | ||||||
|  |           insValue = 2; | ||||||
|  |         } else if (value.indexOf("/") > -1) { | ||||||
|  |           let indexArr = value.split("/"); | ||||||
|  |           isNaN(indexArr[0]) | ||||||
|  |             ? (this.$refs[refName].average01 = 0) | ||||||
|  |             : (this.$refs[refName].average01 = indexArr[0]); | ||||||
|  |           this.$refs[refName].average02 = indexArr[1]; | ||||||
|  |           insValue = 3; | ||||||
|  |         } else { | ||||||
|  |           insValue = 4; | ||||||
|  |           this.$refs[refName].checkboxList = value.split(","); | ||||||
|  |         } | ||||||
|  |       } else if (name === "day") { | ||||||
|  |         if (value === "*") { | ||||||
|  |           insValue = 1; | ||||||
|  |         } else if (value === "?") { | ||||||
|  |           insValue = 2; | ||||||
|  |         } else if (value.indexOf("-") > -1) { | ||||||
|  |           let indexArr = value.split("-"); | ||||||
|  |           isNaN(indexArr[0]) | ||||||
|  |             ? (this.$refs[refName].cycle01 = 0) | ||||||
|  |             : (this.$refs[refName].cycle01 = indexArr[0]); | ||||||
|  |           this.$refs[refName].cycle02 = indexArr[1]; | ||||||
|  |           insValue = 3; | ||||||
|  |         } else if (value.indexOf("/") > -1) { | ||||||
|  |           let indexArr = value.split("/"); | ||||||
|  |           isNaN(indexArr[0]) | ||||||
|  |             ? (this.$refs[refName].average01 = 0) | ||||||
|  |             : (this.$refs[refName].average01 = indexArr[0]); | ||||||
|  |           this.$refs[refName].average02 = indexArr[1]; | ||||||
|  |           insValue = 4; | ||||||
|  |         } else if (value.indexOf("W") > -1) { | ||||||
|  |           let indexArr = value.split("W"); | ||||||
|  |           isNaN(indexArr[0]) | ||||||
|  |             ? (this.$refs[refName].workday = 0) | ||||||
|  |             : (this.$refs[refName].workday = indexArr[0]); | ||||||
|  |           insValue = 5; | ||||||
|  |         } else if (value === "L") { | ||||||
|  |           insValue = 6; | ||||||
|  |         } else { | ||||||
|  |           this.$refs[refName].checkboxList = value.split(","); | ||||||
|  |           insValue = 7; | ||||||
|  |         } | ||||||
|  |       } else if (name === "week") { | ||||||
|  |         if (value === "*") { | ||||||
|  |           insValue = 1; | ||||||
|  |         } else if (value === "?") { | ||||||
|  |           insValue = 2; | ||||||
|  |         } else if (value.indexOf("-") > -1) { | ||||||
|  |           let indexArr = value.split("-"); | ||||||
|  |           isNaN(indexArr[0]) | ||||||
|  |             ? (this.$refs[refName].cycle01 = 0) | ||||||
|  |             : (this.$refs[refName].cycle01 = indexArr[0]); | ||||||
|  |           this.$refs[refName].cycle02 = indexArr[1]; | ||||||
|  |           insValue = 3; | ||||||
|  |         } else if (value.indexOf("#") > -1) { | ||||||
|  |           let indexArr = value.split("#"); | ||||||
|  |           isNaN(indexArr[0]) | ||||||
|  |             ? (this.$refs[refName].average01 = 1) | ||||||
|  |             : (this.$refs[refName].average01 = indexArr[0]); | ||||||
|  |           this.$refs[refName].average02 = indexArr[1]; | ||||||
|  |           insValue = 4; | ||||||
|  |         } else if (value.indexOf("L") > -1) { | ||||||
|  |           let indexArr = value.split("L"); | ||||||
|  |           isNaN(indexArr[0]) | ||||||
|  |             ? (this.$refs[refName].weekday = 1) | ||||||
|  |             : (this.$refs[refName].weekday = indexArr[0]); | ||||||
|  |           insValue = 5; | ||||||
|  |         } else { | ||||||
|  |           this.$refs[refName].checkboxList = value.split(","); | ||||||
|  |           insValue = 6; | ||||||
|  |         } | ||||||
|  |       } else if (name === "year") { | ||||||
|  |         if (value === "") { | ||||||
|  |           insValue = 1; | ||||||
|  |         } else if (value === "*") { | ||||||
|  |           insValue = 2; | ||||||
|  |         } else if (value.indexOf("-") > -1) { | ||||||
|  |           insValue = 3; | ||||||
|  |         } else if (value.indexOf("/") > -1) { | ||||||
|  |           insValue = 4; | ||||||
|  |         } else { | ||||||
|  |           this.$refs[refName].checkboxList = value.split(","); | ||||||
|  |           insValue = 5; | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |       this.$refs[refName].radioValue = insValue; | ||||||
|  |     }, | ||||||
|  |     // 表单选项的子组件校验数字格式(通过-props传递) | ||||||
|  |     checkNumber(value, minLimit, maxLimit) { | ||||||
|  |       // 检查必须为整数 | ||||||
|  |       value = Math.floor(value); | ||||||
|  |       if (value < minLimit) { | ||||||
|  |         value = minLimit; | ||||||
|  |       } else if (value > maxLimit) { | ||||||
|  |         value = maxLimit; | ||||||
|  |       } | ||||||
|  |       return value; | ||||||
|  |     }, | ||||||
|  |     // 隐藏弹窗 | ||||||
|  |     hidePopup() { | ||||||
|  |       this.$emit("hide"); | ||||||
|  |     }, | ||||||
|  |     // 填充表达式 | ||||||
|  |     submitFill() { | ||||||
|  |       this.$emit("fill", this.crontabValueString); | ||||||
|  |       this.hidePopup(); | ||||||
|  |     }, | ||||||
|  |     clearCron() { | ||||||
|  |       // 还原选择项 | ||||||
|  |       ("准备还原"); | ||||||
|  |       this.crontabValueObj = { | ||||||
|  |         second: "*", | ||||||
|  |         min: "*", | ||||||
|  |         hour: "*", | ||||||
|  |         day: "*", | ||||||
|  |         month: "*", | ||||||
|  |         week: "?", | ||||||
|  |         year: "", | ||||||
|  |       }; | ||||||
|  |       for (let j in this.crontabValueObj) { | ||||||
|  |         this.changeRadio(j, this.crontabValueObj[j]); | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   computed: { | ||||||
|  |     crontabValueString: function() { | ||||||
|  |       let obj = this.crontabValueObj; | ||||||
|  |       let str = | ||||||
|  |         obj.second + | ||||||
|  |         " " + | ||||||
|  |         obj.min + | ||||||
|  |         " " + | ||||||
|  |         obj.hour + | ||||||
|  |         " " + | ||||||
|  |         obj.day + | ||||||
|  |         " " + | ||||||
|  |         obj.month + | ||||||
|  |         " " + | ||||||
|  |         obj.week + | ||||||
|  |         (obj.year === "" ? "" : " " + obj.year); | ||||||
|  |       return str; | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   components: { | ||||||
|  |     CrontabSecond, | ||||||
|  |     CrontabMin, | ||||||
|  |     CrontabHour, | ||||||
|  |     CrontabDay, | ||||||
|  |     CrontabMonth, | ||||||
|  |     CrontabWeek, | ||||||
|  |     CrontabYear, | ||||||
|  |     CrontabResult, | ||||||
|  |   }, | ||||||
|  |   watch: { | ||||||
|  |     expression: "resolveExp", | ||||||
|  |     hideComponent(value) { | ||||||
|  |       // 隐藏部分组件 | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   mounted: function() { | ||||||
|  |     this.resolveExp(); | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  | </script> | ||||||
|  | <style scoped> | ||||||
|  | .pop_btn { | ||||||
|  |   text-align: center; | ||||||
|  |   margin-top: 20px; | ||||||
|  | } | ||||||
|  | .popup-main { | ||||||
|  |   position: relative; | ||||||
|  |   margin: 10px auto; | ||||||
|  |   background: #fff; | ||||||
|  |   border-radius: 5px; | ||||||
|  |   font-size: 12px; | ||||||
|  |   overflow: hidden; | ||||||
|  | } | ||||||
|  | .popup-title { | ||||||
|  |   overflow: hidden; | ||||||
|  |   line-height: 34px; | ||||||
|  |   padding-top: 6px; | ||||||
|  |   background: #f2f2f2; | ||||||
|  | } | ||||||
|  | .popup-result { | ||||||
|  |   box-sizing: border-box; | ||||||
|  |   line-height: 24px; | ||||||
|  |   margin: 25px auto; | ||||||
|  |   padding: 15px 10px 10px; | ||||||
|  |   border: 1px solid #ccc; | ||||||
|  |   position: relative; | ||||||
|  | } | ||||||
|  | .popup-result .title { | ||||||
|  |   position: absolute; | ||||||
|  |   top: -28px; | ||||||
|  |   left: 50%; | ||||||
|  |   width: 140px; | ||||||
|  |   font-size: 14px; | ||||||
|  |   margin-left: -70px; | ||||||
|  |   text-align: center; | ||||||
|  |   line-height: 30px; | ||||||
|  |   background: #fff; | ||||||
|  | } | ||||||
|  | .popup-result table { | ||||||
|  |   text-align: center; | ||||||
|  |   width: 100%; | ||||||
|  |   margin: 0 auto; | ||||||
|  | } | ||||||
|  | .popup-result table span { | ||||||
|  |   display: block; | ||||||
|  |   width: 100%; | ||||||
|  |   font-family: arial; | ||||||
|  |   line-height: 30px; | ||||||
|  |   height: 30px; | ||||||
|  |   white-space: nowrap; | ||||||
|  |   overflow: hidden; | ||||||
|  |   border: 1px solid #e8e8e8; | ||||||
|  | } | ||||||
|  | .popup-result-scroll { | ||||||
|  |   font-size: 12px; | ||||||
|  |   line-height: 24px; | ||||||
|  |   height: 10em; | ||||||
|  |   overflow-y: auto; | ||||||
|  | } | ||||||
|  | </style> | ||||||
							
								
								
									
										116
									
								
								src/components/Crontab/min.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								src/components/Crontab/min.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | |||||||
|  | <template> | ||||||
|  | 	<el-form size="small"> | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="1"> | ||||||
|  | 				分钟,允许的通配符[, - * /] | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="2"> | ||||||
|  | 				周期从 | ||||||
|  | 				<el-input-number v-model='cycle01' :min="0" :max="58" /> - | ||||||
|  | 				<el-input-number v-model='cycle02' :min="cycle01 ? cycle01 + 1 : 1" :max="59" /> 分钟 | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="3"> | ||||||
|  | 				从 | ||||||
|  | 				<el-input-number v-model='average01' :min="0" :max="58" /> 分钟开始,每 | ||||||
|  | 				<el-input-number v-model='average02' :min="1" :max="59 - average01 || 0" /> 分钟执行一次 | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="4"> | ||||||
|  | 				指定 | ||||||
|  | 				<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%"> | ||||||
|  | 					<el-option v-for="item in 60" :key="item" :value="item-1">{{item-1}}</el-option> | ||||||
|  | 				</el-select> | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  | 	</el-form> | ||||||
|  |  | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | export default { | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			radioValue: 1, | ||||||
|  | 			cycle01: 1, | ||||||
|  | 			cycle02: 2, | ||||||
|  | 			average01: 0, | ||||||
|  | 			average02: 1, | ||||||
|  | 			checkboxList: [], | ||||||
|  | 			checkNum: this.$options.propsData.check | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	name: 'crontab-min', | ||||||
|  | 	props: ['check', 'cron'], | ||||||
|  | 	methods: { | ||||||
|  | 		// 单选按钮值变化时 | ||||||
|  | 		radioChange() { | ||||||
|  | 			switch (this.radioValue) { | ||||||
|  | 				case 1: | ||||||
|  | 					this.$emit('update', 'min', '*', 'min'); | ||||||
|  | 					break; | ||||||
|  | 				case 2: | ||||||
|  | 					this.$emit('update', 'min', this.cycleTotal, 'min'); | ||||||
|  | 					break; | ||||||
|  | 				case 3: | ||||||
|  | 					this.$emit('update', 'min', this.averageTotal, 'min'); | ||||||
|  | 					break; | ||||||
|  | 				case 4: | ||||||
|  | 					this.$emit('update', 'min', this.checkboxString, 'min'); | ||||||
|  | 					break; | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 周期两个值变化时 | ||||||
|  | 		cycleChange() { | ||||||
|  | 			if (this.radioValue === '2') { | ||||||
|  | 				this.$emit('update', 'min', this.cycleTotal, 'min'); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 平均两个值变化时 | ||||||
|  | 		averageChange() { | ||||||
|  | 			if (this.radioValue === '3') { | ||||||
|  | 				this.$emit('update', 'min', this.averageTotal, 'min'); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// checkbox值变化时 | ||||||
|  | 		checkboxChange() { | ||||||
|  | 			if (this.radioValue === '4') { | ||||||
|  | 				this.$emit('update', 'min', this.checkboxString, 'min'); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 	}, | ||||||
|  | 	watch: { | ||||||
|  | 		'radioValue': 'radioChange', | ||||||
|  | 		'cycleTotal': 'cycleChange', | ||||||
|  | 		'averageTotal': 'averageChange', | ||||||
|  | 		'checkboxString': 'checkboxChange', | ||||||
|  | 	}, | ||||||
|  | 	computed: { | ||||||
|  | 		// 计算两个周期值 | ||||||
|  | 		cycleTotal: function () { | ||||||
|  | 			const cycle01 = this.checkNum(this.cycle01, 0, 58) | ||||||
|  | 			const cycle02 = this.checkNum(this.cycle02, cycle01 ? cycle01 + 1 : 1, 59) | ||||||
|  | 			return cycle01 + '-' + cycle02; | ||||||
|  | 		}, | ||||||
|  | 		// 计算平均用到的值 | ||||||
|  | 		averageTotal: function () { | ||||||
|  | 			const average01 = this.checkNum(this.average01, 0, 58) | ||||||
|  | 			const average02 = this.checkNum(this.average02, 1, 59 - average01 || 0) | ||||||
|  | 			return average01 + '/' + average02; | ||||||
|  | 		}, | ||||||
|  | 		// 计算勾选的checkbox值合集 | ||||||
|  | 		checkboxString: function () { | ||||||
|  | 			let str = this.checkboxList.join(); | ||||||
|  | 			return str === '' ? '*' : str; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | </script> | ||||||
							
								
								
									
										114
									
								
								src/components/Crontab/month.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								src/components/Crontab/month.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | |||||||
|  | <template> | ||||||
|  | 	<el-form size='small'> | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="1"> | ||||||
|  | 				月,允许的通配符[, - * /] | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="2"> | ||||||
|  | 				周期从 | ||||||
|  | 				<el-input-number v-model='cycle01' :min="1" :max="11" /> - | ||||||
|  | 				<el-input-number v-model='cycle02' :min="cycle01 ? cycle01 + 1 : 2" :max="12" /> 月 | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="3"> | ||||||
|  | 				从 | ||||||
|  | 				<el-input-number v-model='average01' :min="1" :max="11" /> 月开始,每 | ||||||
|  | 				<el-input-number v-model='average02' :min="1" :max="12 - average01 || 0" /> 月月执行一次 | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="4"> | ||||||
|  | 				指定 | ||||||
|  | 				<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%"> | ||||||
|  | 					<el-option v-for="item in 12" :key="item" :value="item">{{item}}</el-option> | ||||||
|  | 				</el-select> | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  | 	</el-form> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | export default { | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			radioValue: 1, | ||||||
|  | 			cycle01: 1, | ||||||
|  | 			cycle02: 2, | ||||||
|  | 			average01: 1, | ||||||
|  | 			average02: 1, | ||||||
|  | 			checkboxList: [], | ||||||
|  | 			checkNum: this.check | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	name: 'crontab-month', | ||||||
|  | 	props: ['check', 'cron'], | ||||||
|  | 	methods: { | ||||||
|  | 		// 单选按钮值变化时 | ||||||
|  | 		radioChange() { | ||||||
|  | 			switch (this.radioValue) { | ||||||
|  | 				case 1: | ||||||
|  | 					this.$emit('update', 'month', '*'); | ||||||
|  | 					break; | ||||||
|  | 				case 2: | ||||||
|  | 					this.$emit('update', 'month', this.cycleTotal); | ||||||
|  | 					break; | ||||||
|  | 				case 3: | ||||||
|  | 					this.$emit('update', 'month', this.averageTotal); | ||||||
|  | 					break; | ||||||
|  | 				case 4: | ||||||
|  | 					this.$emit('update', 'month', this.checkboxString); | ||||||
|  | 					break; | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 周期两个值变化时 | ||||||
|  | 		cycleChange() { | ||||||
|  | 			if (this.radioValue === '2') { | ||||||
|  | 				this.$emit('update', 'month', this.cycleTotal); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 平均两个值变化时 | ||||||
|  | 		averageChange() { | ||||||
|  | 			if (this.radioValue === '3') { | ||||||
|  | 				this.$emit('update', 'month', this.averageTotal); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// checkbox值变化时 | ||||||
|  | 		checkboxChange() { | ||||||
|  | 			if (this.radioValue === '4') { | ||||||
|  | 				this.$emit('update', 'month', this.checkboxString); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	watch: { | ||||||
|  | 		'radioValue': 'radioChange', | ||||||
|  | 		'cycleTotal': 'cycleChange', | ||||||
|  | 		'averageTotal': 'averageChange', | ||||||
|  | 		'checkboxString': 'checkboxChange' | ||||||
|  | 	}, | ||||||
|  | 	computed: { | ||||||
|  | 		// 计算两个周期值 | ||||||
|  | 		cycleTotal: function () { | ||||||
|  | 			const cycle01 = this.checkNum(this.cycle01, 1, 11) | ||||||
|  | 			const cycle02 = this.checkNum(this.cycle02, cycle01 ? cycle01 + 1 : 2, 12) | ||||||
|  | 			return cycle01 + '-' + cycle02; | ||||||
|  | 		}, | ||||||
|  | 		// 计算平均用到的值 | ||||||
|  | 		averageTotal: function () { | ||||||
|  | 			const average01 = this.checkNum(this.average01, 1, 11) | ||||||
|  | 			const average02 = this.checkNum(this.average02, 1, 12 - average01 || 0) | ||||||
|  | 			return average01 + '/' + average02; | ||||||
|  | 		}, | ||||||
|  | 		// 计算勾选的checkbox值合集 | ||||||
|  | 		checkboxString: function () { | ||||||
|  | 			let str = this.checkboxList.join(); | ||||||
|  | 			return str === '' ? '*' : str; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | </script> | ||||||
							
								
								
									
										559
									
								
								src/components/Crontab/result.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										559
									
								
								src/components/Crontab/result.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,559 @@ | |||||||
|  | <template> | ||||||
|  | 	<div class="popup-result"> | ||||||
|  | 		<p class="title">最近5次运行时间</p> | ||||||
|  | 		<ul class="popup-result-scroll"> | ||||||
|  | 			<template v-if='isShow'> | ||||||
|  | 				<li v-for='item in resultList' :key="item">{{item}}</li> | ||||||
|  | 			</template> | ||||||
|  | 			<li v-else>计算结果中...</li> | ||||||
|  | 		</ul> | ||||||
|  | 	</div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | export default { | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			dayRule: '', | ||||||
|  | 			dayRuleSup: '', | ||||||
|  | 			dateArr: [], | ||||||
|  | 			resultList: [], | ||||||
|  | 			isShow: false | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	name: 'crontab-result', | ||||||
|  | 	methods: { | ||||||
|  | 		// 表达式值变化时,开始去计算结果 | ||||||
|  | 		expressionChange() { | ||||||
|  |  | ||||||
|  | 			// 计算开始-隐藏结果 | ||||||
|  | 			this.isShow = false; | ||||||
|  | 			// 获取规则数组[0秒、1分、2时、3日、4月、5星期、6年] | ||||||
|  | 			let ruleArr = this.$options.propsData.ex.split(' '); | ||||||
|  | 			// 用于记录进入循环的次数 | ||||||
|  | 			let nums = 0; | ||||||
|  | 			// 用于暂时存符号时间规则结果的数组 | ||||||
|  | 			let resultArr = []; | ||||||
|  | 			// 获取当前时间精确至[年、月、日、时、分、秒] | ||||||
|  | 			let nTime = new Date(); | ||||||
|  | 			let nYear = nTime.getFullYear(); | ||||||
|  | 			let nMonth = nTime.getMonth() + 1; | ||||||
|  | 			let nDay = nTime.getDate(); | ||||||
|  | 			let nHour = nTime.getHours(); | ||||||
|  | 			let nMin = nTime.getMinutes(); | ||||||
|  | 			let nSecond = nTime.getSeconds(); | ||||||
|  | 			// 根据规则获取到近100年可能年数组、月数组等等 | ||||||
|  | 			this.getSecondArr(ruleArr[0]); | ||||||
|  | 			this.getMinArr(ruleArr[1]); | ||||||
|  | 			this.getHourArr(ruleArr[2]); | ||||||
|  | 			this.getDayArr(ruleArr[3]); | ||||||
|  | 			this.getMonthArr(ruleArr[4]); | ||||||
|  | 			this.getWeekArr(ruleArr[5]); | ||||||
|  | 			this.getYearArr(ruleArr[6], nYear); | ||||||
|  | 			// 将获取到的数组赋值-方便使用 | ||||||
|  | 			let sDate = this.dateArr[0]; | ||||||
|  | 			let mDate = this.dateArr[1]; | ||||||
|  | 			let hDate = this.dateArr[2]; | ||||||
|  | 			let DDate = this.dateArr[3]; | ||||||
|  | 			let MDate = this.dateArr[4]; | ||||||
|  | 			let YDate = this.dateArr[5]; | ||||||
|  | 			// 获取当前时间在数组中的索引 | ||||||
|  | 			let sIdx = this.getIndex(sDate, nSecond); | ||||||
|  | 			let mIdx = this.getIndex(mDate, nMin); | ||||||
|  | 			let hIdx = this.getIndex(hDate, nHour); | ||||||
|  | 			let DIdx = this.getIndex(DDate, nDay); | ||||||
|  | 			let MIdx = this.getIndex(MDate, nMonth); | ||||||
|  | 			let YIdx = this.getIndex(YDate, nYear); | ||||||
|  | 			// 重置月日时分秒的函数(后面用的比较多) | ||||||
|  | 			const resetSecond = function () { | ||||||
|  | 				sIdx = 0; | ||||||
|  | 				nSecond = sDate[sIdx] | ||||||
|  | 			} | ||||||
|  | 			const resetMin = function () { | ||||||
|  | 				mIdx = 0; | ||||||
|  | 				nMin = mDate[mIdx] | ||||||
|  | 				resetSecond(); | ||||||
|  | 			} | ||||||
|  | 			const resetHour = function () { | ||||||
|  | 				hIdx = 0; | ||||||
|  | 				nHour = hDate[hIdx] | ||||||
|  | 				resetMin(); | ||||||
|  | 			} | ||||||
|  | 			const resetDay = function () { | ||||||
|  | 				DIdx = 0; | ||||||
|  | 				nDay = DDate[DIdx] | ||||||
|  | 				resetHour(); | ||||||
|  | 			} | ||||||
|  | 			const resetMonth = function () { | ||||||
|  | 				MIdx = 0; | ||||||
|  | 				nMonth = MDate[MIdx] | ||||||
|  | 				resetDay(); | ||||||
|  | 			} | ||||||
|  | 			// 如果当前年份不为数组中当前值 | ||||||
|  | 			if (nYear !== YDate[YIdx]) { | ||||||
|  | 				resetMonth(); | ||||||
|  | 			} | ||||||
|  | 			// 如果当前月份不为数组中当前值 | ||||||
|  | 			if (nMonth !== MDate[MIdx]) { | ||||||
|  | 				resetDay(); | ||||||
|  | 			} | ||||||
|  | 			// 如果当前“日”不为数组中当前值 | ||||||
|  | 			if (nDay !== DDate[DIdx]) { | ||||||
|  | 				resetHour(); | ||||||
|  | 			} | ||||||
|  | 			// 如果当前“时”不为数组中当前值 | ||||||
|  | 			if (nHour !== hDate[hIdx]) { | ||||||
|  | 				resetMin(); | ||||||
|  | 			} | ||||||
|  | 			// 如果当前“分”不为数组中当前值 | ||||||
|  | 			if (nMin !== mDate[mIdx]) { | ||||||
|  | 				resetSecond(); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			// 循环年份数组 | ||||||
|  | 			goYear: for (let Yi = YIdx; Yi < YDate.length; Yi++) { | ||||||
|  | 				let YY = YDate[Yi]; | ||||||
|  | 				// 如果到达最大值时 | ||||||
|  | 				if (nMonth > MDate[MDate.length - 1]) { | ||||||
|  | 					resetMonth(); | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				// 循环月份数组 | ||||||
|  | 				goMonth: for (let Mi = MIdx; Mi < MDate.length; Mi++) { | ||||||
|  | 					// 赋值、方便后面运算 | ||||||
|  | 					let MM = MDate[Mi]; | ||||||
|  | 					MM = MM < 10 ? '0' + MM : MM; | ||||||
|  | 					// 如果到达最大值时 | ||||||
|  | 					if (nDay > DDate[DDate.length - 1]) { | ||||||
|  | 						resetDay(); | ||||||
|  | 						if (Mi === MDate.length - 1) { | ||||||
|  | 							resetMonth(); | ||||||
|  | 							continue goYear; | ||||||
|  | 						} | ||||||
|  | 						continue; | ||||||
|  | 					} | ||||||
|  | 					// 循环日期数组 | ||||||
|  | 					goDay: for (let Di = DIdx; Di < DDate.length; Di++) { | ||||||
|  | 						// 赋值、方便后面运算 | ||||||
|  | 						let DD = DDate[Di]; | ||||||
|  | 						let thisDD = DD < 10 ? '0' + DD : DD; | ||||||
|  |  | ||||||
|  | 						// 如果到达最大值时 | ||||||
|  | 						if (nHour > hDate[hDate.length - 1]) { | ||||||
|  | 							resetHour(); | ||||||
|  | 							if (Di === DDate.length - 1) { | ||||||
|  | 								resetDay(); | ||||||
|  | 								if (Mi === MDate.length - 1) { | ||||||
|  | 									resetMonth(); | ||||||
|  | 									continue goYear; | ||||||
|  | 								} | ||||||
|  | 								continue goMonth; | ||||||
|  | 							} | ||||||
|  | 							continue; | ||||||
|  | 						} | ||||||
|  |  | ||||||
|  | 						// 判断日期的合法性,不合法的话也是跳出当前循环 | ||||||
|  | 						if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true && this.dayRule !== 'workDay' && this.dayRule !== 'lastWeek' && this.dayRule !== 'lastDay') { | ||||||
|  | 							resetDay(); | ||||||
|  | 							continue goMonth; | ||||||
|  | 						} | ||||||
|  | 						// 如果日期规则中有值时 | ||||||
|  | 						if (this.dayRule === 'lastDay') { | ||||||
|  | 							// 如果不是合法日期则需要将前将日期调到合法日期即月末最后一天 | ||||||
|  |  | ||||||
|  | 							if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) { | ||||||
|  | 								while (DD > 0 && this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) { | ||||||
|  | 									DD--; | ||||||
|  |  | ||||||
|  | 									thisDD = DD < 10 ? '0' + DD : DD; | ||||||
|  | 								} | ||||||
|  | 							} | ||||||
|  | 						} else if (this.dayRule === 'workDay') { | ||||||
|  | 							// 校验并调整如果是2月30号这种日期传进来时需调整至正常月底 | ||||||
|  | 							if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) { | ||||||
|  | 								while (DD > 0 && this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) { | ||||||
|  | 									DD--; | ||||||
|  | 									thisDD = DD < 10 ? '0' + DD : DD; | ||||||
|  | 								} | ||||||
|  | 							} | ||||||
|  | 							// 获取达到条件的日期是星期X | ||||||
|  | 							let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + thisDD + ' 00:00:00'), 'week'); | ||||||
|  | 							// 当星期日时 | ||||||
|  | 							if (thisWeek === 1) { | ||||||
|  | 								// 先找下一个日,并判断是否为月底 | ||||||
|  | 								DD++; | ||||||
|  | 								thisDD = DD < 10 ? '0' + DD : DD; | ||||||
|  | 								// 判断下一日已经不是合法日期 | ||||||
|  | 								if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) { | ||||||
|  | 									DD -= 3; | ||||||
|  | 								} | ||||||
|  | 							} else if (thisWeek === 7) { | ||||||
|  | 								// 当星期6时只需判断不是1号就可进行操作 | ||||||
|  | 								if (this.dayRuleSup !== 1) { | ||||||
|  | 									DD--; | ||||||
|  | 								} else { | ||||||
|  | 									DD += 2; | ||||||
|  | 								} | ||||||
|  | 							} | ||||||
|  | 						} else if (this.dayRule === 'weekDay') { | ||||||
|  | 							// 如果指定了是星期几 | ||||||
|  | 							// 获取当前日期是属于星期几 | ||||||
|  | 							let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + DD + ' 00:00:00'), 'week'); | ||||||
|  | 							// 校验当前星期是否在星期池(dayRuleSup)中 | ||||||
|  | 							if (this.dayRuleSup.indexOf(thisWeek) < 0) { | ||||||
|  | 								// 如果到达最大值时 | ||||||
|  | 								if (Di === DDate.length - 1) { | ||||||
|  | 									resetDay(); | ||||||
|  | 									if (Mi === MDate.length - 1) { | ||||||
|  | 										resetMonth(); | ||||||
|  | 										continue goYear; | ||||||
|  | 									} | ||||||
|  | 									continue goMonth; | ||||||
|  | 								} | ||||||
|  | 								continue; | ||||||
|  | 							} | ||||||
|  | 						} else if (this.dayRule === 'assWeek') { | ||||||
|  | 							// 如果指定了是第几周的星期几 | ||||||
|  | 							// 获取每月1号是属于星期几 | ||||||
|  | 							let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + DD + ' 00:00:00'), 'week'); | ||||||
|  | 							if (this.dayRuleSup[1] >= thisWeek) { | ||||||
|  | 								DD = (this.dayRuleSup[0] - 1) * 7 + this.dayRuleSup[1] - thisWeek + 1; | ||||||
|  | 							} else { | ||||||
|  | 								DD = this.dayRuleSup[0] * 7 + this.dayRuleSup[1] - thisWeek + 1; | ||||||
|  | 							} | ||||||
|  | 						} else if (this.dayRule === 'lastWeek') { | ||||||
|  | 							// 如果指定了每月最后一个星期几 | ||||||
|  | 							// 校验并调整如果是2月30号这种日期传进来时需调整至正常月底 | ||||||
|  | 							if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) { | ||||||
|  | 								while (DD > 0 && this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) { | ||||||
|  | 									DD--; | ||||||
|  | 									thisDD = DD < 10 ? '0' + DD : DD; | ||||||
|  | 								} | ||||||
|  | 							} | ||||||
|  | 							// 获取月末最后一天是星期几 | ||||||
|  | 							let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + thisDD + ' 00:00:00'), 'week'); | ||||||
|  | 							// 找到要求中最近的那个星期几 | ||||||
|  | 							if (this.dayRuleSup < thisWeek) { | ||||||
|  | 								DD -= thisWeek - this.dayRuleSup; | ||||||
|  | 							} else if (this.dayRuleSup > thisWeek) { | ||||||
|  | 								DD -= 7 - (this.dayRuleSup - thisWeek) | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 						// 判断时间值是否小于10置换成“05”这种格式 | ||||||
|  | 						DD = DD < 10 ? '0' + DD : DD; | ||||||
|  |  | ||||||
|  | 						// 循环“时”数组 | ||||||
|  | 						goHour: for (let hi = hIdx; hi < hDate.length; hi++) { | ||||||
|  | 							let hh = hDate[hi] < 10 ? '0' + hDate[hi] : hDate[hi] | ||||||
|  |  | ||||||
|  | 							// 如果到达最大值时 | ||||||
|  | 							if (nMin > mDate[mDate.length - 1]) { | ||||||
|  | 								resetMin(); | ||||||
|  | 								if (hi === hDate.length - 1) { | ||||||
|  | 									resetHour(); | ||||||
|  | 									if (Di === DDate.length - 1) { | ||||||
|  | 										resetDay(); | ||||||
|  | 										if (Mi === MDate.length - 1) { | ||||||
|  | 											resetMonth(); | ||||||
|  | 											continue goYear; | ||||||
|  | 										} | ||||||
|  | 										continue goMonth; | ||||||
|  | 									} | ||||||
|  | 									continue goDay; | ||||||
|  | 								} | ||||||
|  | 								continue; | ||||||
|  | 							} | ||||||
|  | 							// 循环"分"数组 | ||||||
|  | 							goMin: for (let mi = mIdx; mi < mDate.length; mi++) { | ||||||
|  | 								let mm = mDate[mi] < 10 ? '0' + mDate[mi] : mDate[mi]; | ||||||
|  |  | ||||||
|  | 								// 如果到达最大值时 | ||||||
|  | 								if (nSecond > sDate[sDate.length - 1]) { | ||||||
|  | 									resetSecond(); | ||||||
|  | 									if (mi === mDate.length - 1) { | ||||||
|  | 										resetMin(); | ||||||
|  | 										if (hi === hDate.length - 1) { | ||||||
|  | 											resetHour(); | ||||||
|  | 											if (Di === DDate.length - 1) { | ||||||
|  | 												resetDay(); | ||||||
|  | 												if (Mi === MDate.length - 1) { | ||||||
|  | 													resetMonth(); | ||||||
|  | 													continue goYear; | ||||||
|  | 												} | ||||||
|  | 												continue goMonth; | ||||||
|  | 											} | ||||||
|  | 											continue goDay; | ||||||
|  | 										} | ||||||
|  | 										continue goHour; | ||||||
|  | 									} | ||||||
|  | 									continue; | ||||||
|  | 								} | ||||||
|  | 								// 循环"秒"数组 | ||||||
|  | 								goSecond: for (let si = sIdx; si <= sDate.length - 1; si++) { | ||||||
|  | 									let ss = sDate[si] < 10 ? '0' + sDate[si] : sDate[si]; | ||||||
|  | 									// 添加当前时间(时间合法性在日期循环时已经判断) | ||||||
|  | 									if (MM !== '00' && DD !== '00') { | ||||||
|  | 										resultArr.push(YY + '-' + MM + '-' + DD + ' ' + hh + ':' + mm + ':' + ss) | ||||||
|  | 										nums++; | ||||||
|  | 									} | ||||||
|  | 									// 如果条数满了就退出循环 | ||||||
|  | 									if (nums === 5) break goYear; | ||||||
|  | 									// 如果到达最大值时 | ||||||
|  | 									if (si === sDate.length - 1) { | ||||||
|  | 										resetSecond(); | ||||||
|  | 										if (mi === mDate.length - 1) { | ||||||
|  | 											resetMin(); | ||||||
|  | 											if (hi === hDate.length - 1) { | ||||||
|  | 												resetHour(); | ||||||
|  | 												if (Di === DDate.length - 1) { | ||||||
|  | 													resetDay(); | ||||||
|  | 													if (Mi === MDate.length - 1) { | ||||||
|  | 														resetMonth(); | ||||||
|  | 														continue goYear; | ||||||
|  | 													} | ||||||
|  | 													continue goMonth; | ||||||
|  | 												} | ||||||
|  | 												continue goDay; | ||||||
|  | 											} | ||||||
|  | 											continue goHour; | ||||||
|  | 										} | ||||||
|  | 										continue goMin; | ||||||
|  | 									} | ||||||
|  | 								} //goSecond | ||||||
|  | 							} //goMin | ||||||
|  | 						}//goHour | ||||||
|  | 					}//goDay | ||||||
|  | 				}//goMonth | ||||||
|  | 			} | ||||||
|  | 			// 判断100年内的结果条数 | ||||||
|  | 			if (resultArr.length === 0) { | ||||||
|  | 				this.resultList = ['没有达到条件的结果!']; | ||||||
|  | 			} else { | ||||||
|  | 				this.resultList = resultArr; | ||||||
|  | 				if (resultArr.length !== 5) { | ||||||
|  | 					this.resultList.push('最近100年内只有上面' + resultArr.length + '条结果!') | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			// 计算完成-显示结果 | ||||||
|  | 			this.isShow = true; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 		}, | ||||||
|  | 		// 用于计算某位数字在数组中的索引 | ||||||
|  | 		getIndex(arr, value) { | ||||||
|  | 			if (value <= arr[0] || value > arr[arr.length - 1]) { | ||||||
|  | 				return 0; | ||||||
|  | 			} else { | ||||||
|  | 				for (let i = 0; i < arr.length - 1; i++) { | ||||||
|  | 					if (value > arr[i] && value <= arr[i + 1]) { | ||||||
|  | 						return i + 1; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 获取"年"数组 | ||||||
|  | 		getYearArr(rule, year) { | ||||||
|  | 			this.dateArr[5] = this.getOrderArr(year, year + 100); | ||||||
|  | 			if (rule !== undefined) { | ||||||
|  | 				if (rule.indexOf('-') >= 0) { | ||||||
|  | 					this.dateArr[5] = this.getCycleArr(rule, year + 100, false) | ||||||
|  | 				} else if (rule.indexOf('/') >= 0) { | ||||||
|  | 					this.dateArr[5] = this.getAverageArr(rule, year + 100) | ||||||
|  | 				} else if (rule !== '*') { | ||||||
|  | 					this.dateArr[5] = this.getAssignArr(rule) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 获取"月"数组 | ||||||
|  | 		getMonthArr(rule) { | ||||||
|  | 			this.dateArr[4] = this.getOrderArr(1, 12); | ||||||
|  | 			if (rule.indexOf('-') >= 0) { | ||||||
|  | 				this.dateArr[4] = this.getCycleArr(rule, 12, false) | ||||||
|  | 			} else if (rule.indexOf('/') >= 0) { | ||||||
|  | 				this.dateArr[4] = this.getAverageArr(rule, 12) | ||||||
|  | 			} else if (rule !== '*') { | ||||||
|  | 				this.dateArr[4] = this.getAssignArr(rule) | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 获取"日"数组-主要为日期规则 | ||||||
|  | 		getWeekArr(rule) { | ||||||
|  | 			// 只有当日期规则的两个值均为“”时则表达日期是有选项的 | ||||||
|  | 			if (this.dayRule === '' && this.dayRuleSup === '') { | ||||||
|  | 				if (rule.indexOf('-') >= 0) { | ||||||
|  | 					this.dayRule = 'weekDay'; | ||||||
|  | 					this.dayRuleSup = this.getCycleArr(rule, 7, false) | ||||||
|  | 				} else if (rule.indexOf('#') >= 0) { | ||||||
|  | 					this.dayRule = 'assWeek'; | ||||||
|  | 					let matchRule = rule.match(/[0-9]/g); | ||||||
|  | 					this.dayRuleSup = [Number(matchRule[1]), Number(matchRule[0])]; | ||||||
|  | 					this.dateArr[3] = [1]; | ||||||
|  | 					if (this.dayRuleSup[1] === 7) { | ||||||
|  | 						this.dayRuleSup[1] = 0; | ||||||
|  | 					} | ||||||
|  | 				} else if (rule.indexOf('L') >= 0) { | ||||||
|  | 					this.dayRule = 'lastWeek'; | ||||||
|  | 					this.dayRuleSup = Number(rule.match(/[0-9]{1,2}/g)[0]); | ||||||
|  | 					this.dateArr[3] = [31]; | ||||||
|  | 					if (this.dayRuleSup === 7) { | ||||||
|  | 						this.dayRuleSup = 0; | ||||||
|  | 					} | ||||||
|  | 				} else if (rule !== '*' && rule !== '?') { | ||||||
|  | 					this.dayRule = 'weekDay'; | ||||||
|  | 					this.dayRuleSup = this.getAssignArr(rule) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 获取"日"数组-少量为日期规则 | ||||||
|  | 		getDayArr(rule) { | ||||||
|  | 			this.dateArr[3] = this.getOrderArr(1, 31); | ||||||
|  | 			this.dayRule = ''; | ||||||
|  | 			this.dayRuleSup = ''; | ||||||
|  | 			if (rule.indexOf('-') >= 0) { | ||||||
|  | 				this.dateArr[3] = this.getCycleArr(rule, 31, false) | ||||||
|  | 				this.dayRuleSup = 'null'; | ||||||
|  | 			} else if (rule.indexOf('/') >= 0) { | ||||||
|  | 				this.dateArr[3] = this.getAverageArr(rule, 31) | ||||||
|  | 				this.dayRuleSup = 'null'; | ||||||
|  | 			} else if (rule.indexOf('W') >= 0) { | ||||||
|  | 				this.dayRule = 'workDay'; | ||||||
|  | 				this.dayRuleSup = Number(rule.match(/[0-9]{1,2}/g)[0]); | ||||||
|  | 				this.dateArr[3] = [this.dayRuleSup]; | ||||||
|  | 			} else if (rule.indexOf('L') >= 0) { | ||||||
|  | 				this.dayRule = 'lastDay'; | ||||||
|  | 				this.dayRuleSup = 'null'; | ||||||
|  | 				this.dateArr[3] = [31]; | ||||||
|  | 			} else if (rule !== '*' && rule !== '?') { | ||||||
|  | 				this.dateArr[3] = this.getAssignArr(rule) | ||||||
|  | 				this.dayRuleSup = 'null'; | ||||||
|  | 			} else if (rule === '*') { | ||||||
|  | 				this.dayRuleSup = 'null'; | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 获取"时"数组 | ||||||
|  | 		getHourArr(rule) { | ||||||
|  | 			this.dateArr[2] = this.getOrderArr(0, 23); | ||||||
|  | 			if (rule.indexOf('-') >= 0) { | ||||||
|  | 				this.dateArr[2] = this.getCycleArr(rule, 24, true) | ||||||
|  | 			} else if (rule.indexOf('/') >= 0) { | ||||||
|  | 				this.dateArr[2] = this.getAverageArr(rule, 23) | ||||||
|  | 			} else if (rule !== '*') { | ||||||
|  | 				this.dateArr[2] = this.getAssignArr(rule) | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 获取"分"数组 | ||||||
|  | 		getMinArr(rule) { | ||||||
|  | 			this.dateArr[1] = this.getOrderArr(0, 59); | ||||||
|  | 			if (rule.indexOf('-') >= 0) { | ||||||
|  | 				this.dateArr[1] = this.getCycleArr(rule, 60, true) | ||||||
|  | 			} else if (rule.indexOf('/') >= 0) { | ||||||
|  | 				this.dateArr[1] = this.getAverageArr(rule, 59) | ||||||
|  | 			} else if (rule !== '*') { | ||||||
|  | 				this.dateArr[1] = this.getAssignArr(rule) | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 获取"秒"数组 | ||||||
|  | 		getSecondArr(rule) { | ||||||
|  | 			this.dateArr[0] = this.getOrderArr(0, 59); | ||||||
|  | 			if (rule.indexOf('-') >= 0) { | ||||||
|  | 				this.dateArr[0] = this.getCycleArr(rule, 60, true) | ||||||
|  | 			} else if (rule.indexOf('/') >= 0) { | ||||||
|  | 				this.dateArr[0] = this.getAverageArr(rule, 59) | ||||||
|  | 			} else if (rule !== '*') { | ||||||
|  | 				this.dateArr[0] = this.getAssignArr(rule) | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 根据传进来的min-max返回一个顺序的数组 | ||||||
|  | 		getOrderArr(min, max) { | ||||||
|  | 			let arr = []; | ||||||
|  | 			for (let i = min; i <= max; i++) { | ||||||
|  | 				arr.push(i); | ||||||
|  | 			} | ||||||
|  | 			return arr; | ||||||
|  | 		}, | ||||||
|  | 		// 根据规则中指定的零散值返回一个数组 | ||||||
|  | 		getAssignArr(rule) { | ||||||
|  | 			let arr = []; | ||||||
|  | 			let assiginArr = rule.split(','); | ||||||
|  | 			for (let i = 0; i < assiginArr.length; i++) { | ||||||
|  | 				arr[i] = Number(assiginArr[i]) | ||||||
|  | 			} | ||||||
|  | 			arr.sort(this.compare) | ||||||
|  | 			return arr; | ||||||
|  | 		}, | ||||||
|  | 		// 根据一定算术规则计算返回一个数组 | ||||||
|  | 		getAverageArr(rule, limit) { | ||||||
|  | 			let arr = []; | ||||||
|  | 			let agArr = rule.split('/'); | ||||||
|  | 			let min = Number(agArr[0]); | ||||||
|  | 			let step = Number(agArr[1]); | ||||||
|  | 			while (min <= limit) { | ||||||
|  | 				arr.push(min); | ||||||
|  | 				min += step; | ||||||
|  | 			} | ||||||
|  | 			return arr; | ||||||
|  | 		}, | ||||||
|  | 		// 根据规则返回一个具有周期性的数组 | ||||||
|  | 		getCycleArr(rule, limit, status) { | ||||||
|  | 			// status--表示是否从0开始(则从1开始) | ||||||
|  | 			let arr = []; | ||||||
|  | 			let cycleArr = rule.split('-'); | ||||||
|  | 			let min = Number(cycleArr[0]); | ||||||
|  | 			let max = Number(cycleArr[1]); | ||||||
|  | 			if (min > max) { | ||||||
|  | 				max += limit; | ||||||
|  | 			} | ||||||
|  | 			for (let i = min; i <= max; i++) { | ||||||
|  | 				let add = 0; | ||||||
|  | 				if (status === false && i % limit === 0) { | ||||||
|  | 					add = limit; | ||||||
|  | 				} | ||||||
|  | 				arr.push(Math.round(i % limit + add)) | ||||||
|  | 			} | ||||||
|  | 			arr.sort(this.compare) | ||||||
|  | 			return arr; | ||||||
|  | 		}, | ||||||
|  | 		// 比较数字大小(用于Array.sort) | ||||||
|  | 		compare(value1, value2) { | ||||||
|  | 			if (value2 - value1 > 0) { | ||||||
|  | 				return -1; | ||||||
|  | 			} else { | ||||||
|  | 				return 1; | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 格式化日期格式如:2017-9-19 18:04:33 | ||||||
|  | 		formatDate(value, type) { | ||||||
|  | 			// 计算日期相关值 | ||||||
|  | 			let time = typeof value == 'number' ? new Date(value) : value; | ||||||
|  | 			let Y = time.getFullYear(); | ||||||
|  | 			let M = time.getMonth() + 1; | ||||||
|  | 			let D = time.getDate(); | ||||||
|  | 			let h = time.getHours(); | ||||||
|  | 			let m = time.getMinutes(); | ||||||
|  | 			let s = time.getSeconds(); | ||||||
|  | 			let week = time.getDay(); | ||||||
|  | 			// 如果传递了type的话 | ||||||
|  | 			if (type === undefined) { | ||||||
|  | 				return Y + '-' + (M < 10 ? '0' + M : M) + '-' + (D < 10 ? '0' + D : D) + ' ' + (h < 10 ? '0' + h : h) + ':' + (m < 10 ? '0' + m : m) + ':' + (s < 10 ? '0' + s : s); | ||||||
|  | 			} else if (type === 'week') { | ||||||
|  | 				// 在quartz中 1为星期日 | ||||||
|  | 				return week + 1; | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 检查日期是否存在 | ||||||
|  | 		checkDate(value) { | ||||||
|  | 			let time = new Date(value); | ||||||
|  | 			let format = this.formatDate(time) | ||||||
|  | 			return value === format; | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	watch: { | ||||||
|  | 		'ex': 'expressionChange' | ||||||
|  | 	}, | ||||||
|  | 	props: ['ex'], | ||||||
|  | 	mounted: function () { | ||||||
|  | 		// 初始化 获取一次结果 | ||||||
|  | 		this.expressionChange(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | </script> | ||||||
							
								
								
									
										117
									
								
								src/components/Crontab/second.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								src/components/Crontab/second.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | |||||||
|  | <template> | ||||||
|  | 	<el-form size="small"> | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="1"> | ||||||
|  | 				秒,允许的通配符[, - * /] | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="2"> | ||||||
|  | 				周期从 | ||||||
|  | 				<el-input-number v-model='cycle01' :min="0" :max="58" /> - | ||||||
|  | 				<el-input-number v-model='cycle02' :min="cycle01 ? cycle01 + 1 : 1" :max="59" /> 秒 | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="3"> | ||||||
|  | 				从 | ||||||
|  | 				<el-input-number v-model='average01' :min="0" :max="58" /> 秒开始,每 | ||||||
|  | 				<el-input-number v-model='average02' :min="1" :max="59 - average01 || 0" /> 秒执行一次 | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="4"> | ||||||
|  | 				指定 | ||||||
|  | 				<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%"> | ||||||
|  | 					<el-option v-for="item in 60" :key="item" :value="item-1">{{item-1}}</el-option> | ||||||
|  | 				</el-select> | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  | 	</el-form> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | export default { | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			radioValue: 1, | ||||||
|  | 			cycle01: 1, | ||||||
|  | 			cycle02: 2, | ||||||
|  | 			average01: 0, | ||||||
|  | 			average02: 1, | ||||||
|  | 			checkboxList: [], | ||||||
|  | 			checkNum: this.$options.propsData.check | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	name: 'crontab-second', | ||||||
|  | 	props: ['check', 'radioParent'], | ||||||
|  | 	methods: { | ||||||
|  | 		// 单选按钮值变化时 | ||||||
|  | 		radioChange() { | ||||||
|  | 			switch (this.radioValue) { | ||||||
|  | 				case 1: | ||||||
|  | 					this.$emit('update', 'second', '*', 'second'); | ||||||
|  | 					break; | ||||||
|  | 				case 2: | ||||||
|  | 					this.$emit('update', 'second', this.cycleTotal); | ||||||
|  | 					break; | ||||||
|  | 				case 3: | ||||||
|  | 					this.$emit('update', 'second', this.averageTotal); | ||||||
|  | 					break; | ||||||
|  | 				case 4: | ||||||
|  | 					this.$emit('update', 'second', this.checkboxString); | ||||||
|  | 					break; | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 周期两个值变化时 | ||||||
|  | 		cycleChange() { | ||||||
|  | 			if (this.radioValue === '2') { | ||||||
|  | 				this.$emit('update', 'second', this.cycleTotal); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 平均两个值变化时 | ||||||
|  | 		averageChange() { | ||||||
|  | 			if (this.radioValue === '3') { | ||||||
|  | 				this.$emit('update', 'second', this.averageTotal); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// checkbox值变化时 | ||||||
|  | 		checkboxChange() { | ||||||
|  | 			if (this.radioValue === '4') { | ||||||
|  | 				this.$emit('update', 'second', this.checkboxString); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	watch: { | ||||||
|  | 		'radioValue': 'radioChange', | ||||||
|  | 		'cycleTotal': 'cycleChange', | ||||||
|  | 		'averageTotal': 'averageChange', | ||||||
|  | 		'checkboxString': 'checkboxChange', | ||||||
|  | 		radioParent() { | ||||||
|  | 			this.radioValue = this.radioParent | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	computed: { | ||||||
|  | 		// 计算两个周期值 | ||||||
|  | 		cycleTotal: function () { | ||||||
|  | 			const cycle01 = this.checkNum(this.cycle01, 0, 58) | ||||||
|  | 			const cycle02 = this.checkNum(this.cycle02, cycle01 ? cycle01 + 1 : 1, 59) | ||||||
|  | 			return cycle01 + '-' + cycle02; | ||||||
|  | 		}, | ||||||
|  | 		// 计算平均用到的值 | ||||||
|  | 		averageTotal: function () { | ||||||
|  | 			const average01 = this.checkNum(this.average01, 0, 58) | ||||||
|  | 			const average02 = this.checkNum(this.average02, 1, 59 - average01 || 0) | ||||||
|  | 			return average01 + '/' + average02; | ||||||
|  | 		}, | ||||||
|  | 		// 计算勾选的checkbox值合集 | ||||||
|  | 		checkboxString: function () { | ||||||
|  | 			let str = this.checkboxList.join(); | ||||||
|  | 			return str === '' ? '*' : str; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | </script> | ||||||
							
								
								
									
										202
									
								
								src/components/Crontab/week.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										202
									
								
								src/components/Crontab/week.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,202 @@ | |||||||
|  | <template> | ||||||
|  | 	<el-form size='small'> | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="1"> | ||||||
|  | 				周,允许的通配符[, - * ? / L #] | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="2"> | ||||||
|  | 				不指定 | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="3"> | ||||||
|  | 				周期从星期 | ||||||
|  | 				<el-select clearable v-model="cycle01"> | ||||||
|  | 					<el-option | ||||||
|  | 						v-for="(item,index) of weekList" | ||||||
|  | 						:key="index" | ||||||
|  | 						:label="item.value" | ||||||
|  | 						:value="item.key" | ||||||
|  | 						:disabled="item.key === 1" | ||||||
|  | 					>{{item.value}}</el-option> | ||||||
|  | 				</el-select> | ||||||
|  | 				- | ||||||
|  | 				<el-select clearable v-model="cycle02"> | ||||||
|  | 					<el-option | ||||||
|  | 						v-for="(item,index) of weekList" | ||||||
|  | 						:key="index" | ||||||
|  | 						:label="item.value" | ||||||
|  | 						:value="item.key" | ||||||
|  | 						:disabled="item.key < cycle01 && item.key !== 1" | ||||||
|  | 					>{{item.value}}</el-option> | ||||||
|  | 				</el-select> | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="4"> | ||||||
|  | 				第 | ||||||
|  | 				<el-input-number v-model='average01' :min="1" :max="4" /> 周的星期 | ||||||
|  | 				<el-select clearable v-model="average02"> | ||||||
|  | 					<el-option v-for="(item,index) of weekList" :key="index" :label="item.value" :value="item.key">{{item.value}}</el-option> | ||||||
|  | 				</el-select> | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="5"> | ||||||
|  | 				本月最后一个星期 | ||||||
|  | 				<el-select clearable v-model="weekday"> | ||||||
|  | 					<el-option v-for="(item,index) of weekList" :key="index" :label="item.value" :value="item.key">{{item.value}}</el-option> | ||||||
|  | 				</el-select> | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio v-model='radioValue' :label="6"> | ||||||
|  | 				指定 | ||||||
|  | 				<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%"> | ||||||
|  | 					<el-option v-for="(item,index) of weekList" :key="index" :label="item.value" :value="String(item.key)">{{item.value}}</el-option> | ||||||
|  | 				</el-select> | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 	</el-form> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | export default { | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			radioValue: 2, | ||||||
|  | 			weekday: 2, | ||||||
|  | 			cycle01: 2, | ||||||
|  | 			cycle02: 3, | ||||||
|  | 			average01: 1, | ||||||
|  | 			average02: 2, | ||||||
|  | 			checkboxList: [], | ||||||
|  | 			weekList: [ | ||||||
|  | 				{ | ||||||
|  | 					key: 2, | ||||||
|  | 					value: '星期一' | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					key: 3, | ||||||
|  | 					value: '星期二' | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					key: 4, | ||||||
|  | 					value: '星期三' | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					key: 5, | ||||||
|  | 					value: '星期四' | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					key: 6, | ||||||
|  | 					value: '星期五' | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					key: 7, | ||||||
|  | 					value: '星期六' | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					key: 1, | ||||||
|  | 					value: '星期日' | ||||||
|  | 				} | ||||||
|  | 			], | ||||||
|  | 			checkNum: this.$options.propsData.check | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	name: 'crontab-week', | ||||||
|  | 	props: ['check', 'cron'], | ||||||
|  | 	methods: { | ||||||
|  | 		// 单选按钮值变化时 | ||||||
|  | 		radioChange() { | ||||||
|  | 			if (this.radioValue !== 2 && this.cron.day !== '?') { | ||||||
|  | 				this.$emit('update', 'day', '?', 'week'); | ||||||
|  | 			} | ||||||
|  | 			switch (this.radioValue) { | ||||||
|  | 				case 1: | ||||||
|  | 					this.$emit('update', 'week', '*'); | ||||||
|  | 					break; | ||||||
|  | 				case 2: | ||||||
|  | 					this.$emit('update', 'week', '?'); | ||||||
|  | 					break; | ||||||
|  | 				case 3: | ||||||
|  | 					this.$emit('update', 'week', this.cycleTotal); | ||||||
|  | 					break; | ||||||
|  | 				case 4: | ||||||
|  | 					this.$emit('update', 'week', this.averageTotal); | ||||||
|  | 					break; | ||||||
|  | 				case 5: | ||||||
|  | 					this.$emit('update', 'week', this.weekdayCheck + 'L'); | ||||||
|  | 					break; | ||||||
|  | 				case 6: | ||||||
|  | 					this.$emit('update', 'week', this.checkboxString); | ||||||
|  | 					break; | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		// 周期两个值变化时 | ||||||
|  | 		cycleChange() { | ||||||
|  | 			if (this.radioValue === '3') { | ||||||
|  | 				this.$emit('update', 'week', this.cycleTotal); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 平均两个值变化时 | ||||||
|  | 		averageChange() { | ||||||
|  | 			if (this.radioValue === '4') { | ||||||
|  | 				this.$emit('update', 'week', this.averageTotal); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 最近工作日值变化时 | ||||||
|  | 		weekdayChange() { | ||||||
|  | 			if (this.radioValue === '5') { | ||||||
|  | 				this.$emit('update', 'week', this.weekday + 'L'); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// checkbox值变化时 | ||||||
|  | 		checkboxChange() { | ||||||
|  | 			if (this.radioValue === '6') { | ||||||
|  | 				this.$emit('update', 'week', this.checkboxString); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	watch: { | ||||||
|  | 		'radioValue': 'radioChange', | ||||||
|  | 		'cycleTotal': 'cycleChange', | ||||||
|  | 		'averageTotal': 'averageChange', | ||||||
|  | 		'weekdayCheck': 'weekdayChange', | ||||||
|  | 		'checkboxString': 'checkboxChange', | ||||||
|  | 	}, | ||||||
|  | 	computed: { | ||||||
|  | 		// 计算两个周期值 | ||||||
|  | 		cycleTotal: function () { | ||||||
|  | 			this.cycle01 = this.checkNum(this.cycle01, 1, 7) | ||||||
|  | 			this.cycle02 = this.checkNum(this.cycle02, 1, 7) | ||||||
|  | 			return this.cycle01 + '-' + this.cycle02; | ||||||
|  | 		}, | ||||||
|  | 		// 计算平均用到的值 | ||||||
|  | 		averageTotal: function () { | ||||||
|  | 			this.average01 = this.checkNum(this.average01, 1, 4) | ||||||
|  | 			this.average02 = this.checkNum(this.average02, 1, 7) | ||||||
|  | 			return this.average02 + '#' + this.average01; | ||||||
|  | 		}, | ||||||
|  | 		// 最近的工作日(格式) | ||||||
|  | 		weekdayCheck: function () { | ||||||
|  | 			this.weekday = this.checkNum(this.weekday, 1, 7) | ||||||
|  | 			return this.weekday; | ||||||
|  | 		}, | ||||||
|  | 		// 计算勾选的checkbox值合集 | ||||||
|  | 		checkboxString: function () { | ||||||
|  | 			let str = this.checkboxList.join(); | ||||||
|  | 			return str === '' ? '*' : str; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | </script> | ||||||
							
								
								
									
										131
									
								
								src/components/Crontab/year.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								src/components/Crontab/year.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,131 @@ | |||||||
|  | <template> | ||||||
|  | 	<el-form size="small"> | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio :label="1" v-model='radioValue'> | ||||||
|  | 				不填,允许的通配符[, - * /] | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio :label="2" v-model='radioValue'> | ||||||
|  | 				每年 | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio :label="3" v-model='radioValue'> | ||||||
|  | 				周期从 | ||||||
|  | 				<el-input-number v-model='cycle01' :min='fullYear' :max="2098" /> - | ||||||
|  | 				<el-input-number v-model='cycle02' :min="cycle01 ? cycle01 + 1 : fullYear + 1" :max="2099" /> | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio :label="4" v-model='radioValue'> | ||||||
|  | 				从 | ||||||
|  | 				<el-input-number v-model='average01' :min='fullYear' :max="2098"/> 年开始,每 | ||||||
|  | 				<el-input-number v-model='average02' :min="1" :max="2099 - average01 || fullYear" /> 年执行一次 | ||||||
|  | 			</el-radio> | ||||||
|  |  | ||||||
|  | 		</el-form-item> | ||||||
|  |  | ||||||
|  | 		<el-form-item> | ||||||
|  | 			<el-radio :label="5" v-model='radioValue'> | ||||||
|  | 				指定 | ||||||
|  | 				<el-select clearable v-model="checkboxList" placeholder="可多选" multiple> | ||||||
|  | 					<el-option v-for="item in 9" :key="item" :value="item - 1 + fullYear" :label="item -1 + fullYear" /> | ||||||
|  | 				</el-select> | ||||||
|  | 			</el-radio> | ||||||
|  | 		</el-form-item> | ||||||
|  | 	</el-form> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | export default { | ||||||
|  | 	data() { | ||||||
|  | 		return { | ||||||
|  | 			fullYear: 0, | ||||||
|  | 			radioValue: 1, | ||||||
|  | 			cycle01: 0, | ||||||
|  | 			cycle02: 0, | ||||||
|  | 			average01: 0, | ||||||
|  | 			average02: 1, | ||||||
|  | 			checkboxList: [], | ||||||
|  | 			checkNum: this.$options.propsData.check | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	name: 'crontab-year', | ||||||
|  | 	props: ['check', 'month', 'cron'], | ||||||
|  | 	methods: { | ||||||
|  | 		// 单选按钮值变化时 | ||||||
|  | 		radioChange() { | ||||||
|  | 			switch (this.radioValue) { | ||||||
|  | 				case 1: | ||||||
|  | 					this.$emit('update', 'year', ''); | ||||||
|  | 					break; | ||||||
|  | 				case 2: | ||||||
|  | 					this.$emit('update', 'year', '*'); | ||||||
|  | 					break; | ||||||
|  | 				case 3: | ||||||
|  | 					this.$emit('update', 'year', this.cycleTotal); | ||||||
|  | 					break; | ||||||
|  | 				case 4: | ||||||
|  | 					this.$emit('update', 'year', this.averageTotal); | ||||||
|  | 					break; | ||||||
|  | 				case 5: | ||||||
|  | 					this.$emit('update', 'year', this.checkboxString); | ||||||
|  | 					break; | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 周期两个值变化时 | ||||||
|  | 		cycleChange() { | ||||||
|  | 			if (this.radioValue === '3') { | ||||||
|  | 				this.$emit('update', 'year', this.cycleTotal); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// 平均两个值变化时 | ||||||
|  | 		averageChange() { | ||||||
|  | 			if (this.radioValue === '4') { | ||||||
|  | 				this.$emit('update', 'year', this.averageTotal); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		// checkbox值变化时 | ||||||
|  | 		checkboxChange() { | ||||||
|  | 			if (this.radioValue === '5') { | ||||||
|  | 				this.$emit('update', 'year', this.checkboxString); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	watch: { | ||||||
|  | 		'radioValue': 'radioChange', | ||||||
|  | 		'cycleTotal': 'cycleChange', | ||||||
|  | 		'averageTotal': 'averageChange', | ||||||
|  | 		'checkboxString': 'checkboxChange' | ||||||
|  | 	}, | ||||||
|  | 	computed: { | ||||||
|  | 		// 计算两个周期值 | ||||||
|  | 		cycleTotal: function () { | ||||||
|  | 			const cycle01 = this.checkNum(this.cycle01, this.fullYear, 2098) | ||||||
|  | 			const cycle02 = this.checkNum(this.cycle02, cycle01 ? cycle01 + 1 : this.fullYear + 1, 2099) | ||||||
|  | 			return cycle01 + '-' + cycle02; | ||||||
|  | 		}, | ||||||
|  | 		// 计算平均用到的值 | ||||||
|  | 		averageTotal: function () { | ||||||
|  | 			const average01 = this.checkNum(this.average01, this.fullYear, 2098) | ||||||
|  | 			const average02 = this.checkNum(this.average02, 1, 2099 - average01 || this.fullYear) | ||||||
|  | 			return average01 + '/' + average02; | ||||||
|  | 		}, | ||||||
|  | 		// 计算勾选的checkbox值合集 | ||||||
|  | 		checkboxString: function () { | ||||||
|  | 			let str = this.checkboxList.join(); | ||||||
|  | 			return str; | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	mounted: function () { | ||||||
|  | 		// 仅获取当前年份 | ||||||
|  | 		this.fullYear = Number(new Date().getFullYear()); | ||||||
|  | 		this.cycle01 = this.fullYear | ||||||
|  | 		this.average01 = this.fullYear | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | </script> | ||||||
| @@ -12,7 +12,7 @@ | |||||||
| 		:label-width="`${labelWidth}px`" | 		:label-width="`${labelWidth}px`" | ||||||
| 		:size="size" | 		:size="size" | ||||||
| 		:label-position="labelPosition" | 		:label-position="labelPosition" | ||||||
| 		v-loading="formLoading"> | 		v-loading="0 && formLoading"> | ||||||
| 		<el-row :gutter="20" v-for="(row, rindex) in rows" :key="rindex"> | 		<el-row :gutter="20" v-for="(row, rindex) in rows" :key="rindex"> | ||||||
| 			<el-col v-for="col in row" :key="col.label" :span="24 / row.length"> | 			<el-col v-for="col in row" :key="col.label" :span="24 / row.length"> | ||||||
| 				<el-form-item :label="col.label" :prop="col.prop" :rules="col.rules"> | 				<el-form-item :label="col.label" :prop="col.prop" :rules="col.rules"> | ||||||
|   | |||||||
							
								
								
									
										630
									
								
								src/components/generator/config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										630
									
								
								src/components/generator/config.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,630 @@ | |||||||
|  | // 表单属性【右面板】 | ||||||
|  | export const formConf = { | ||||||
|  |   formRef: 'elForm', | ||||||
|  |   formModel: 'formData', | ||||||
|  |   size: 'medium', | ||||||
|  |   labelPosition: 'right', | ||||||
|  |   labelWidth: 100, | ||||||
|  |   formRules: 'rules', | ||||||
|  |   gutter: 15, | ||||||
|  |   disabled: false, | ||||||
|  |   span: 24, | ||||||
|  |   formBtns: true | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 输入型组件 【左面板】 | ||||||
|  | export const inputComponents = [ | ||||||
|  |   { | ||||||
|  |     // 组件的自定义配置 | ||||||
|  |     __config__: { | ||||||
|  |       label: '单行文本', | ||||||
|  |       labelWidth: null, | ||||||
|  |       showLabel: true, | ||||||
|  |       changeTag: true, | ||||||
|  |       tag: 'el-input', | ||||||
|  |       tagIcon: 'input', | ||||||
|  |       defaultValue: undefined, | ||||||
|  |       required: true, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       span: 24, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/input', | ||||||
|  |       // 正则校验规则 | ||||||
|  |       regList: [] | ||||||
|  |     }, | ||||||
|  |     // 组件的插槽属性 | ||||||
|  |     __slot__: { | ||||||
|  |       prepend: '', | ||||||
|  |       append: '' | ||||||
|  |     }, | ||||||
|  |     // 其余的为可直接写在组件标签上的属性 | ||||||
|  |     placeholder: '请输入', | ||||||
|  |     style: { width: '100%' }, | ||||||
|  |     clearable: true, | ||||||
|  |     'prefix-icon': '', | ||||||
|  |     'suffix-icon': '', | ||||||
|  |     maxlength: null, | ||||||
|  |     'show-word-limit': false, | ||||||
|  |     readonly: false, | ||||||
|  |     disabled: false | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '多行文本', | ||||||
|  |       labelWidth: null, | ||||||
|  |       showLabel: true, | ||||||
|  |       tag: 'el-input', | ||||||
|  |       tagIcon: 'textarea', | ||||||
|  |       defaultValue: undefined, | ||||||
|  |       required: true, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       span: 24, | ||||||
|  |       regList: [], | ||||||
|  |       changeTag: true, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/input' | ||||||
|  |     }, | ||||||
|  |     type: 'textarea', | ||||||
|  |     placeholder: '请输入', | ||||||
|  |     autosize: { | ||||||
|  |       minRows: 4, | ||||||
|  |       maxRows: 4 | ||||||
|  |     }, | ||||||
|  |     style: { width: '100%' }, | ||||||
|  |     maxlength: null, | ||||||
|  |     'show-word-limit': false, | ||||||
|  |     readonly: false, | ||||||
|  |     disabled: false | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '密码', | ||||||
|  |       showLabel: true, | ||||||
|  |       labelWidth: null, | ||||||
|  |       changeTag: true, | ||||||
|  |       tag: 'el-input', | ||||||
|  |       tagIcon: 'password', | ||||||
|  |       defaultValue: undefined, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       span: 24, | ||||||
|  |       required: true, | ||||||
|  |       regList: [], | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/input' | ||||||
|  |     }, | ||||||
|  |     __slot__: { | ||||||
|  |       prepend: '', | ||||||
|  |       append: '' | ||||||
|  |     }, | ||||||
|  |     placeholder: '请输入', | ||||||
|  |     'show-password': true, | ||||||
|  |     style: { width: '100%' }, | ||||||
|  |     clearable: true, | ||||||
|  |     'prefix-icon': '', | ||||||
|  |     'suffix-icon': '', | ||||||
|  |     maxlength: null, | ||||||
|  |     'show-word-limit': false, | ||||||
|  |     readonly: false, | ||||||
|  |     disabled: false | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '计数器', | ||||||
|  |       showLabel: true, | ||||||
|  |       changeTag: true, | ||||||
|  |       labelWidth: null, | ||||||
|  |       tag: 'el-input-number', | ||||||
|  |       tagIcon: 'number', | ||||||
|  |       defaultValue: undefined, | ||||||
|  |       span: 24, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       required: true, | ||||||
|  |       regList: [], | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/input-number' | ||||||
|  |     }, | ||||||
|  |     placeholder: '', | ||||||
|  |     min: undefined, | ||||||
|  |     max: undefined, | ||||||
|  |     step: 1, | ||||||
|  |     'step-strictly': false, | ||||||
|  |     precision: undefined, | ||||||
|  |     'controls-position': '', | ||||||
|  |     disabled: false | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '编辑器', | ||||||
|  |       showLabel: true, | ||||||
|  |       changeTag: true, | ||||||
|  |       labelWidth: null, | ||||||
|  |       tag: 'tinymce', | ||||||
|  |       tagIcon: 'rich-text', | ||||||
|  |       defaultValue: null, | ||||||
|  |       span: 24, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       required: true, | ||||||
|  |       regList: [], | ||||||
|  |       document: 'http://tinymce.ax-z.cn' | ||||||
|  |     }, | ||||||
|  |     placeholder: '请输入', | ||||||
|  |     height: 300, // 编辑器高度 | ||||||
|  |     branding: false // 隐藏右下角品牌烙印 | ||||||
|  |   } | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | // 选择型组件 【左面板】 | ||||||
|  | export const selectComponents = [ | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '下拉选择', | ||||||
|  |       showLabel: true, | ||||||
|  |       labelWidth: null, | ||||||
|  |       tag: 'el-select', | ||||||
|  |       tagIcon: 'select', | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       span: 24, | ||||||
|  |       required: true, | ||||||
|  |       regList: [], | ||||||
|  |       changeTag: true, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/select' | ||||||
|  |     }, | ||||||
|  |     __slot__: { | ||||||
|  |       options: [{ | ||||||
|  |         label: '选项一', | ||||||
|  |         value: 1 | ||||||
|  |       }, { | ||||||
|  |         label: '选项二', | ||||||
|  |         value: 2 | ||||||
|  |       }] | ||||||
|  |     }, | ||||||
|  |     placeholder: '请选择', | ||||||
|  |     style: { width: '100%' }, | ||||||
|  |     clearable: true, | ||||||
|  |     disabled: false, | ||||||
|  |     filterable: false, | ||||||
|  |     multiple: false | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '级联选择', | ||||||
|  |       url: 'https://www.fastmock.site/mock/f8d7a54fb1e60561e2f720d5a810009d/fg/cascaderList', | ||||||
|  |       method: 'get', | ||||||
|  |       dataPath: 'list', | ||||||
|  |       dataConsumer: 'options', | ||||||
|  |       showLabel: true, | ||||||
|  |       labelWidth: null, | ||||||
|  |       tag: 'el-cascader', | ||||||
|  |       tagIcon: 'cascader', | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       defaultValue: [], | ||||||
|  |       dataType: 'dynamic', | ||||||
|  |       span: 24, | ||||||
|  |       required: true, | ||||||
|  |       regList: [], | ||||||
|  |       changeTag: true, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/cascader' | ||||||
|  |     }, | ||||||
|  |     options: [{ | ||||||
|  |       id: 1, | ||||||
|  |       value: 1, | ||||||
|  |       label: '选项1', | ||||||
|  |       children: [{ | ||||||
|  |         id: 2, | ||||||
|  |         value: 2, | ||||||
|  |         label: '选项1-1' | ||||||
|  |       }] | ||||||
|  |     }], | ||||||
|  |     placeholder: '请选择', | ||||||
|  |     style: { width: '100%' }, | ||||||
|  |     props: { | ||||||
|  |       props: { | ||||||
|  |         multiple: false, | ||||||
|  |         label: 'label', | ||||||
|  |         value: 'value', | ||||||
|  |         children: 'children' | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     'show-all-levels': true, | ||||||
|  |     disabled: false, | ||||||
|  |     clearable: true, | ||||||
|  |     filterable: false, | ||||||
|  |     separator: '/' | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '单选框组', | ||||||
|  |       labelWidth: null, | ||||||
|  |       showLabel: true, | ||||||
|  |       tag: 'el-radio-group', | ||||||
|  |       tagIcon: 'radio', | ||||||
|  |       changeTag: true, | ||||||
|  |       defaultValue: undefined, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       span: 24, | ||||||
|  |       optionType: 'default', | ||||||
|  |       regList: [], | ||||||
|  |       required: true, | ||||||
|  |       border: false, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/radio' | ||||||
|  |     }, | ||||||
|  |     __slot__: { | ||||||
|  |       options: [{ | ||||||
|  |         label: '选项一', | ||||||
|  |         value: 1 | ||||||
|  |       }, { | ||||||
|  |         label: '选项二', | ||||||
|  |         value: 2 | ||||||
|  |       }] | ||||||
|  |     }, | ||||||
|  |     style: {}, | ||||||
|  |     size: 'medium', | ||||||
|  |     disabled: false | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '多选框组', | ||||||
|  |       tag: 'el-checkbox-group', | ||||||
|  |       tagIcon: 'checkbox', | ||||||
|  |       defaultValue: [], | ||||||
|  |       span: 24, | ||||||
|  |       showLabel: true, | ||||||
|  |       labelWidth: null, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       optionType: 'default', | ||||||
|  |       required: true, | ||||||
|  |       regList: [], | ||||||
|  |       changeTag: true, | ||||||
|  |       border: false, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/checkbox' | ||||||
|  |     }, | ||||||
|  |     __slot__: { | ||||||
|  |       options: [{ | ||||||
|  |         label: '选项一', | ||||||
|  |         value: 1 | ||||||
|  |       }, { | ||||||
|  |         label: '选项二', | ||||||
|  |         value: 2 | ||||||
|  |       }] | ||||||
|  |     }, | ||||||
|  |     style: {}, | ||||||
|  |     size: 'medium', | ||||||
|  |     min: null, | ||||||
|  |     max: null, | ||||||
|  |     disabled: false | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '开关', | ||||||
|  |       tag: 'el-switch', | ||||||
|  |       tagIcon: 'switch', | ||||||
|  |       defaultValue: false, | ||||||
|  |       span: 24, | ||||||
|  |       showLabel: true, | ||||||
|  |       labelWidth: null, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       required: true, | ||||||
|  |       regList: [], | ||||||
|  |       changeTag: true, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/switch' | ||||||
|  |     }, | ||||||
|  |     style: {}, | ||||||
|  |     disabled: false, | ||||||
|  |     'active-text': '', | ||||||
|  |     'inactive-text': '', | ||||||
|  |     'active-color': null, | ||||||
|  |     'inactive-color': null, | ||||||
|  |     'active-value': true, | ||||||
|  |     'inactive-value': false | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '滑块', | ||||||
|  |       tag: 'el-slider', | ||||||
|  |       tagIcon: 'slider', | ||||||
|  |       defaultValue: null, | ||||||
|  |       span: 24, | ||||||
|  |       showLabel: true, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       labelWidth: null, | ||||||
|  |       required: true, | ||||||
|  |       regList: [], | ||||||
|  |       changeTag: true, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/slider' | ||||||
|  |     }, | ||||||
|  |     disabled: false, | ||||||
|  |     min: 0, | ||||||
|  |     max: 100, | ||||||
|  |     step: 1, | ||||||
|  |     'show-stops': false, | ||||||
|  |     range: false | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '时间选择', | ||||||
|  |       tag: 'el-time-picker', | ||||||
|  |       tagIcon: 'time', | ||||||
|  |       defaultValue: null, | ||||||
|  |       span: 24, | ||||||
|  |       showLabel: true, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       labelWidth: null, | ||||||
|  |       required: true, | ||||||
|  |       regList: [], | ||||||
|  |       changeTag: true, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/time-picker' | ||||||
|  |     }, | ||||||
|  |     placeholder: '请选择', | ||||||
|  |     style: { width: '100%' }, | ||||||
|  |     disabled: false, | ||||||
|  |     clearable: true, | ||||||
|  |     'picker-options': { | ||||||
|  |       selectableRange: '00:00:00-23:59:59' | ||||||
|  |     }, | ||||||
|  |     format: 'HH:mm:ss', | ||||||
|  |     'value-format': 'HH:mm:ss' | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '时间范围', | ||||||
|  |       tag: 'el-time-picker', | ||||||
|  |       tagIcon: 'time-range', | ||||||
|  |       span: 24, | ||||||
|  |       showLabel: true, | ||||||
|  |       labelWidth: null, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       defaultValue: null, | ||||||
|  |       required: true, | ||||||
|  |       regList: [], | ||||||
|  |       changeTag: true, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/time-picker' | ||||||
|  |     }, | ||||||
|  |     style: { width: '100%' }, | ||||||
|  |     disabled: false, | ||||||
|  |     clearable: true, | ||||||
|  |     'is-range': true, | ||||||
|  |     'range-separator': '至', | ||||||
|  |     'start-placeholder': '开始时间', | ||||||
|  |     'end-placeholder': '结束时间', | ||||||
|  |     format: 'HH:mm:ss', | ||||||
|  |     'value-format': 'HH:mm:ss' | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '日期选择', | ||||||
|  |       tag: 'el-date-picker', | ||||||
|  |       tagIcon: 'date', | ||||||
|  |       defaultValue: null, | ||||||
|  |       showLabel: true, | ||||||
|  |       labelWidth: null, | ||||||
|  |       span: 24, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       required: true, | ||||||
|  |       regList: [], | ||||||
|  |       changeTag: true, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/date-picker' | ||||||
|  |     }, | ||||||
|  |     placeholder: '请选择', | ||||||
|  |     type: 'date', | ||||||
|  |     style: { width: '100%' }, | ||||||
|  |     disabled: false, | ||||||
|  |     clearable: true, | ||||||
|  |     format: 'yyyy-MM-dd', | ||||||
|  |     'value-format': 'yyyy-MM-dd', | ||||||
|  |     readonly: false | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '日期范围', | ||||||
|  |       tag: 'el-date-picker', | ||||||
|  |       tagIcon: 'date-range', | ||||||
|  |       defaultValue: null, | ||||||
|  |       span: 24, | ||||||
|  |       showLabel: true, | ||||||
|  |       labelWidth: null, | ||||||
|  |       required: true, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       regList: [], | ||||||
|  |       changeTag: true, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/date-picker' | ||||||
|  |     }, | ||||||
|  |     style: { width: '100%' }, | ||||||
|  |     type: 'daterange', | ||||||
|  |     'range-separator': '至', | ||||||
|  |     'start-placeholder': '开始日期', | ||||||
|  |     'end-placeholder': '结束日期', | ||||||
|  |     disabled: false, | ||||||
|  |     clearable: true, | ||||||
|  |     format: 'yyyy-MM-dd', | ||||||
|  |     'value-format': 'yyyy-MM-dd', | ||||||
|  |     readonly: false | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '评分', | ||||||
|  |       tag: 'el-rate', | ||||||
|  |       tagIcon: 'rate', | ||||||
|  |       defaultValue: 0, | ||||||
|  |       span: 24, | ||||||
|  |       showLabel: true, | ||||||
|  |       labelWidth: null, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       required: true, | ||||||
|  |       regList: [], | ||||||
|  |       changeTag: true, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/rate' | ||||||
|  |     }, | ||||||
|  |     style: {}, | ||||||
|  |     max: 5, | ||||||
|  |     'allow-half': false, | ||||||
|  |     'show-text': false, | ||||||
|  |     'show-score': false, | ||||||
|  |     disabled: false | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '颜色选择', | ||||||
|  |       tag: 'el-color-picker', | ||||||
|  |       tagIcon: 'color', | ||||||
|  |       span: 24, | ||||||
|  |       defaultValue: null, | ||||||
|  |       showLabel: true, | ||||||
|  |       labelWidth: null, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       required: true, | ||||||
|  |       regList: [], | ||||||
|  |       changeTag: true, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/color-picker' | ||||||
|  |     }, | ||||||
|  |     'show-alpha': false, | ||||||
|  |     'color-format': '', | ||||||
|  |     disabled: false, | ||||||
|  |     size: 'medium' | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '上传', | ||||||
|  |       tag: 'el-upload', | ||||||
|  |       tagIcon: 'upload', | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       defaultValue: null, | ||||||
|  |       showLabel: true, | ||||||
|  |       labelWidth: null, | ||||||
|  |       required: true, | ||||||
|  |       span: 24, | ||||||
|  |       showTip: false, | ||||||
|  |       buttonText: '点击上传', | ||||||
|  |       regList: [], | ||||||
|  |       changeTag: true, | ||||||
|  |       fileSize: 2, | ||||||
|  |       sizeUnit: 'MB', | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/upload' | ||||||
|  |     }, | ||||||
|  |     __slot__: { | ||||||
|  |       'list-type': true | ||||||
|  |     }, | ||||||
|  |     // action: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload", // 请求地址 | ||||||
|  |     action: '/infra/file/upload', // 请求地址 | ||||||
|  |     disabled: false, | ||||||
|  |     accept: '', | ||||||
|  |     name: 'file', | ||||||
|  |     'auto-upload': true, | ||||||
|  |     'list-type': 'text', | ||||||
|  |     multiple: false | ||||||
|  |   } | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | // 布局型组件 【左面板】 | ||||||
|  | export const layoutComponents = [ | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       layout: 'rowFormItem', | ||||||
|  |       tagIcon: 'row', | ||||||
|  |       label: '行容器', | ||||||
|  |       layoutTree: true, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/layout#row-attributes' | ||||||
|  |     }, | ||||||
|  |     type: 'default', | ||||||
|  |     justify: 'start', | ||||||
|  |     align: 'top' | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '按钮', | ||||||
|  |       showLabel: true, | ||||||
|  |       changeTag: true, | ||||||
|  |       labelWidth: null, | ||||||
|  |       tag: 'el-button', | ||||||
|  |       tagIcon: 'button', | ||||||
|  |       span: 24, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/button' | ||||||
|  |     }, | ||||||
|  |     __slot__: { | ||||||
|  |       default: '主要按钮' | ||||||
|  |     }, | ||||||
|  |     type: 'primary', | ||||||
|  |     icon: 'el-icon-search', | ||||||
|  |     round: false, | ||||||
|  |     size: 'medium', | ||||||
|  |     plain: false, | ||||||
|  |     circle: false, | ||||||
|  |     disabled: false | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       tagIcon: 'table', | ||||||
|  |       tag: 'el-table', | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/table', | ||||||
|  |       span: 24, | ||||||
|  |       formId: 101, | ||||||
|  |       renderKey: 1595761764203, | ||||||
|  |       componentName: 'row101', | ||||||
|  |       showLabel: true, | ||||||
|  |       changeTag: true, | ||||||
|  |       labelWidth: null, | ||||||
|  |       label: '表格[开发中]', | ||||||
|  |       dataType: 'dynamic', | ||||||
|  |       method: 'get', | ||||||
|  |       dataPath: 'list', | ||||||
|  |       dataConsumer: 'data', | ||||||
|  |       url: 'https://www.fastmock.site/mock/f8d7a54fb1e60561e2f720d5a810009d/fg/tableData', | ||||||
|  |       children: [{ | ||||||
|  |         __config__: { | ||||||
|  |           layout: 'raw', | ||||||
|  |           tag: 'el-table-column', | ||||||
|  |           renderKey: 15957617660153 | ||||||
|  |         }, | ||||||
|  |         prop: 'date', | ||||||
|  |         label: '日期' | ||||||
|  |       }, { | ||||||
|  |         __config__: { | ||||||
|  |           layout: 'raw', | ||||||
|  |           tag: 'el-table-column', | ||||||
|  |           renderKey: 15957617660152 | ||||||
|  |         }, | ||||||
|  |         prop: 'address', | ||||||
|  |         label: '地址' | ||||||
|  |       }, { | ||||||
|  |         __config__: { | ||||||
|  |           layout: 'raw', | ||||||
|  |           tag: 'el-table-column', | ||||||
|  |           renderKey: 15957617660151 | ||||||
|  |         }, | ||||||
|  |         prop: 'name', | ||||||
|  |         label: '名称' | ||||||
|  |       }, { | ||||||
|  |         __config__: { | ||||||
|  |           layout: 'raw', | ||||||
|  |           tag: 'el-table-column', | ||||||
|  |           renderKey: 1595774496335, | ||||||
|  |           children: [ | ||||||
|  |             { | ||||||
|  |               __config__: { | ||||||
|  |                 label: '按钮', | ||||||
|  |                 tag: 'el-button', | ||||||
|  |                 tagIcon: 'button', | ||||||
|  |                 layout: 'raw', | ||||||
|  |                 renderKey: 1595779809901 | ||||||
|  |               }, | ||||||
|  |               __slot__: { | ||||||
|  |                 default: '主要按钮' | ||||||
|  |               }, | ||||||
|  |               type: 'primary', | ||||||
|  |               icon: 'el-icon-search', | ||||||
|  |               round: false, | ||||||
|  |               size: 'medium' | ||||||
|  |             } | ||||||
|  |           ] | ||||||
|  |         }, | ||||||
|  |         label: '操作' | ||||||
|  |       }] | ||||||
|  |     }, | ||||||
|  |     data: [], | ||||||
|  |     directives: [{ | ||||||
|  |       name: 'loading', | ||||||
|  |       value: true | ||||||
|  |     }], | ||||||
|  |     border: true, | ||||||
|  |     type: 'default', | ||||||
|  |     justify: 'start', | ||||||
|  |     align: 'top' | ||||||
|  |   } | ||||||
|  | ] | ||||||
							
								
								
									
										18
									
								
								src/components/generator/css.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/components/generator/css.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | const styles = { | ||||||
|  |   'el-rate': '.el-rate{display: inline-block; vertical-align: text-top;}', | ||||||
|  |   'el-upload': '.el-upload__tip{line-height: 1.2;}' | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function addCss(cssList, el) { | ||||||
|  |   const css = styles[el.__config__.tag] | ||||||
|  |   css && cssList.indexOf(css) === -1 && cssList.push(css) | ||||||
|  |   if (el.__config__.children) { | ||||||
|  |     el.__config__.children.forEach(el2 => addCss(cssList, el2)) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function makeUpCss(conf) { | ||||||
|  |   const cssList = [] | ||||||
|  |   conf.fields.forEach(el => addCss(cssList, el)) | ||||||
|  |   return cssList.join('\n') | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								src/components/generator/drawingDefalut.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/components/generator/drawingDefalut.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | export default [ | ||||||
|  |   { | ||||||
|  |     __config__: { | ||||||
|  |       label: '单行文本', | ||||||
|  |       labelWidth: null, | ||||||
|  |       showLabel: true, | ||||||
|  |       changeTag: true, | ||||||
|  |       tag: 'el-input', | ||||||
|  |       tagIcon: 'input', | ||||||
|  |       defaultValue: undefined, | ||||||
|  |       required: true, | ||||||
|  |       layout: 'colFormItem', | ||||||
|  |       span: 24, | ||||||
|  |       document: 'https://element.eleme.cn/#/zh-CN/component/input', | ||||||
|  |       // 正则校验规则 | ||||||
|  |       regList: [{ | ||||||
|  |         pattern: '/^1(3|4|5|7|8|9)\\d{9}$/', | ||||||
|  |         message: '手机号格式错误' | ||||||
|  |       }] | ||||||
|  |     }, | ||||||
|  |     // 组件的插槽属性 | ||||||
|  |     __slot__: { | ||||||
|  |       prepend: '', | ||||||
|  |       append: '' | ||||||
|  |     }, | ||||||
|  |     __vModel__: 'mobile', | ||||||
|  |     placeholder: '请输入手机号', | ||||||
|  |     style: { width: '100%' }, | ||||||
|  |     clearable: true, | ||||||
|  |     'prefix-icon': 'el-icon-mobile', | ||||||
|  |     'suffix-icon': '', | ||||||
|  |     maxlength: 11, | ||||||
|  |     'show-word-limit': true, | ||||||
|  |     readonly: false, | ||||||
|  |     disabled: false | ||||||
|  |   } | ||||||
|  | ] | ||||||
							
								
								
									
										399
									
								
								src/components/generator/html.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										399
									
								
								src/components/generator/html.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,399 @@ | |||||||
|  | /* eslint-disable max-len */ | ||||||
|  | import ruleTrigger from './ruleTrigger' | ||||||
|  |  | ||||||
|  | let confGlobal | ||||||
|  | let someSpanIsNot24 | ||||||
|  |  | ||||||
|  | export function dialogWrapper(str) { | ||||||
|  |   return `<el-dialog v-bind="$attrs" v-on="$listeners" @open="onOpen" @close="onClose" title="Dialog Titile"> | ||||||
|  |     ${str} | ||||||
|  |     <div slot="footer"> | ||||||
|  |       <el-button @click="close">取消</el-button> | ||||||
|  |       <el-button type="primary" @click="handelConfirm">确定</el-button> | ||||||
|  |     </div> | ||||||
|  |   </el-dialog>` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function vueTemplate(str) { | ||||||
|  |   return `<template> | ||||||
|  |     <div> | ||||||
|  |       ${str} | ||||||
|  |     </div> | ||||||
|  |   </template>` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function vueScript(str) { | ||||||
|  |   return `<script> | ||||||
|  |     ${str} | ||||||
|  |   </script>` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function cssStyle(cssStr) { | ||||||
|  |   return `<style> | ||||||
|  |     ${cssStr} | ||||||
|  |   </style>` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function buildFormTemplate(scheme, child, type) { | ||||||
|  |   let labelPosition = '' | ||||||
|  |   if (scheme.labelPosition !== 'right') { | ||||||
|  |     labelPosition = `label-position="${scheme.labelPosition}"` | ||||||
|  |   } | ||||||
|  |   const disabled = scheme.disabled ? `:disabled="${scheme.disabled}"` : '' | ||||||
|  |   let str = `<el-form ref="${scheme.formRef}" :model="${scheme.formModel}" :rules="${scheme.formRules}" size="${scheme.size}" ${disabled} label-width="${scheme.labelWidth}px" ${labelPosition}> | ||||||
|  |       ${child} | ||||||
|  |       ${buildFromBtns(scheme, type)} | ||||||
|  |     </el-form>` | ||||||
|  |   if (someSpanIsNot24) { | ||||||
|  |     str = `<el-row :gutter="${scheme.gutter}"> | ||||||
|  |         ${str} | ||||||
|  |       </el-row>` | ||||||
|  |   } | ||||||
|  |   return str | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function buildFromBtns(scheme, type) { | ||||||
|  |   let str = '' | ||||||
|  |   if (scheme.formBtns && type === 'file') { | ||||||
|  |     str = `<el-form-item size="large"> | ||||||
|  |           <el-button type="primary" @click="submitForm">提交</el-button> | ||||||
|  |           <el-button @click="resetForm">重置</el-button> | ||||||
|  |         </el-form-item>` | ||||||
|  |     if (someSpanIsNot24) { | ||||||
|  |       str = `<el-col :span="24"> | ||||||
|  |           ${str} | ||||||
|  |         </el-col>` | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   return str | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // span不为24的用el-col包裹 | ||||||
|  | function colWrapper(scheme, str) { | ||||||
|  |   if (someSpanIsNot24 || scheme.__config__.span !== 24) { | ||||||
|  |     return `<el-col :span="${scheme.__config__.span}"> | ||||||
|  |       ${str} | ||||||
|  |     </el-col>` | ||||||
|  |   } | ||||||
|  |   return str | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const layouts = { | ||||||
|  |   colFormItem(scheme) { | ||||||
|  |     const config = scheme.__config__ | ||||||
|  |     let labelWidth = '' | ||||||
|  |     let label = `label="${config.label}"` | ||||||
|  |     if (config.labelWidth && config.labelWidth !== confGlobal.labelWidth) { | ||||||
|  |       labelWidth = `label-width="${config.labelWidth}px"` | ||||||
|  |     } | ||||||
|  |     if (config.showLabel === false) { | ||||||
|  |       labelWidth = 'label-width="0"' | ||||||
|  |       label = '' | ||||||
|  |     } | ||||||
|  |     const required = !ruleTrigger[config.tag] && config.required ? 'required' : '' | ||||||
|  |     const tagDom = tags[config.tag] ? tags[config.tag](scheme) : null | ||||||
|  |     let str = `<el-form-item ${labelWidth} ${label} prop="${scheme.__vModel__}" ${required}> | ||||||
|  |         ${tagDom} | ||||||
|  |       </el-form-item>` | ||||||
|  |     str = colWrapper(scheme, str) | ||||||
|  |     return str | ||||||
|  |   }, | ||||||
|  |   rowFormItem(scheme) { | ||||||
|  |     const config = scheme.__config__ | ||||||
|  |     const type = scheme.type === 'default' ? '' : `type="${scheme.type}"` | ||||||
|  |     const justify = scheme.type === 'default' ? '' : `justify="${scheme.justify}"` | ||||||
|  |     const align = scheme.type === 'default' ? '' : `align="${scheme.align}"` | ||||||
|  |     const gutter = scheme.gutter ? `:gutter="${scheme.gutter}"` : '' | ||||||
|  |     const children = config.children.map(el => layouts[el.__config__.layout](el)) | ||||||
|  |     let str = `<el-row ${type} ${justify} ${align} ${gutter}> | ||||||
|  |       ${children.join('\n')} | ||||||
|  |     </el-row>` | ||||||
|  |     str = colWrapper(scheme, str) | ||||||
|  |     return str | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const tags = { | ||||||
|  |   'el-button': el => { | ||||||
|  |     const { | ||||||
|  |       tag, disabled | ||||||
|  |     } = attrBuilder(el) | ||||||
|  |     const type = el.type ? `type="${el.type}"` : '' | ||||||
|  |     const icon = el.icon ? `icon="${el.icon}"` : '' | ||||||
|  |     const round = el.round ? 'round' : '' | ||||||
|  |     const size = el.size ? `size="${el.size}"` : '' | ||||||
|  |     const plain = el.plain ? 'plain' : '' | ||||||
|  |     const circle = el.circle ? 'circle' : '' | ||||||
|  |     let child = buildElButtonChild(el) | ||||||
|  |  | ||||||
|  |     if (child) child = `\n${child}\n` // 换行 | ||||||
|  |     return `<${tag} ${type} ${icon} ${round} ${size} ${plain} ${disabled} ${circle}>${child}</${tag}>` | ||||||
|  |   }, | ||||||
|  |   'el-input': el => { | ||||||
|  |     const { | ||||||
|  |       tag, disabled, vModel, clearable, placeholder, width | ||||||
|  |     } = attrBuilder(el) | ||||||
|  |     const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : '' | ||||||
|  |     const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : '' | ||||||
|  |     const readonly = el.readonly ? 'readonly' : '' | ||||||
|  |     const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : '' | ||||||
|  |     const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : '' | ||||||
|  |     const showPassword = el['show-password'] ? 'show-password' : '' | ||||||
|  |     const type = el.type ? `type="${el.type}"` : '' | ||||||
|  |     const autosize = el.autosize && el.autosize.minRows | ||||||
|  |       ? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"` | ||||||
|  |       : '' | ||||||
|  |     let child = buildElInputChild(el) | ||||||
|  |  | ||||||
|  |     if (child) child = `\n${child}\n` // 换行 | ||||||
|  |     return `<${tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}</${tag}>` | ||||||
|  |   }, | ||||||
|  |   'el-input-number': el => { | ||||||
|  |     const { | ||||||
|  |       tag, disabled, vModel, placeholder | ||||||
|  |     } = attrBuilder(el) | ||||||
|  |     const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : '' | ||||||
|  |     const min = el.min ? `:min='${el.min}'` : '' | ||||||
|  |     const max = el.max ? `:max='${el.max}'` : '' | ||||||
|  |     const step = el.step ? `:step='${el.step}'` : '' | ||||||
|  |     const stepStrictly = el['step-strictly'] ? 'step-strictly' : '' | ||||||
|  |     const precision = el.precision ? `:precision='${el.precision}'` : '' | ||||||
|  |  | ||||||
|  |     return `<${tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}></${tag}>` | ||||||
|  |   }, | ||||||
|  |   'el-select': el => { | ||||||
|  |     const { | ||||||
|  |       tag, disabled, vModel, clearable, placeholder, width | ||||||
|  |     } = attrBuilder(el) | ||||||
|  |     const filterable = el.filterable ? 'filterable' : '' | ||||||
|  |     const multiple = el.multiple ? 'multiple' : '' | ||||||
|  |     let child = buildElSelectChild(el) | ||||||
|  |  | ||||||
|  |     if (child) child = `\n${child}\n` // 换行 | ||||||
|  |     return `<${tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}</${tag}>` | ||||||
|  |   }, | ||||||
|  |   'el-radio-group': el => { | ||||||
|  |     const { tag, disabled, vModel } = attrBuilder(el) | ||||||
|  |     const size = `size="${el.size}"` | ||||||
|  |     let child = buildElRadioGroupChild(el) | ||||||
|  |  | ||||||
|  |     if (child) child = `\n${child}\n` // 换行 | ||||||
|  |     return `<${tag} ${vModel} ${size} ${disabled}>${child}</${tag}>` | ||||||
|  |   }, | ||||||
|  |   'el-checkbox-group': el => { | ||||||
|  |     const { tag, disabled, vModel } = attrBuilder(el) | ||||||
|  |     const size = `size="${el.size}"` | ||||||
|  |     const min = el.min ? `:min="${el.min}"` : '' | ||||||
|  |     const max = el.max ? `:max="${el.max}"` : '' | ||||||
|  |     let child = buildElCheckboxGroupChild(el) | ||||||
|  |  | ||||||
|  |     if (child) child = `\n${child}\n` // 换行 | ||||||
|  |     return `<${tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}</${tag}>` | ||||||
|  |   }, | ||||||
|  |   'el-switch': el => { | ||||||
|  |     const { tag, disabled, vModel } = attrBuilder(el) | ||||||
|  |     const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : '' | ||||||
|  |     const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : '' | ||||||
|  |     const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : '' | ||||||
|  |     const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : '' | ||||||
|  |     const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : '' | ||||||
|  |     const inactiveValue = el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : '' | ||||||
|  |  | ||||||
|  |     return `<${tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}></${tag}>` | ||||||
|  |   }, | ||||||
|  |   'el-cascader': el => { | ||||||
|  |     const { | ||||||
|  |       tag, disabled, vModel, clearable, placeholder, width | ||||||
|  |     } = attrBuilder(el) | ||||||
|  |     const options = el.options ? `:options="${el.__vModel__}Options"` : '' | ||||||
|  |     const props = el.props ? `:props="${el.__vModel__}Props"` : '' | ||||||
|  |     const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"' | ||||||
|  |     const filterable = el.filterable ? 'filterable' : '' | ||||||
|  |     const separator = el.separator === '/' ? '' : `separator="${el.separator}"` | ||||||
|  |  | ||||||
|  |     return `<${tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}></${tag}>` | ||||||
|  |   }, | ||||||
|  |   'el-slider': el => { | ||||||
|  |     const { tag, disabled, vModel } = attrBuilder(el) | ||||||
|  |     const min = el.min ? `:min='${el.min}'` : '' | ||||||
|  |     const max = el.max ? `:max='${el.max}'` : '' | ||||||
|  |     const step = el.step ? `:step='${el.step}'` : '' | ||||||
|  |     const range = el.range ? 'range' : '' | ||||||
|  |     const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : '' | ||||||
|  |  | ||||||
|  |     return `<${tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}></${tag}>` | ||||||
|  |   }, | ||||||
|  |   'el-time-picker': el => { | ||||||
|  |     const { | ||||||
|  |       tag, disabled, vModel, clearable, placeholder, width | ||||||
|  |     } = attrBuilder(el) | ||||||
|  |     const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' | ||||||
|  |     const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' | ||||||
|  |     const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' | ||||||
|  |     const isRange = el['is-range'] ? 'is-range' : '' | ||||||
|  |     const format = el.format ? `format="${el.format}"` : '' | ||||||
|  |     const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' | ||||||
|  |     const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : '' | ||||||
|  |  | ||||||
|  |     return `<${tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}></${tag}>` | ||||||
|  |   }, | ||||||
|  |   'el-date-picker': el => { | ||||||
|  |     const { | ||||||
|  |       tag, disabled, vModel, clearable, placeholder, width | ||||||
|  |     } = attrBuilder(el) | ||||||
|  |     const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' | ||||||
|  |     const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' | ||||||
|  |     const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' | ||||||
|  |     const format = el.format ? `format="${el.format}"` : '' | ||||||
|  |     const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' | ||||||
|  |     const type = el.type === 'date' ? '' : `type="${el.type}"` | ||||||
|  |     const readonly = el.readonly ? 'readonly' : '' | ||||||
|  |  | ||||||
|  |     return `<${tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}></${tag}>` | ||||||
|  |   }, | ||||||
|  |   'el-rate': el => { | ||||||
|  |     const { tag, disabled, vModel } = attrBuilder(el) | ||||||
|  |     const max = el.max ? `:max='${el.max}'` : '' | ||||||
|  |     const allowHalf = el['allow-half'] ? 'allow-half' : '' | ||||||
|  |     const showText = el['show-text'] ? 'show-text' : '' | ||||||
|  |     const showScore = el['show-score'] ? 'show-score' : '' | ||||||
|  |  | ||||||
|  |     return `<${tag} ${vModel} ${max} ${allowHalf} ${showText} ${showScore} ${disabled}></${tag}>` | ||||||
|  |   }, | ||||||
|  |   'el-color-picker': el => { | ||||||
|  |     const { tag, disabled, vModel } = attrBuilder(el) | ||||||
|  |     const size = `size="${el.size}"` | ||||||
|  |     const showAlpha = el['show-alpha'] ? 'show-alpha' : '' | ||||||
|  |     const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : '' | ||||||
|  |  | ||||||
|  |     return `<${tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}></${tag}>` | ||||||
|  |   }, | ||||||
|  |   'el-upload': el => { | ||||||
|  |     const { tag } = el.__config__ | ||||||
|  |     const disabled = el.disabled ? ':disabled=\'true\'' : '' | ||||||
|  |     const action = el.action ? `:action="${el.__vModel__}Action"` : '' | ||||||
|  |     const multiple = el.multiple ? 'multiple' : '' | ||||||
|  |     const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : '' | ||||||
|  |     const accept = el.accept ? `accept="${el.accept}"` : '' | ||||||
|  |     const name = el.name !== 'file' ? `name="${el.name}"` : '' | ||||||
|  |     const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : '' | ||||||
|  |     const beforeUpload = `:before-upload="${el.__vModel__}BeforeUpload"` | ||||||
|  |     const fileList = `:file-list="${el.__vModel__}fileList"` | ||||||
|  |     const ref = `ref="${el.__vModel__}"` | ||||||
|  |     let child = buildElUploadChild(el) | ||||||
|  |  | ||||||
|  |     if (child) child = `\n${child}\n` // 换行 | ||||||
|  |     return `<${tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}</${tag}>` | ||||||
|  |   }, | ||||||
|  |   tinymce: el => { | ||||||
|  |     const { tag, vModel, placeholder } = attrBuilder(el) | ||||||
|  |     const height = el.height ? `:height="${el.height}"` : '' | ||||||
|  |     const branding = el.branding ? `:branding="${el.branding}"` : '' | ||||||
|  |     return `<${tag} ${vModel} ${placeholder} ${height} ${branding}></${tag}>` | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function attrBuilder(el) { | ||||||
|  |   return { | ||||||
|  |     tag: el.__config__.tag, | ||||||
|  |     vModel: `v-model="${confGlobal.formModel}.${el.__vModel__}"`, | ||||||
|  |     clearable: el.clearable ? 'clearable' : '', | ||||||
|  |     placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '', | ||||||
|  |     width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '', | ||||||
|  |     disabled: el.disabled ? ':disabled=\'true\'' : '' | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // el-buttin 子级 | ||||||
|  | function buildElButtonChild(scheme) { | ||||||
|  |   const children = [] | ||||||
|  |   const slot = scheme.__slot__ || {} | ||||||
|  |   if (slot.default) { | ||||||
|  |     children.push(slot.default) | ||||||
|  |   } | ||||||
|  |   return children.join('\n') | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // el-input 子级 | ||||||
|  | function buildElInputChild(scheme) { | ||||||
|  |   const children = [] | ||||||
|  |   const slot = scheme.__slot__ | ||||||
|  |   if (slot && slot.prepend) { | ||||||
|  |     children.push(`<template slot="prepend">${slot.prepend}</template>`) | ||||||
|  |   } | ||||||
|  |   if (slot && slot.append) { | ||||||
|  |     children.push(`<template slot="append">${slot.append}</template>`) | ||||||
|  |   } | ||||||
|  |   return children.join('\n') | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // el-select 子级 | ||||||
|  | function buildElSelectChild(scheme) { | ||||||
|  |   const children = [] | ||||||
|  |   const slot = scheme.__slot__ | ||||||
|  |   if (slot && slot.options && slot.options.length) { | ||||||
|  |     children.push(`<el-option v-for="(item, index) in ${scheme.__vModel__}Options" :key="index" :label="item.label" :value="item.value" :disabled="item.disabled"></el-option>`) | ||||||
|  |   } | ||||||
|  |   return children.join('\n') | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // el-radio-group 子级 | ||||||
|  | function buildElRadioGroupChild(scheme) { | ||||||
|  |   const children = [] | ||||||
|  |   const slot = scheme.__slot__ | ||||||
|  |   const config = scheme.__config__ | ||||||
|  |   if (slot && slot.options && slot.options.length) { | ||||||
|  |     const tag = config.optionType === 'button' ? 'el-radio-button' : 'el-radio' | ||||||
|  |     const border = config.border ? 'border' : '' | ||||||
|  |     children.push(`<${tag} v-for="(item, index) in ${scheme.__vModel__}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}</${tag}>`) | ||||||
|  |   } | ||||||
|  |   return children.join('\n') | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // el-checkbox-group 子级 | ||||||
|  | function buildElCheckboxGroupChild(scheme) { | ||||||
|  |   const children = [] | ||||||
|  |   const slot = scheme.__slot__ | ||||||
|  |   const config = scheme.__config__ | ||||||
|  |   if (slot && slot.options && slot.options.length) { | ||||||
|  |     const tag = config.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox' | ||||||
|  |     const border = config.border ? 'border' : '' | ||||||
|  |     children.push(`<${tag} v-for="(item, index) in ${scheme.__vModel__}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}</${tag}>`) | ||||||
|  |   } | ||||||
|  |   return children.join('\n') | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // el-upload 子级 | ||||||
|  | function buildElUploadChild(scheme) { | ||||||
|  |   const list = [] | ||||||
|  |   const config = scheme.__config__ | ||||||
|  |   if (scheme['list-type'] === 'picture-card') list.push('<i class="el-icon-plus"></i>') | ||||||
|  |   else list.push(`<el-button size="small" type="primary" icon="el-icon-upload">${config.buttonText}</el-button>`) | ||||||
|  |   if (config.showTip) list.push(`<div slot="tip" class="el-upload__tip">只能上传不超过 ${config.fileSize}${config.sizeUnit} 的${scheme.accept}文件</div>`) | ||||||
|  |   return list.join('\n') | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 组装html代码。【入口函数】 | ||||||
|  |  * @param {Object} formConfig 整个表单配置 | ||||||
|  |  * @param {String} type 生成类型,文件或弹窗等 | ||||||
|  |  */ | ||||||
|  | export function makeUpHtml(formConfig, type) { | ||||||
|  |   const htmlList = [] | ||||||
|  |   confGlobal = formConfig | ||||||
|  |   // 判断布局是否都沾满了24个栅格,以备后续简化代码结构 | ||||||
|  |   someSpanIsNot24 = formConfig.fields.some(item => item.__config__.span !== 24) | ||||||
|  |   // 遍历渲染每个组件成html | ||||||
|  |   formConfig.fields.forEach(el => { | ||||||
|  |     htmlList.push(layouts[el.__config__.layout](el)) | ||||||
|  |   }) | ||||||
|  |   const htmlStr = htmlList.join('\n') | ||||||
|  |   // 将组件代码放进form标签 | ||||||
|  |   let temp = buildFormTemplate(formConfig, htmlStr, type) | ||||||
|  |   // dialog标签包裹代码 | ||||||
|  |   if (type === 'dialog') { | ||||||
|  |     temp = dialogWrapper(temp) | ||||||
|  |   } | ||||||
|  |   confGlobal = null | ||||||
|  |   return temp | ||||||
|  | } | ||||||
							
								
								
									
										271
									
								
								src/components/generator/js.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										271
									
								
								src/components/generator/js.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,271 @@ | |||||||
|  | import { isArray } from 'util' | ||||||
|  | import { exportDefault, titleCase, deepClone } from '@/utils' | ||||||
|  | import ruleTrigger from './ruleTrigger' | ||||||
|  |  | ||||||
|  | const units = { | ||||||
|  |   KB: '1024', | ||||||
|  |   MB: '1024 / 1024', | ||||||
|  |   GB: '1024 / 1024 / 1024' | ||||||
|  | } | ||||||
|  | let confGlobal | ||||||
|  | const inheritAttrs = { | ||||||
|  |   file: '', | ||||||
|  |   dialog: 'inheritAttrs: false,' | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 组装js 【入口函数】 | ||||||
|  |  * @param {Object} formConfig 整个表单配置 | ||||||
|  |  * @param {String} type 生成类型,文件或弹窗等 | ||||||
|  |  */ | ||||||
|  | export function makeUpJs(formConfig, type) { | ||||||
|  |   confGlobal = formConfig = deepClone(formConfig) | ||||||
|  |   const dataList = [] | ||||||
|  |   const ruleList = [] | ||||||
|  |   const optionsList = [] | ||||||
|  |   const propsList = [] | ||||||
|  |   const methodList = mixinMethod(type) | ||||||
|  |   const uploadVarList = [] | ||||||
|  |   const created = [] | ||||||
|  |  | ||||||
|  |   formConfig.fields.forEach(el => { | ||||||
|  |     buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList, created) | ||||||
|  |   }) | ||||||
|  |  | ||||||
|  |   const script = buildexport( | ||||||
|  |     formConfig, | ||||||
|  |     type, | ||||||
|  |     dataList.join('\n'), | ||||||
|  |     ruleList.join('\n'), | ||||||
|  |     optionsList.join('\n'), | ||||||
|  |     uploadVarList.join('\n'), | ||||||
|  |     propsList.join('\n'), | ||||||
|  |     methodList.join('\n'), | ||||||
|  |     created.join('\n') | ||||||
|  |   ) | ||||||
|  |   confGlobal = null | ||||||
|  |   return script | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 构建组件属性 | ||||||
|  | function buildAttributes(scheme, dataList, ruleList, optionsList, methodList, propsList, uploadVarList, created) { | ||||||
|  |   const config = scheme.__config__ | ||||||
|  |   const slot = scheme.__slot__ | ||||||
|  |   buildData(scheme, dataList) | ||||||
|  |   buildRules(scheme, ruleList) | ||||||
|  |  | ||||||
|  |   // 特殊处理options属性 | ||||||
|  |   if (scheme.options || (slot && slot.options && slot.options.length)) { | ||||||
|  |     buildOptions(scheme, optionsList) | ||||||
|  |     if (config.dataType === 'dynamic') { | ||||||
|  |       const model = `${scheme.__vModel__}Options` | ||||||
|  |       const options = titleCase(model) | ||||||
|  |       const methodName = `get${options}` | ||||||
|  |       buildOptionMethod(methodName, model, methodList, scheme) | ||||||
|  |       callInCreated(methodName, created) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // 处理props | ||||||
|  |   if (scheme.props && scheme.props.props) { | ||||||
|  |     buildProps(scheme, propsList) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // 处理el-upload的action | ||||||
|  |   if (scheme.action && config.tag === 'el-upload') { | ||||||
|  |     uploadVarList.push( | ||||||
|  |       `${scheme.__vModel__}Action: '${scheme.action}', | ||||||
|  |       ${scheme.__vModel__}fileList: [],` | ||||||
|  |     ) | ||||||
|  |     methodList.push(buildBeforeUpload(scheme)) | ||||||
|  |     // 非自动上传时,生成手动上传的函数 | ||||||
|  |     if (!scheme['auto-upload']) { | ||||||
|  |       methodList.push(buildSubmitUpload(scheme)) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // 构建子级组件属性 | ||||||
|  |   if (config.children) { | ||||||
|  |     config.children.forEach(item => { | ||||||
|  |       buildAttributes(item, dataList, ruleList, optionsList, methodList, propsList, uploadVarList, created) | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 在Created调用函数 | ||||||
|  | function callInCreated(methodName, created) { | ||||||
|  |   created.push(`this.${methodName}()`) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 混入处理函数 | ||||||
|  | function mixinMethod(type) { | ||||||
|  |   const list = []; const | ||||||
|  |     minxins = { | ||||||
|  |       file: confGlobal.formBtns ? { | ||||||
|  |         submitForm: `submitForm() { | ||||||
|  |         this.$refs['${confGlobal.formRef}'].validate(valid => { | ||||||
|  |           if(!valid) return | ||||||
|  |           // TODO 提交表单 | ||||||
|  |         }) | ||||||
|  |       },`, | ||||||
|  |         resetForm: `resetForm() { | ||||||
|  |         this.$refs['${confGlobal.formRef}'].resetFields() | ||||||
|  |       },` | ||||||
|  |       } : null, | ||||||
|  |       dialog: { | ||||||
|  |         onOpen: 'onOpen() {},', | ||||||
|  |         onClose: `onClose() { | ||||||
|  |         this.$refs['${confGlobal.formRef}'].resetFields() | ||||||
|  |       },`, | ||||||
|  |         close: `close() { | ||||||
|  |         this.$emit('update:visible', false) | ||||||
|  |       },`, | ||||||
|  |         handelConfirm: `handelConfirm() { | ||||||
|  |         this.$refs['${confGlobal.formRef}'].validate(valid => { | ||||||
|  |           if(!valid) return | ||||||
|  |           this.close() | ||||||
|  |         }) | ||||||
|  |       },` | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   const methods = minxins[type] | ||||||
|  |   if (methods) { | ||||||
|  |     Object.keys(methods).forEach(key => { | ||||||
|  |       list.push(methods[key]) | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   return list | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 构建data | ||||||
|  | function buildData(scheme, dataList) { | ||||||
|  |   const config = scheme.__config__ | ||||||
|  |   if (scheme.__vModel__ === undefined) return | ||||||
|  |   const defaultValue = JSON.stringify(config.defaultValue) | ||||||
|  |   dataList.push(`${scheme.__vModel__}: ${defaultValue},`) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 构建校验规则 | ||||||
|  | function buildRules(scheme, ruleList) { | ||||||
|  |   const config = scheme.__config__ | ||||||
|  |   if (scheme.__vModel__ === undefined) return | ||||||
|  |   const rules = [] | ||||||
|  |   if (ruleTrigger[config.tag]) { | ||||||
|  |     if (config.required) { | ||||||
|  |       const type = isArray(config.defaultValue) ? 'type: \'array\',' : '' | ||||||
|  |       let message = isArray(config.defaultValue) ? `请至少选择一个${config.label}` : scheme.placeholder | ||||||
|  |       if (message === undefined) message = `${config.label}不能为空` | ||||||
|  |       rules.push(`{ required: true, ${type} message: '${message}', trigger: '${ruleTrigger[config.tag]}' }`) | ||||||
|  |     } | ||||||
|  |     if (config.regList && isArray(config.regList)) { | ||||||
|  |       config.regList.forEach(item => { | ||||||
|  |         if (item.pattern) { | ||||||
|  |           rules.push( | ||||||
|  |             `{ pattern: ${eval(item.pattern)}, message: '${item.message}', trigger: '${ruleTrigger[config.tag]}' }` | ||||||
|  |           ) | ||||||
|  |         } | ||||||
|  |       }) | ||||||
|  |     } | ||||||
|  |     ruleList.push(`${scheme.__vModel__}: [${rules.join(',')}],`) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 构建options | ||||||
|  | function buildOptions(scheme, optionsList) { | ||||||
|  |   if (scheme.__vModel__ === undefined) return | ||||||
|  |   // el-cascader直接有options属性,其他组件都是定义在slot中,所以有两处判断 | ||||||
|  |   let { options } = scheme | ||||||
|  |   if (!options) options = scheme.__slot__.options | ||||||
|  |   if (scheme.__config__.dataType === 'dynamic') { options = [] } | ||||||
|  |   const str = `${scheme.__vModel__}Options: ${JSON.stringify(options)},` | ||||||
|  |   optionsList.push(str) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function buildProps(scheme, propsList) { | ||||||
|  |   const str = `${scheme.__vModel__}Props: ${JSON.stringify(scheme.props.props)},` | ||||||
|  |   propsList.push(str) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // el-upload的BeforeUpload | ||||||
|  | function buildBeforeUpload(scheme) { | ||||||
|  |   const config = scheme.__config__ | ||||||
|  |   const unitNum = units[config.sizeUnit]; let rightSizeCode = ''; let acceptCode = ''; const | ||||||
|  |     returnList = [] | ||||||
|  |   if (config.fileSize) { | ||||||
|  |     rightSizeCode = `let isRightSize = file.size / ${unitNum} < ${config.fileSize} | ||||||
|  |     if(!isRightSize){ | ||||||
|  |       this.$message.error('文件大小超过 ${config.fileSize}${config.sizeUnit}') | ||||||
|  |     }` | ||||||
|  |     returnList.push('isRightSize') | ||||||
|  |   } | ||||||
|  |   if (scheme.accept) { | ||||||
|  |     acceptCode = `let isAccept = new RegExp('${scheme.accept}').test(file.type) | ||||||
|  |     if(!isAccept){ | ||||||
|  |       this.$message.error('应该选择${scheme.accept}类型的文件') | ||||||
|  |     }` | ||||||
|  |     returnList.push('isAccept') | ||||||
|  |   } | ||||||
|  |   const str = `${scheme.__vModel__}BeforeUpload(file) { | ||||||
|  |     ${rightSizeCode} | ||||||
|  |     ${acceptCode} | ||||||
|  |     return ${returnList.join('&&')} | ||||||
|  |   },` | ||||||
|  |   return returnList.length ? str : '' | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // el-upload的submit | ||||||
|  | function buildSubmitUpload(scheme) { | ||||||
|  |   const str = `submitUpload() { | ||||||
|  |     this.$refs['${scheme.__vModel__}'].submit() | ||||||
|  |   },` | ||||||
|  |   return str | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function buildOptionMethod(methodName, model, methodList, scheme) { | ||||||
|  |   const config = scheme.__config__ | ||||||
|  |   const str = `${methodName}() { | ||||||
|  |     // 注意:this.$axios是通过Vue.prototype.$axios = axios挂载产生的 | ||||||
|  |     this.$axios({ | ||||||
|  |       method: '${config.method}', | ||||||
|  |       url: '${config.url}' | ||||||
|  |     }).then(resp => { | ||||||
|  |       var { data } = resp | ||||||
|  |       this.${model} = data.${config.dataPath} | ||||||
|  |     }) | ||||||
|  |   },` | ||||||
|  |   methodList.push(str) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // js整体拼接 | ||||||
|  | function buildexport(conf, type, data, rules, selectOptions, uploadVar, props, methods, created) { | ||||||
|  |   const str = `${exportDefault}{ | ||||||
|  |   ${inheritAttrs[type]} | ||||||
|  |   components: {}, | ||||||
|  |   props: [], | ||||||
|  |   data () { | ||||||
|  |     return { | ||||||
|  |       ${conf.formModel}: { | ||||||
|  |         ${data} | ||||||
|  |       }, | ||||||
|  |       ${conf.formRules}: { | ||||||
|  |         ${rules} | ||||||
|  |       }, | ||||||
|  |       ${uploadVar} | ||||||
|  |       ${selectOptions} | ||||||
|  |       ${props} | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   computed: {}, | ||||||
|  |   watch: {}, | ||||||
|  |   created () { | ||||||
|  |     ${created} | ||||||
|  |   }, | ||||||
|  |   mounted () {}, | ||||||
|  |   methods: { | ||||||
|  |     ${methods} | ||||||
|  |   } | ||||||
|  | }` | ||||||
|  |   return str | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								src/components/generator/ruleTrigger.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/components/generator/ruleTrigger.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | /** | ||||||
|  |  * 用于生成表单校验,指定正则规则的触发方式。 | ||||||
|  |  * 未在此处声明无触发方式的组件将不生成rule!! | ||||||
|  |  */ | ||||||
|  | export default { | ||||||
|  |   'el-input': 'blur', | ||||||
|  |   'el-input-number': 'blur', | ||||||
|  |   'el-select': 'change', | ||||||
|  |   'el-radio-group': 'change', | ||||||
|  |   'el-checkbox-group': 'change', | ||||||
|  |   'el-cascader': 'change', | ||||||
|  |   'el-time-picker': 'change', | ||||||
|  |   'el-date-picker': 'change', | ||||||
|  |   'el-rate': 'change', | ||||||
|  |   tinymce: 'blur' | ||||||
|  | } | ||||||
							
								
								
									
										3
									
								
								src/components/tinymce/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/components/tinymce/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | ## 简介 | ||||||
|  | 富文本编辑器tinymce的一个vue版本封装。使用cdn动态脚本引入的方式加载。 | ||||||
|  |  | ||||||
							
								
								
									
										8
									
								
								src/components/tinymce/config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/components/tinymce/config.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | /* eslint-disable max-len */ | ||||||
|  |  | ||||||
|  | export const plugins = [ | ||||||
|  |   'advlist anchor autolink autosave code codesample directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textpattern visualblocks visualchars wordcount' | ||||||
|  | ] | ||||||
|  | export const toolbar = [ | ||||||
|  |   'code searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote removeformat subscript superscript codesample hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen' | ||||||
|  | ] | ||||||
							
								
								
									
										38
									
								
								src/components/tinymce/example/Index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/components/tinymce/example/Index.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | <template> | ||||||
|  |   <div> | ||||||
|  |     <Tinymce v-model="defaultValue" :height="300" placeholder="在这里输入文字" /> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | import Tinymce from '../index.vue' | ||||||
|  |  | ||||||
|  | export default { | ||||||
|  |   components: { | ||||||
|  |     Tinymce | ||||||
|  |   }, | ||||||
|  |   props: { | ||||||
|  |  | ||||||
|  |   }, | ||||||
|  |   data() { | ||||||
|  |     return { | ||||||
|  |       defaultValue: '<p>配置文档参阅:http://tinymce.ax-z.cn</p>' | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   computed: { | ||||||
|  |  | ||||||
|  |   }, | ||||||
|  |   watch: { | ||||||
|  |  | ||||||
|  |   }, | ||||||
|  |   created() { | ||||||
|  |  | ||||||
|  |   }, | ||||||
|  |   mounted() { | ||||||
|  |  | ||||||
|  |   }, | ||||||
|  |   methods: { | ||||||
|  |  | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </script> | ||||||
							
								
								
									
										3
									
								
								src/components/tinymce/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/components/tinymce/index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | import Index from './index.vue' | ||||||
|  |  | ||||||
|  | export default Index | ||||||
							
								
								
									
										88
									
								
								src/components/tinymce/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								src/components/tinymce/index.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | |||||||
|  | <template> | ||||||
|  |   <textarea :id="tinymceId" style="visibility: hidden" /> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | import loadTinymce from '@/utils/loadTinymce' | ||||||
|  | import { plugins, toolbar } from './config' | ||||||
|  | import { debounce } from 'throttle-debounce' | ||||||
|  |  | ||||||
|  | let num = 1 | ||||||
|  |  | ||||||
|  | export default { | ||||||
|  |   props: { | ||||||
|  |     id: { | ||||||
|  |       type: String, | ||||||
|  |       default: () => { | ||||||
|  |         num === 10000 && (num = 1) | ||||||
|  |         return `tinymce${+new Date()}${num++}` | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     value: { | ||||||
|  |       default: '' | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   data() { | ||||||
|  |     return { | ||||||
|  |       tinymceId: this.id | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   mounted() { | ||||||
|  |     loadTinymce(tinymce => { | ||||||
|  |       // eslint-disable-next-line global-require | ||||||
|  |       require('./zh_CN') | ||||||
|  |       let conf = { | ||||||
|  |         selector: `#${this.tinymceId}`, | ||||||
|  |         language: 'zh_CN', | ||||||
|  |         menubar: 'file edit insert view format table', | ||||||
|  |         plugins, | ||||||
|  |         toolbar, | ||||||
|  |         height: 300, | ||||||
|  |         branding: false, | ||||||
|  |         object_resizing: false, | ||||||
|  |         end_container_on_empty_block: true, | ||||||
|  |         powerpaste_word_import: 'clean', | ||||||
|  |         code_dialog_height: 450, | ||||||
|  |         code_dialog_width: 1000, | ||||||
|  |         advlist_bullet_styles: 'square', | ||||||
|  |         advlist_number_styles: 'default', | ||||||
|  |         default_link_target: '_blank', | ||||||
|  |         link_title: false, | ||||||
|  |         nonbreaking_force_tab: true | ||||||
|  |       } | ||||||
|  |       conf = Object.assign(conf, this.$attrs) | ||||||
|  |       conf.init_instance_callback = editor => { | ||||||
|  |         if (this.value) editor.setContent(this.value) | ||||||
|  |         this.vModel(editor) | ||||||
|  |       } | ||||||
|  |       tinymce.init(conf) | ||||||
|  |     }) | ||||||
|  |   }, | ||||||
|  |   destroyed() { | ||||||
|  |     this.destroyTinymce() | ||||||
|  |   }, | ||||||
|  |   methods: { | ||||||
|  |     vModel(editor) { | ||||||
|  |       // 控制连续写入时setContent的触发频率 | ||||||
|  |       const debounceSetContent = debounce(250, editor.setContent) | ||||||
|  |       this.$watch('value', (val, prevVal) => { | ||||||
|  |         if (editor && val !== prevVal && val !== editor.getContent()) { | ||||||
|  |           if (typeof val !== 'string') val = val.toString() | ||||||
|  |           debounceSetContent.call(editor, val) | ||||||
|  |         } | ||||||
|  |       }) | ||||||
|  |  | ||||||
|  |       editor.on('change keyup undo redo', () => { | ||||||
|  |         this.$emit('input', editor.getContent()) | ||||||
|  |       }) | ||||||
|  |     }, | ||||||
|  |     destroyTinymce() { | ||||||
|  |       if (!window.tinymce) return | ||||||
|  |       const tinymce = window.tinymce.get(this.tinymceId) | ||||||
|  |       if (tinymce) { | ||||||
|  |         tinymce.destroy() | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </script> | ||||||
							
								
								
									
										28
									
								
								src/components/tinymce/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/components/tinymce/package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | { | ||||||
|  |   "name": "form-gen-tinymce", | ||||||
|  |   "version": "1.0.0", | ||||||
|  |   "description": "富文本编辑器tinymce的一个vue版本封装。使用cdn动态脚本引入的方式加载。", | ||||||
|  |   "main": "lib/form-gen-tinymce.umd.js", | ||||||
|  |   "directories": { | ||||||
|  |     "example": "example" | ||||||
|  |   }, | ||||||
|  |   "scripts": { | ||||||
|  |     "test": "echo \"Error: no test specified\" && exit 1" | ||||||
|  |   }, | ||||||
|  |   "repository": { | ||||||
|  |     "type": "git", | ||||||
|  |     "url": "git+https://github.com/JakHuang/form-generator.git" | ||||||
|  |   }, | ||||||
|  |   "keywords": [ | ||||||
|  |     "tinymce-vue" | ||||||
|  |   ], | ||||||
|  |   "dependencies": { | ||||||
|  |     "throttle-debounce": "^2.1.0" | ||||||
|  |   }, | ||||||
|  |   "author": "jakHuang", | ||||||
|  |   "license": "MIT", | ||||||
|  |   "bugs": { | ||||||
|  |     "url": "https://github.com/JakHuang/form-generator/issues" | ||||||
|  |   }, | ||||||
|  |   "homepage": "https://github.com/JakHuang/form-generator/blob/dev/src/components/tinymce" | ||||||
|  | } | ||||||
							
								
								
									
										420
									
								
								src/components/tinymce/zh_CN.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										420
									
								
								src/components/tinymce/zh_CN.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,420 @@ | |||||||
|  | /* eslint-disable */ | ||||||
|  | tinymce.addI18n('zh_CN',{ | ||||||
|  | "Redo": "\u91cd\u505a", | ||||||
|  | "Undo": "\u64a4\u9500", | ||||||
|  | "Cut": "\u526a\u5207", | ||||||
|  | "Copy": "\u590d\u5236", | ||||||
|  | "Paste": "\u7c98\u8d34", | ||||||
|  | "Select all": "\u5168\u9009", | ||||||
|  | "New document": "\u65b0\u6587\u4ef6", | ||||||
|  | "Ok": "\u786e\u5b9a", | ||||||
|  | "Cancel": "\u53d6\u6d88", | ||||||
|  | "Visual aids": "\u7f51\u683c\u7ebf", | ||||||
|  | "Bold": "\u7c97\u4f53", | ||||||
|  | "Italic": "\u659c\u4f53", | ||||||
|  | "Underline": "\u4e0b\u5212\u7ebf", | ||||||
|  | "Strikethrough": "\u5220\u9664\u7ebf", | ||||||
|  | "Superscript": "\u4e0a\u6807", | ||||||
|  | "Subscript": "\u4e0b\u6807", | ||||||
|  | "Clear formatting": "\u6e05\u9664\u683c\u5f0f", | ||||||
|  | "Align left": "\u5de6\u8fb9\u5bf9\u9f50", | ||||||
|  | "Align center": "\u4e2d\u95f4\u5bf9\u9f50", | ||||||
|  | "Align right": "\u53f3\u8fb9\u5bf9\u9f50", | ||||||
|  | "Justify": "\u4e24\u7aef\u5bf9\u9f50", | ||||||
|  | "Bullet list": "\u9879\u76ee\u7b26\u53f7", | ||||||
|  | "Numbered list": "\u7f16\u53f7\u5217\u8868", | ||||||
|  | "Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", | ||||||
|  | "Increase indent": "\u589e\u52a0\u7f29\u8fdb", | ||||||
|  | "Close": "\u5173\u95ed", | ||||||
|  | "Formats": "\u683c\u5f0f", | ||||||
|  | "Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002", | ||||||
|  | "Headers": "\u6807\u9898", | ||||||
|  | "Header 1": "\u6807\u98981", | ||||||
|  | "Header 2": "\u6807\u98982", | ||||||
|  | "Header 3": "\u6807\u98983", | ||||||
|  | "Header 4": "\u6807\u98984", | ||||||
|  | "Header 5": "\u6807\u98985", | ||||||
|  | "Header 6": "\u6807\u98986", | ||||||
|  | "Headings": "\u6807\u9898", | ||||||
|  | "Heading 1": "\u6807\u98981", | ||||||
|  | "Heading 2": "\u6807\u98982", | ||||||
|  | "Heading 3": "\u6807\u98983", | ||||||
|  | "Heading 4": "\u6807\u98984", | ||||||
|  | "Heading 5": "\u6807\u98985", | ||||||
|  | "Heading 6": "\u6807\u98986", | ||||||
|  | "Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684", | ||||||
|  | "Div": "Div", | ||||||
|  | "Pre": "Pre", | ||||||
|  | "Code": "\u4ee3\u7801", | ||||||
|  | "Paragraph": "\u6bb5\u843d", | ||||||
|  | "Blockquote": "\u5f15\u6587\u533a\u5757", | ||||||
|  | "Inline": "\u6587\u672c", | ||||||
|  | "Blocks": "\u57fa\u5757", | ||||||
|  | "Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", | ||||||
|  | "Fonts": "\u5b57\u4f53", | ||||||
|  | "Font Sizes": "\u5b57\u53f7", | ||||||
|  | "Class": "\u7c7b\u578b", | ||||||
|  | "Browse for an image": "\u6d4f\u89c8\u56fe\u50cf", | ||||||
|  | "OR": "\u6216", | ||||||
|  | "Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64", | ||||||
|  | "Upload": "\u4e0a\u4f20", | ||||||
|  | "Block": "\u5757", | ||||||
|  | "Align": "\u5bf9\u9f50", | ||||||
|  | "Default": "\u9ed8\u8ba4", | ||||||
|  | "Circle": "\u7a7a\u5fc3\u5706", | ||||||
|  | "Disc": "\u5b9e\u5fc3\u5706", | ||||||
|  | "Square": "\u65b9\u5757", | ||||||
|  | "Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", | ||||||
|  | "Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", | ||||||
|  | "Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", | ||||||
|  | "Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", | ||||||
|  | "Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", | ||||||
|  | "Anchor...": "\u951a\u70b9...", | ||||||
|  | "Name": "\u540d\u79f0", | ||||||
|  | "Id": "\u6807\u8bc6\u7b26", | ||||||
|  | "Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", | ||||||
|  | "You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", | ||||||
|  | "Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", | ||||||
|  | "Special character...": "\u7279\u6b8a\u5b57\u7b26...", | ||||||
|  | "Source code": "\u6e90\u4ee3\u7801", | ||||||
|  | "Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", | ||||||
|  | "Language": "\u8bed\u8a00", | ||||||
|  | "Code sample...": "\u793a\u4f8b\u4ee3\u7801...", | ||||||
|  | "Color Picker": "\u9009\u8272\u5668", | ||||||
|  | "R": "R", | ||||||
|  | "G": "G", | ||||||
|  | "B": "B", | ||||||
|  | "Left to right": "\u4ece\u5de6\u5230\u53f3", | ||||||
|  | "Right to left": "\u4ece\u53f3\u5230\u5de6", | ||||||
|  | "Emoticons...": "\u8868\u60c5\u7b26\u53f7...", | ||||||
|  | "Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027", | ||||||
|  | "Title": "\u6807\u9898", | ||||||
|  | "Keywords": "\u5173\u952e\u8bcd", | ||||||
|  | "Description": "\u63cf\u8ff0", | ||||||
|  | "Robots": "\u673a\u5668\u4eba", | ||||||
|  | "Author": "\u4f5c\u8005", | ||||||
|  | "Encoding": "\u7f16\u7801", | ||||||
|  | "Fullscreen": "\u5168\u5c4f", | ||||||
|  | "Action": "\u64cd\u4f5c", | ||||||
|  | "Shortcut": "\u5feb\u6377\u952e", | ||||||
|  | "Help": "\u5e2e\u52a9", | ||||||
|  | "Address": "\u5730\u5740", | ||||||
|  | "Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f", | ||||||
|  | "Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f", | ||||||
|  | "Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84", | ||||||
|  | "Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355", | ||||||
|  | "Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", | ||||||
|  | "Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", | ||||||
|  | "Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", | ||||||
|  | "Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):", | ||||||
|  | "Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a", | ||||||
|  | "Learn more...": "\u4e86\u89e3\u66f4\u591a...", | ||||||
|  | "You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}", | ||||||
|  | "Plugins": "\u63d2\u4ef6", | ||||||
|  | "Handy Shortcuts": "\u5feb\u6377\u952e", | ||||||
|  | "Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", | ||||||
|  | "Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", | ||||||
|  | "Image description": "\u56fe\u7247\u63cf\u8ff0", | ||||||
|  | "Source": "\u5730\u5740", | ||||||
|  | "Dimensions": "\u5927\u5c0f", | ||||||
|  | "Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", | ||||||
|  | "General": "\u666e\u901a", | ||||||
|  | "Advanced": "\u9ad8\u7ea7", | ||||||
|  | "Style": "\u6837\u5f0f", | ||||||
|  | "Vertical space": "\u5782\u76f4\u8fb9\u8ddd", | ||||||
|  | "Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", | ||||||
|  | "Border": "\u8fb9\u6846", | ||||||
|  | "Insert image": "\u63d2\u5165\u56fe\u7247", | ||||||
|  | "Image...": "\u56fe\u7247...", | ||||||
|  | "Image list": "\u56fe\u7247\u5217\u8868", | ||||||
|  | "Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", | ||||||
|  | "Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", | ||||||
|  | "Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", | ||||||
|  | "Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", | ||||||
|  | "Edit image": "\u7f16\u8f91\u56fe\u7247", | ||||||
|  | "Image options": "\u56fe\u7247\u9009\u9879", | ||||||
|  | "Zoom in": "\u653e\u5927", | ||||||
|  | "Zoom out": "\u7f29\u5c0f", | ||||||
|  | "Crop": "\u88c1\u526a", | ||||||
|  | "Resize": "\u8c03\u6574\u5927\u5c0f", | ||||||
|  | "Orientation": "\u65b9\u5411", | ||||||
|  | "Brightness": "\u4eae\u5ea6", | ||||||
|  | "Sharpen": "\u9510\u5316", | ||||||
|  | "Contrast": "\u5bf9\u6bd4\u5ea6", | ||||||
|  | "Color levels": "\u989c\u8272\u5c42\u6b21", | ||||||
|  | "Gamma": "\u4f3d\u9a6c\u503c", | ||||||
|  | "Invert": "\u53cd\u8f6c", | ||||||
|  | "Apply": "\u5e94\u7528", | ||||||
|  | "Back": "\u540e\u9000", | ||||||
|  | "Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", | ||||||
|  | "Date\/time": "\u65e5\u671f\/\u65f6\u95f4", | ||||||
|  | "Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", | ||||||
|  | "Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", | ||||||
|  | "Text to display": "\u663e\u793a\u6587\u5b57", | ||||||
|  | "Url": "\u5730\u5740", | ||||||
|  | "Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...", | ||||||
|  | "Current window": "\u5f53\u524d\u7a97\u53e3", | ||||||
|  | "None": "\u65e0", | ||||||
|  | "New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", | ||||||
|  | "Remove link": "\u5220\u9664\u94fe\u63a5", | ||||||
|  | "Anchors": "\u951a\u70b9", | ||||||
|  | "Link...": "\u94fe\u63a5...", | ||||||
|  | "Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", | ||||||
|  | "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", | ||||||
|  | "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", | ||||||
|  | "Link list": "\u94fe\u63a5\u5217\u8868", | ||||||
|  | "Insert video": "\u63d2\u5165\u89c6\u9891", | ||||||
|  | "Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", | ||||||
|  | "Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", | ||||||
|  | "Alternative source": "\u955c\u50cf", | ||||||
|  | "Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740", | ||||||
|  | "Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)", | ||||||
|  | "Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", | ||||||
|  | "Embed": "\u5185\u5d4c", | ||||||
|  | "Media...": "\u591a\u5a92\u4f53...", | ||||||
|  | "Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", | ||||||
|  | "Page break": "\u5206\u9875\u7b26", | ||||||
|  | "Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", | ||||||
|  | "Preview": "\u9884\u89c8", | ||||||
|  | "Print...": "\u6253\u5370...", | ||||||
|  | "Save": "\u4fdd\u5b58", | ||||||
|  | "Find": "\u67e5\u627e", | ||||||
|  | "Replace with": "\u66ff\u6362\u4e3a", | ||||||
|  | "Replace": "\u66ff\u6362", | ||||||
|  | "Replace all": "\u5168\u90e8\u66ff\u6362", | ||||||
|  | "Previous": "\u4e0a\u4e00\u4e2a", | ||||||
|  | "Next": "\u4e0b\u4e00\u4e2a", | ||||||
|  | "Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...", | ||||||
|  | "Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", | ||||||
|  | "Match case": "\u533a\u5206\u5927\u5c0f\u5199", | ||||||
|  | "Find whole words only": "\u5168\u5b57\u5339\u914d", | ||||||
|  | "Spell check": "\u62fc\u5199\u68c0\u67e5", | ||||||
|  | "Ignore": "\u5ffd\u7565", | ||||||
|  | "Ignore all": "\u5168\u90e8\u5ffd\u7565", | ||||||
|  | "Finish": "\u5b8c\u6210", | ||||||
|  | "Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", | ||||||
|  | "Insert table": "\u63d2\u5165\u8868\u683c", | ||||||
|  | "Table properties": "\u8868\u683c\u5c5e\u6027", | ||||||
|  | "Delete table": "\u5220\u9664\u8868\u683c", | ||||||
|  | "Cell": "\u5355\u5143\u683c", | ||||||
|  | "Row": "\u884c", | ||||||
|  | "Column": "\u5217", | ||||||
|  | "Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", | ||||||
|  | "Merge cells": "\u5408\u5e76\u5355\u5143\u683c", | ||||||
|  | "Split cell": "\u62c6\u5206\u5355\u5143\u683c", | ||||||
|  | "Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", | ||||||
|  | "Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", | ||||||
|  | "Delete row": "\u5220\u9664\u884c", | ||||||
|  | "Row properties": "\u884c\u5c5e\u6027", | ||||||
|  | "Cut row": "\u526a\u5207\u884c", | ||||||
|  | "Copy row": "\u590d\u5236\u884c", | ||||||
|  | "Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", | ||||||
|  | "Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", | ||||||
|  | "Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", | ||||||
|  | "Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", | ||||||
|  | "Delete column": "\u5220\u9664\u5217", | ||||||
|  | "Cols": "\u5217", | ||||||
|  | "Rows": "\u884c", | ||||||
|  | "Width": "\u5bbd", | ||||||
|  | "Height": "\u9ad8", | ||||||
|  | "Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", | ||||||
|  | "Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", | ||||||
|  | "Show caption": "\u663e\u793a\u6807\u9898", | ||||||
|  | "Left": "\u5de6\u5bf9\u9f50", | ||||||
|  | "Center": "\u5c45\u4e2d", | ||||||
|  | "Right": "\u53f3\u5bf9\u9f50", | ||||||
|  | "Cell type": "\u5355\u5143\u683c\u7c7b\u578b", | ||||||
|  | "Scope": "\u8303\u56f4", | ||||||
|  | "Alignment": "\u5bf9\u9f50\u65b9\u5f0f", | ||||||
|  | "H Align": "\u6c34\u5e73\u5bf9\u9f50", | ||||||
|  | "V Align": "\u5782\u76f4\u5bf9\u9f50", | ||||||
|  | "Top": "\u9876\u90e8\u5bf9\u9f50", | ||||||
|  | "Middle": "\u5782\u76f4\u5c45\u4e2d", | ||||||
|  | "Bottom": "\u5e95\u90e8\u5bf9\u9f50", | ||||||
|  | "Header cell": "\u8868\u5934\u5355\u5143\u683c", | ||||||
|  | "Row group": "\u884c\u7ec4", | ||||||
|  | "Column group": "\u5217\u7ec4", | ||||||
|  | "Row type": "\u884c\u7c7b\u578b", | ||||||
|  | "Header": "\u8868\u5934", | ||||||
|  | "Body": "\u8868\u4f53", | ||||||
|  | "Footer": "\u8868\u5c3e", | ||||||
|  | "Border color": "\u8fb9\u6846\u989c\u8272", | ||||||
|  | "Insert template...": "\u63d2\u5165\u6a21\u677f...", | ||||||
|  | "Templates": "\u6a21\u677f", | ||||||
|  | "Template": "\u6a21\u677f", | ||||||
|  | "Text color": "\u6587\u5b57\u989c\u8272", | ||||||
|  | "Background color": "\u80cc\u666f\u8272", | ||||||
|  | "Custom...": "\u81ea\u5b9a\u4e49...", | ||||||
|  | "Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", | ||||||
|  | "No color": "\u65e0", | ||||||
|  | "Remove color": "\u79fb\u9664\u989c\u8272", | ||||||
|  | "Table of Contents": "\u5185\u5bb9\u5217\u8868", | ||||||
|  | "Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", | ||||||
|  | "Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", | ||||||
|  | "Word count": "\u5b57\u6570", | ||||||
|  | "Count": "\u8ba1\u6570", | ||||||
|  | "Document": "\u6587\u6863", | ||||||
|  | "Selection": "\u9009\u62e9", | ||||||
|  | "Words": "\u5355\u8bcd", | ||||||
|  | "Words: {0}": "\u5b57\u6570\uff1a{0}", | ||||||
|  | "{0} words": "{0} \u5b57", | ||||||
|  | "File": "\u6587\u4ef6", | ||||||
|  | "Edit": "\u7f16\u8f91", | ||||||
|  | "Insert": "\u63d2\u5165", | ||||||
|  | "View": "\u89c6\u56fe", | ||||||
|  | "Format": "\u683c\u5f0f", | ||||||
|  | "Table": "\u8868\u683c", | ||||||
|  | "Tools": "\u5de5\u5177", | ||||||
|  | "Powered by {0}": "\u7531{0}\u9a71\u52a8", | ||||||
|  | "Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9", | ||||||
|  | "Image title": "\u56fe\u7247\u6807\u9898", | ||||||
|  | "Border width": "\u8fb9\u6846\u5bbd\u5ea6", | ||||||
|  | "Border style": "\u8fb9\u6846\u6837\u5f0f", | ||||||
|  | "Error": "\u9519\u8bef", | ||||||
|  | "Warn": "\u8b66\u544a", | ||||||
|  | "Valid": "\u6709\u6548", | ||||||
|  | "To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846", | ||||||
|  | "Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002", | ||||||
|  | "System Font": "\u7cfb\u7edf\u5b57\u4f53", | ||||||
|  | "Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}", | ||||||
|  | "Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}", | ||||||
|  | "Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}", | ||||||
|  | "Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}", | ||||||
|  | "example": "\u793a\u4f8b", | ||||||
|  | "Search": "\u641c\u7d22", | ||||||
|  | "All": "\u5168\u90e8", | ||||||
|  | "Currency": "\u8d27\u5e01", | ||||||
|  | "Text": "\u6587\u5b57", | ||||||
|  | "Quotations": "\u5f15\u7528", | ||||||
|  | "Mathematical": "\u6570\u5b66", | ||||||
|  | "Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145", | ||||||
|  | "Symbols": "\u7b26\u53f7", | ||||||
|  | "Arrows": "\u7bad\u5934", | ||||||
|  | "User Defined": "\u81ea\u5b9a\u4e49", | ||||||
|  | "dollar sign": "\u7f8e\u5143\u7b26\u53f7", | ||||||
|  | "currency sign": "\u8d27\u5e01\u7b26\u53f7", | ||||||
|  | "euro-currency sign": "\u6b27\u5143\u7b26\u53f7", | ||||||
|  | "colon sign": "\u5192\u53f7", | ||||||
|  | "cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7", | ||||||
|  | "french franc sign": "\u6cd5\u90ce\u7b26\u53f7", | ||||||
|  | "lira sign": "\u91cc\u62c9\u7b26\u53f7", | ||||||
|  | "mill sign": "\u5bc6\u5c14\u7b26\u53f7", | ||||||
|  | "naira sign": "\u5948\u62c9\u7b26\u53f7", | ||||||
|  | "peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7", | ||||||
|  | "rupee sign": "\u5362\u6bd4\u7b26\u53f7", | ||||||
|  | "won sign": "\u97e9\u5143\u7b26\u53f7", | ||||||
|  | "new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7", | ||||||
|  | "dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7", | ||||||
|  | "kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7", | ||||||
|  | "tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7", | ||||||
|  | "drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7", | ||||||
|  | "german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7", | ||||||
|  | "peso sign": "\u6bd4\u7d22\u7b26\u53f7", | ||||||
|  | "guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7", | ||||||
|  | "austral sign": "\u6fb3\u5143\u7b26\u53f7", | ||||||
|  | "hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7", | ||||||
|  | "cedi sign": "\u585e\u5730\u7b26\u53f7", | ||||||
|  | "livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7", | ||||||
|  | "spesmilo sign": "spesmilo\u7b26\u53f7", | ||||||
|  | "tenge sign": "\u575a\u6208\u7b26\u53f7", | ||||||
|  | "indian rupee sign": "\u5370\u5ea6\u5362\u6bd4", | ||||||
|  | "turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9", | ||||||
|  | "nordic mark sign": "\u5317\u6b27\u9a6c\u514b", | ||||||
|  | "manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7", | ||||||
|  | "ruble sign": "\u5362\u5e03\u7b26\u53f7", | ||||||
|  | "yen character": "\u65e5\u5143\u5b57\u6837", | ||||||
|  | "yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837", | ||||||
|  | "yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09", | ||||||
|  | "yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09", | ||||||
|  | "Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...", | ||||||
|  | "Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7", | ||||||
|  | "People": "\u4eba\u7c7b", | ||||||
|  | "Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136", | ||||||
|  | "Food and Drink": "\u98df\u7269\u548c\u996e\u54c1", | ||||||
|  | "Activity": "\u6d3b\u52a8", | ||||||
|  | "Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9", | ||||||
|  | "Objects": "\u7269\u4ef6", | ||||||
|  | "Flags": "\u65d7\u5e1c", | ||||||
|  | "Characters": "\u5b57\u7b26", | ||||||
|  | "Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)", | ||||||
|  | "{0} characters": "{0} \u4e2a\u5b57\u7b26", | ||||||
|  | "Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002", | ||||||
|  | "Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002", | ||||||
|  | "Update": "\u66f4\u65b0", | ||||||
|  | "Color swatch": "\u989c\u8272\u6837\u672c", | ||||||
|  | "Turquoise": "\u9752\u7eff\u8272", | ||||||
|  | "Green": "\u7eff\u8272", | ||||||
|  | "Blue": "\u84dd\u8272", | ||||||
|  | "Purple": "\u7d2b\u8272", | ||||||
|  | "Navy Blue": "\u6d77\u519b\u84dd", | ||||||
|  | "Dark Turquoise": "\u6df1\u84dd\u7eff\u8272", | ||||||
|  | "Dark Green": "\u6df1\u7eff\u8272", | ||||||
|  | "Medium Blue": "\u4e2d\u84dd\u8272", | ||||||
|  | "Medium Purple": "\u4e2d\u7d2b\u8272", | ||||||
|  | "Midnight Blue": "\u6df1\u84dd\u8272", | ||||||
|  | "Yellow": "\u9ec4\u8272", | ||||||
|  | "Orange": "\u6a59\u8272", | ||||||
|  | "Red": "\u7ea2\u8272", | ||||||
|  | "Light Gray": "\u6d45\u7070\u8272", | ||||||
|  | "Gray": "\u7070\u8272", | ||||||
|  | "Dark Yellow": "\u6697\u9ec4\u8272", | ||||||
|  | "Dark Orange": "\u6df1\u6a59\u8272", | ||||||
|  | "Dark Red": "\u6df1\u7ea2\u8272", | ||||||
|  | "Medium Gray": "\u4e2d\u7070\u8272", | ||||||
|  | "Dark Gray": "\u6df1\u7070\u8272", | ||||||
|  | "Light Green": "\u6d45\u7eff\u8272", | ||||||
|  | "Light Yellow": "\u6d45\u9ec4\u8272", | ||||||
|  | "Light Red": "\u6d45\u7ea2\u8272", | ||||||
|  | "Light Purple": "\u6d45\u7d2b\u8272", | ||||||
|  | "Light Blue": "\u6d45\u84dd\u8272", | ||||||
|  | "Dark Purple": "\u6df1\u7d2b\u8272", | ||||||
|  | "Dark Blue": "\u6df1\u84dd\u8272", | ||||||
|  | "Black": "\u9ed1\u8272", | ||||||
|  | "White": "\u767d\u8272", | ||||||
|  | "Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f", | ||||||
|  | "Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846", | ||||||
|  | "history": "\u5386\u53f2", | ||||||
|  | "styles": "\u6837\u5f0f", | ||||||
|  | "formatting": "\u683c\u5f0f\u5316", | ||||||
|  | "alignment": "\u5bf9\u9f50", | ||||||
|  | "indentation": "\u7f29\u8fdb", | ||||||
|  | "permanent pen": "\u8bb0\u53f7\u7b14", | ||||||
|  | "comments": "\u5907\u6ce8", | ||||||
|  | "Format Painter": "\u683c\u5f0f\u5237", | ||||||
|  | "Insert\/edit iframe": "\u63d2\u5165\/\u7f16\u8f91\u6846\u67b6", | ||||||
|  | "Capitalization": "\u5927\u5199", | ||||||
|  | "lowercase": "\u5c0f\u5199", | ||||||
|  | "UPPERCASE": "\u5927\u5199", | ||||||
|  | "Title Case": "\u9996\u5b57\u6bcd\u5927\u5199", | ||||||
|  | "Permanent Pen Properties": "\u6c38\u4e45\u7b14\u5c5e\u6027", | ||||||
|  | "Permanent pen properties...": "\u6c38\u4e45\u7b14\u5c5e\u6027...", | ||||||
|  | "Font": "\u5b57\u4f53", | ||||||
|  | "Size": "\u5b57\u53f7", | ||||||
|  | "More...": "\u66f4\u591a...", | ||||||
|  | "Spellcheck Language": "\u62fc\u5199\u68c0\u67e5\u8bed\u8a00", | ||||||
|  | "Select...": "\u9009\u62e9...", | ||||||
|  | "Preferences": "\u9996\u9009\u9879", | ||||||
|  | "Yes": "\u662f", | ||||||
|  | "No": "\u5426", | ||||||
|  | "Keyboard Navigation": "\u952e\u76d8\u6307\u5f15", | ||||||
|  | "Version": "\u7248\u672c", | ||||||
|  | "Anchor": "\u951a\u70b9", | ||||||
|  | "Special character": "\u7279\u6b8a\u7b26\u53f7", | ||||||
|  | "Code sample": "\u4ee3\u7801\u793a\u4f8b", | ||||||
|  | "Color": "\u989c\u8272", | ||||||
|  | "Emoticons": "\u8868\u60c5", | ||||||
|  | "Document properties": "\u6587\u6863\u5c5e\u6027", | ||||||
|  | "Image": "\u56fe\u7247", | ||||||
|  | "Insert link": "\u63d2\u5165\u94fe\u63a5", | ||||||
|  | "Target": "\u6253\u5f00\u65b9\u5f0f", | ||||||
|  | "Link": "\u94fe\u63a5", | ||||||
|  | "Poster": "\u5c01\u9762", | ||||||
|  | "Media": "\u5a92\u4f53", | ||||||
|  | "Print": "\u6253\u5370", | ||||||
|  | "Prev": "\u4e0a\u4e00\u4e2a", | ||||||
|  | "Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", | ||||||
|  | "Whole words": "\u5168\u5b57\u5339\u914d", | ||||||
|  | "Spellcheck": "\u62fc\u5199\u68c0\u67e5", | ||||||
|  | "Caption": "\u6807\u9898", | ||||||
|  | "Insert template": "\u63d2\u5165\u6a21\u677f" | ||||||
|  | }); | ||||||
| @@ -1,48 +1,14 @@ | |||||||
| <template> | <template> | ||||||
|   <div class="navbar"> |   <div class="navbar"> | ||||||
|     <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> |     <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" | ||||||
|  |       @toggleClick="toggleSideBar" /> | ||||||
|  |  | ||||||
|     <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/> |     <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav" /> | ||||||
|     <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/> |     <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav" /> | ||||||
|  |  | ||||||
|     <div style="padding-top: 5px; padding-right: 38px;"> |     <div style="padding-top: 5px; padding-right: 38px;"> | ||||||
|       <navbar-right :blackTitle='true'/> |       <navbar-right :blackTitle='true' /> | ||||||
|     </div> |     </div> | ||||||
|  |  | ||||||
|     <!-- <div class="right-menu"> --> |  | ||||||
|       <!-- <template v-if="device!=='mobile'"> --> |  | ||||||
|         <!-- <search id="header-search" class="right-menu-item" /> --> |  | ||||||
|  |  | ||||||
|         <!-- 站内信 --> |  | ||||||
|         <!-- <notify-message class="right-menu-item hover-effect" /> --> |  | ||||||
|  |  | ||||||
|         <!-- <screenfull id="screenfull" class="right-menu-item hover-effect" /> --> |  | ||||||
|  |  | ||||||
|         <!-- <el-tooltip content="布局大小" effect="dark" placement="bottom"> |  | ||||||
|           <size-select id="size-select" class="right-menu-item hover-effect" /> |  | ||||||
|         </el-tooltip> --> |  | ||||||
|  |  | ||||||
|       <!-- </template> --> |  | ||||||
|  |  | ||||||
|       <!-- <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click"> |  | ||||||
|         <div class="avatar-wrapper"> --> |  | ||||||
|           <!-- <img :src="avatar" class="user-avatar"> --> |  | ||||||
|           <!-- <span v-if="nickname" class="user-nickname">{{ nickname }}</span> |  | ||||||
|           <i class="el-icon-caret-bottom" /> |  | ||||||
|         </div> |  | ||||||
|         <el-dropdown-menu slot="dropdown"> |  | ||||||
|           <router-link to="/user/profile"> |  | ||||||
|             <el-dropdown-item>个人中心</el-dropdown-item> |  | ||||||
|           </router-link> --> |  | ||||||
|           <!-- <el-dropdown-item @click.native="setting = true"> |  | ||||||
|             <span>布局设置</span> |  | ||||||
|           </el-dropdown-item> --> |  | ||||||
|           <!-- <el-dropdown-item divided @click.native="logout"> |  | ||||||
|             <span>退出登录</span> |  | ||||||
|           </el-dropdown-item> |  | ||||||
|         </el-dropdown-menu> |  | ||||||
|       </el-dropdown> --> |  | ||||||
|     <!-- </div> --> |  | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| @@ -55,7 +21,6 @@ import Screenfull from '@/components/Screenfull' | |||||||
| import SizeSelect from '@/components/SizeSelect' | import SizeSelect from '@/components/SizeSelect' | ||||||
| import Search from '@/components/HeaderSearch' | import Search from '@/components/HeaderSearch' | ||||||
| import NotifyMessage from '@/layout/components/Message' | import NotifyMessage from '@/layout/components/Message' | ||||||
| // import {getPath} from "@/utils/ruoyi"; |  | ||||||
| import NavbarRight from './NavbarRight.vue' | import NavbarRight from './NavbarRight.vue' | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
| @@ -102,7 +67,7 @@ export default { | |||||||
|         this.$store.dispatch('LogOut').then(() => { |         this.$store.dispatch('LogOut').then(() => { | ||||||
|           location.href = getPath('/'); |           location.href = getPath('/'); | ||||||
|         }) |         }) | ||||||
|       }).catch(() => {}); |       }).catch(() => { }); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @@ -114,15 +79,15 @@ export default { | |||||||
|   overflow: hidden; |   overflow: hidden; | ||||||
|   position: relative; |   position: relative; | ||||||
|   background: #fff; |   background: #fff; | ||||||
|   box-shadow: 0 1px 4px rgba(0,21,41,.08); |   box-shadow: 0 1px 4px rgba(0, 21, 41, .08); | ||||||
|  |  | ||||||
|   .hamburger-container { |   .hamburger-container { | ||||||
|     line-height: 52px; |     line-height: 44px; | ||||||
|     height: 100%; |     height: 100%; | ||||||
|     float: left; |     float: left; | ||||||
|     cursor: pointer; |     cursor: pointer; | ||||||
|     transition: background .3s; |     transition: background .3s; | ||||||
|     -webkit-tap-highlight-color:transparent; |     -webkit-tap-highlight-color: transparent; | ||||||
|  |  | ||||||
|     &:hover { |     &:hover { | ||||||
|       background: rgba(0, 0, 0, .025) |       background: rgba(0, 0, 0, .025) | ||||||
| @@ -185,7 +150,8 @@ export default { | |||||||
|           height: 35px; |           height: 35px; | ||||||
|           border-radius: 50%; |           border-radius: 50%; | ||||||
|         } |         } | ||||||
|         .user-nickname{ |  | ||||||
|  |         .user-nickname { | ||||||
|           margin-left: 5px; |           margin-left: 5px; | ||||||
|           font-size: 14px; |           font-size: 14px; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -1,24 +1,22 @@ | |||||||
| <template> | <template> | ||||||
|   <div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}"> |   <div :class="classObj" class="app-wrapper" :style="{ '--current-color': theme }"> | ||||||
|     <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/> |     <div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside" /> | ||||||
|     <sidebar v-if="!sidebar.hide" class="sidebar-container" /> |     <sidebar v-if="!sidebar.hide" class="sidebar-container" /> | ||||||
|     <div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide}" class="main-container"> |     <div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" class="main-container"> | ||||||
|       <div :class="{'fixed-header':fixedHeader}"> |       <div :class="{ 'fixed-header': fixedHeader }"> | ||||||
|         <navbar /> |         <navbar /> | ||||||
|         <tags-view v-if="needTagsView" /> |         <tags-view v-if="needTagsView" /> | ||||||
|       </div> |       </div> | ||||||
|       <app-main /> |       <app-main /> | ||||||
|       <div class="main-footer" style="color: #C7C7C7; user-select: none; font-size: 14px; letter-spacing: 1px; height: 30px; display: grid; place-content: center;">© 中建材智能自动化研究院有限公司</div> |       <div class="main-footer" | ||||||
|       <right-panel> |         style="color: #C7C7C7; user-select: none; font-size: 14px; letter-spacing: 1px; height: 30px; display: grid; place-content: center;"> | ||||||
|         <settings /> |         © 中建材智能自动化研究院有限公司</div> | ||||||
|       </right-panel> |  | ||||||
|     </div> |     </div> | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| <script> | <script> | ||||||
| import RightPanel from '@/components/RightPanel' | import { AppMain, Navbar, Sidebar, TagsView } from './components' | ||||||
| import { AppMain, Navbar, Settings, Sidebar, TagsView } from './components' |  | ||||||
| import ResizeMixin from './mixin/ResizeHandler' | import ResizeMixin from './mixin/ResizeHandler' | ||||||
| import { mapState } from 'vuex' | import { mapState } from 'vuex' | ||||||
| import variables from '@/assets/styles/variables.scss' | import variables from '@/assets/styles/variables.scss' | ||||||
| @@ -28,8 +26,6 @@ export default { | |||||||
|   components: { |   components: { | ||||||
|     AppMain, |     AppMain, | ||||||
|     Navbar, |     Navbar, | ||||||
|     RightPanel, |  | ||||||
|     Settings, |  | ||||||
|     Sidebar, |     Sidebar, | ||||||
|     TagsView |     TagsView | ||||||
|   }, |   }, | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ export default { | |||||||
| 		}; | 		}; | ||||||
| 	}, | 	}, | ||||||
| 	created() { | 	created() { | ||||||
|  | 		this.tableH = this?.heightNum ? this.tableHeight(this.heightNum) : this.tableHeight(260); | ||||||
| 		window.addEventListener('resize', this._setTableHeight); | 		window.addEventListener('resize', this._setTableHeight); | ||||||
| 	}, | 	}, | ||||||
| 	destroyed() { | 	destroyed() { | ||||||
| @@ -12,7 +13,8 @@ export default { | |||||||
| 	}, | 	}, | ||||||
| 	methods: { | 	methods: { | ||||||
| 		_setTableHeight() { | 		_setTableHeight() { | ||||||
| 			this.tableH = this.tableHeight(260); | 			this.tableH = this?.heightNum ? this.tableHeight(this.heightNum) : this.tableHeight(260); | ||||||
|  | 			// this.tableH = this.tableHeight(260); | ||||||
| 		}, | 		}, | ||||||
| 	}, | 	}, | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ const actions = { | |||||||
|         } |         } | ||||||
|         // 处理 dictValue 层级 |         // 处理 dictValue 层级 | ||||||
|         dictDataMap[dictData.dictType].push({ |         dictDataMap[dictData.dictType].push({ | ||||||
|  |           id: dictData.id, | ||||||
|           value: dictData.value, |           value: dictData.value, | ||||||
|           label: dictData.label, |           label: dictData.label, | ||||||
|           colorType: dictData.colorType, |           colorType: dictData.colorType, | ||||||
|   | |||||||
| @@ -1,47 +1,57 @@ | |||||||
| $editorTabsborderColor: #121315; | $editorTabsborderColor: #121315; | ||||||
| body, html{ |  | ||||||
|  | body, | ||||||
|  | html { | ||||||
|   margin: 0; |   margin: 0; | ||||||
|   padding: 0; |   padding: 0; | ||||||
|   background: #F2F4F9; |   background: #F2F4F9; | ||||||
|   -moz-osx-font-smoothing: grayscale; |   -moz-osx-font-smoothing: grayscale; | ||||||
|   -webkit-font-smoothing: antialiased; |   -webkit-font-smoothing: antialiased; | ||||||
|   text-rendering: optimizeLegibility; |   text-rendering: optimizeLegibility; | ||||||
|   font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji; |   font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji; | ||||||
| } | } | ||||||
|  |  | ||||||
| input, textarea{ | input, | ||||||
|   font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji; | textarea { | ||||||
|  |   font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji; | ||||||
| } | } | ||||||
|  |  | ||||||
| .editor-tabs{ | .editor-tabs { | ||||||
|   background: $editorTabsborderColor; |   background: $editorTabsborderColor; | ||||||
|   .el-tabs__header{ |  | ||||||
|  |   .el-tabs__header { | ||||||
|     margin: 0; |     margin: 0; | ||||||
|     border-bottom-color: $editorTabsborderColor; |     border-bottom-color: $editorTabsborderColor; | ||||||
|     .el-tabs__nav{ |  | ||||||
|  |     .el-tabs__nav { | ||||||
|       border-color: $editorTabsborderColor; |       border-color: $editorTabsborderColor; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   .el-tabs__item{ |  | ||||||
|  |   .el-tabs__item { | ||||||
|     height: 32px; |     height: 32px; | ||||||
|     line-height: 32px; |     line-height: 32px; | ||||||
|     color: #888a8e; |     color: #888a8e; | ||||||
|     border-left: 1px solid $editorTabsborderColor!important; |     border-left: 1px solid $editorTabsborderColor !important; | ||||||
|     background: #363636; |     background: #363636; | ||||||
|     margin-right: 5px; |     margin-right: 5px; | ||||||
|     user-select: none; |     user-select: none; | ||||||
|   } |   } | ||||||
|   .el-tabs__item.is-active{ |  | ||||||
|  |   .el-tabs__item.is-active { | ||||||
|     background: #1e1e1e; |     background: #1e1e1e; | ||||||
|     border-bottom-color: #1e1e1e!important; |     border-bottom-color: #1e1e1e !important; | ||||||
|     color: #fff; |     color: #fff; | ||||||
|   } |   } | ||||||
|   .el-icon-edit{ |  | ||||||
|  |   .el-icon-edit { | ||||||
|     color: #f1fa8c; |     color: #f1fa8c; | ||||||
|   } |   } | ||||||
|   .el-icon-document{ |  | ||||||
|  |   .el-icon-document { | ||||||
|     color: #a95812; |     color: #a95812; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   :focus.is-active.is-focus:not(:active) { |   :focus.is-active.is-focus:not(:active) { | ||||||
|     box-shadow: none; |     box-shadow: none; | ||||||
|     border-radius: 0; |     border-radius: 0; | ||||||
| @@ -54,29 +64,35 @@ input, textarea{ | |||||||
|     padding: 12px 18px 15px 15px; |     padding: 12px 18px 15px 15px; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| .el-scrollbar__wrap { | .el-scrollbar__wrap { | ||||||
|   box-sizing: border-box; |   box-sizing: border-box; | ||||||
|   overflow-x: hidden !important; |   overflow-x: hidden !important; | ||||||
|   margin-bottom: 0 !important; |   margin-bottom: 0 !important; | ||||||
| } | } | ||||||
| .center-tabs{ |  | ||||||
|   .el-tabs__header{ | .center-tabs { | ||||||
|     margin-bottom: 0!important; |   .el-tabs__header { | ||||||
|  |     margin-bottom: 0 !important; | ||||||
|   } |   } | ||||||
|   .el-tabs__item{ |  | ||||||
|  |   .el-tabs__item { | ||||||
|     width: 50%; |     width: 50%; | ||||||
|     text-align: center; |     text-align: center; | ||||||
|   } |   } | ||||||
|   .el-tabs__nav{ |  | ||||||
|  |   .el-tabs__nav { | ||||||
|     width: 100%; |     width: 100%; | ||||||
|   } |   } | ||||||
| } | } | ||||||
| .reg-item{ |  | ||||||
|  | .reg-item { | ||||||
|   padding: 12px 6px; |   padding: 12px 6px; | ||||||
|   background: #f8f8f8; |   background: #f8f8f8; | ||||||
|   position: relative; |   position: relative; | ||||||
|   border-radius: 4px; |   border-radius: 4px; | ||||||
|   .close-btn{ |  | ||||||
|  |   .close-btn { | ||||||
|     position: absolute; |     position: absolute; | ||||||
|     right: -6px; |     right: -6px; | ||||||
|     top: -6px; |     top: -6px; | ||||||
| @@ -91,18 +107,22 @@ input, textarea{ | |||||||
|     z-index: 1; |     z-index: 1; | ||||||
|     cursor: pointer; |     cursor: pointer; | ||||||
|     font-size: 12px; |     font-size: 12px; | ||||||
|     &:hover{ |  | ||||||
|  |     &:hover { | ||||||
|       background: rgba(210, 23, 23, 0.5) |       background: rgba(210, 23, 23, 0.5) | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   & + .reg-item{ |  | ||||||
|  |   &+.reg-item { | ||||||
|     margin-top: 18px; |     margin-top: 18px; | ||||||
|   } |   } | ||||||
| } | } | ||||||
| .action-bar{ |  | ||||||
|  | .action-bar { | ||||||
|   & .el-button+.el-button { |   & .el-button+.el-button { | ||||||
|     margin-left: 15px; |     margin-left: 15px; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   & i { |   & i { | ||||||
|     font-size: 20px; |     font-size: 20px; | ||||||
|     vertical-align: middle; |     vertical-align: middle; | ||||||
| @@ -111,101 +131,36 @@ input, textarea{ | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| .custom-tree-node{ | .custom-tree-node { | ||||||
|   width: 100%; |   width: 100%; | ||||||
|   font-size: 14px; |   font-size: 14px; | ||||||
|   .node-operation{ |  | ||||||
|  |   .node-operation { | ||||||
|     float: right; |     float: right; | ||||||
|   } |   } | ||||||
|   i[class*="el-icon"] + i[class*="el-icon"]{ |  | ||||||
|  |   i[class*="el-icon"]+i[class*="el-icon"] { | ||||||
|     margin-left: 6px; |     margin-left: 6px; | ||||||
|   } |   } | ||||||
|   .el-icon-plus{ |  | ||||||
|  |   .el-icon-plus { | ||||||
|     color: #409EFF; |     color: #409EFF; | ||||||
|   } |   } | ||||||
|   .el-icon-delete{ |  | ||||||
|  |   .el-icon-delete { | ||||||
|     color: #157a0c; |     color: #157a0c; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| .el-scrollbar__view{ | .el-scrollbar__view { | ||||||
| //   overflow-x: hidden; |   //   overflow-x: hidden; | ||||||
| } | } | ||||||
|  |  | ||||||
| .el-rate{ | .el-rate { | ||||||
|   display: inline-block; |   display: inline-block; | ||||||
|   vertical-align: text-top; |   vertical-align: text-top; | ||||||
| } | } | ||||||
| .el-upload__tip{ |  | ||||||
|  | .el-upload__tip { | ||||||
|   line-height: 1.2; |   line-height: 1.2; | ||||||
| } |  | ||||||
| // 滚动条 |  | ||||||
| ::-webkit-scrollbar { |  | ||||||
|   width: 8px; |  | ||||||
|   height: 8px; |  | ||||||
|   background-color: transparent; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ::-webkit-scrollbar-track-piece { |  | ||||||
|   background-color:rgba(144,147,153,0); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ::-webkit-scrollbar-corner { |  | ||||||
|   background-color:rgba(144,147,153,0); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ::-webkit-scrollbar-track { |  | ||||||
|   width: 6px; |  | ||||||
|   background: rgba(144,147,153,0); |  | ||||||
|   -webkit-border-radius: 2em; |  | ||||||
|   -moz-border-radius: 2em; |  | ||||||
|   border-radius: 2em; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ::-webkit-scrollbar-thumb { |  | ||||||
|   background-color: #EDEDED; |  | ||||||
|   background-clip: padding-box; |  | ||||||
|   min-height: 28px; |  | ||||||
|   -webkit-border-radius: 2em; |  | ||||||
|   -moz-border-radius: 2em; |  | ||||||
|   border-radius: 2em; |  | ||||||
|   transition: background-color .3s; |  | ||||||
|   cursor: pointer; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ::-webkit-scrollbar-thumb:hover { |  | ||||||
|   background-color: #D9D9D9; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // 抽屉head区域---start |  | ||||||
| .el-drawer__header { |  | ||||||
|   padding-bottom: 20px; |  | ||||||
|   padding-left: 30px; |  | ||||||
|   margin-bottom: 23px; |  | ||||||
|   font-size: 20px; |  | ||||||
|   font-weight: 500; |  | ||||||
|   color: rgba(0,0,0,0.85); |  | ||||||
|   border-bottom: 1px solid rgba(233, 233, 233, 1); |  | ||||||
| } |  | ||||||
| .el-drawer__header > :first-child::before { |  | ||||||
|   content: ''; |  | ||||||
|   display: inline-block; |  | ||||||
|   width: 4px; |  | ||||||
|   height: 24px; |  | ||||||
|   background-color: #0b58ff; |  | ||||||
|   margin-right: 8px; |  | ||||||
|   vertical-align: middle; |  | ||||||
| } |  | ||||||
| // 抽屉head区域---end |  | ||||||
| // 弹出框,上下分布,去掉label的padding-bottom |  | ||||||
| .el-form--label-top .el-form-item__label { |  | ||||||
|   padding: 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // 大屏滚动表格 |  | ||||||
| .dv-scroll-board .rows .ceil, .dv-scroll-board .header .header-item { |  | ||||||
|   border-right: 1px solid rgba(13, 23, 40, 1); |  | ||||||
| } |  | ||||||
| .dv-scroll-board .rows .ceil:last-child, .dv-scroll-board .header .header-item:last-child { |  | ||||||
|   border-right: none; |  | ||||||
| } | } | ||||||
| @@ -97,6 +97,8 @@ export const DICT_TYPE = { | |||||||
|   TABLE_NAME: 'table_name', |   TABLE_NAME: 'table_name', | ||||||
|   METHOD: 'method', |   METHOD: 'method', | ||||||
|   PUSH: 'push', |   PUSH: 'push', | ||||||
|  |   ENERGY_TYPE: 'energy_type', | ||||||
|  |  | ||||||
|  |  | ||||||
|   // ============== ORDER - 订单模块 ============= |   // ============== ORDER - 订单模块 ============= | ||||||
|   ORDER_STATUS: 'order_status', |   ORDER_STATUS: 'order_status', | ||||||
| @@ -117,7 +119,7 @@ export const DICT_TYPE = { | |||||||
|  |  | ||||||
|   // ============== GROUP - 班组模块 ============= |   // ============== GROUP - 班组模块 ============= | ||||||
|   WORK_SHOP: 'workshop', |   WORK_SHOP: 'workshop', | ||||||
|     // ============== GROUP - 质量模块 ============= |   // ============== GROUP - 质量模块 ============= | ||||||
|   MATERIAL_GRADE: 'material_grade' |   MATERIAL_GRADE: 'material_grade' | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								src/utils/loadBeautifier.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/utils/loadBeautifier.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | import loadScript from './loadScript' | ||||||
|  | import ELEMENT from 'element-ui' | ||||||
|  | import pluginsConfig from './pluginsConfig' | ||||||
|  |  | ||||||
|  | let beautifierObj | ||||||
|  |  | ||||||
|  | export default function loadBeautifier(cb) { | ||||||
|  |   const { beautifierUrl } = pluginsConfig | ||||||
|  |   if (beautifierObj) { | ||||||
|  |     cb(beautifierObj) | ||||||
|  |     return | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   const loading = ELEMENT.Loading.service({ | ||||||
|  |     fullscreen: true, | ||||||
|  |     lock: true, | ||||||
|  |     text: '格式化资源加载中...', | ||||||
|  |     spinner: 'el-icon-loading', | ||||||
|  |     background: 'rgba(255, 255, 255, 0.5)' | ||||||
|  |   }) | ||||||
|  |  | ||||||
|  |   loadScript(beautifierUrl, () => { | ||||||
|  |     loading.close() | ||||||
|  |     // eslint-disable-next-line no-undef | ||||||
|  |     beautifierObj = beautifier | ||||||
|  |     cb(beautifierObj) | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										40
									
								
								src/utils/loadMonaco.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/utils/loadMonaco.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | |||||||
|  | import loadScript from './loadScript' | ||||||
|  | import ELEMENT from 'element-ui' | ||||||
|  | import pluginsConfig from './pluginsConfig' | ||||||
|  |  | ||||||
|  | // monaco-editor单例 | ||||||
|  | let monacoEidtor | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 动态加载monaco-editor cdn资源 | ||||||
|  |  * @param {Function} cb 回调,必填 | ||||||
|  |  */ | ||||||
|  | export default function loadMonaco(cb) { | ||||||
|  |   if (monacoEidtor) { | ||||||
|  |     cb(monacoEidtor) | ||||||
|  |     return | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   const { monacoEditorUrl: vs } = pluginsConfig | ||||||
|  |  | ||||||
|  |   // 使用element ui实现加载提示 | ||||||
|  |   const loading = ELEMENT.Loading.service({ | ||||||
|  |     fullscreen: true, | ||||||
|  |     lock: true, | ||||||
|  |     text: '编辑器资源初始化中...', | ||||||
|  |     spinner: 'el-icon-loading', | ||||||
|  |     background: 'rgba(255, 255, 255, 0.5)' | ||||||
|  |   }) | ||||||
|  |  | ||||||
|  |   !window.require && (window.require = {}) | ||||||
|  |   !window.require.paths && (window.require.paths = {}) | ||||||
|  |   window.require.paths.vs = vs | ||||||
|  |  | ||||||
|  |   loadScript(`${vs}/loader.js`, () => { | ||||||
|  |     window.require(['vs/editor/editor.main'], () => { | ||||||
|  |       loading.close() | ||||||
|  |       monacoEidtor = window.monaco | ||||||
|  |       cb(monacoEidtor) | ||||||
|  |     }) | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										60
									
								
								src/utils/loadScript.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/utils/loadScript.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | const callbacks = {} | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 加载一个远程脚本 | ||||||
|  |  * @param {String} src 一个远程脚本 | ||||||
|  |  * @param {Function} callback 回调 | ||||||
|  |  */ | ||||||
|  | function loadScript(src, callback) { | ||||||
|  |   const existingScript = document.getElementById(src) | ||||||
|  |   const cb = callback || (() => {}) | ||||||
|  |   if (!existingScript) { | ||||||
|  |     callbacks[src] = [] | ||||||
|  |     const $script = document.createElement('script') | ||||||
|  |     $script.src = src | ||||||
|  |     $script.id = src | ||||||
|  |     $script.async = 1 | ||||||
|  |     document.body.appendChild($script) | ||||||
|  |     const onEnd = 'onload' in $script ? stdOnEnd.bind($script) : ieOnEnd.bind($script) | ||||||
|  |     onEnd($script) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   callbacks[src].push(cb) | ||||||
|  |  | ||||||
|  |   function stdOnEnd(script) { | ||||||
|  |     script.onload = () => { | ||||||
|  |       this.onerror = this.onload = null | ||||||
|  |       callbacks[src].forEach(item => { | ||||||
|  |         item(null, script) | ||||||
|  |       }) | ||||||
|  |       delete callbacks[src] | ||||||
|  |     } | ||||||
|  |     script.onerror = () => { | ||||||
|  |       this.onerror = this.onload = null | ||||||
|  |       cb(new Error(`Failed to load ${src}`), script) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   function ieOnEnd(script) { | ||||||
|  |     script.onreadystatechange = () => { | ||||||
|  |       if (this.readyState !== 'complete' && this.readyState !== 'loaded') return | ||||||
|  |       this.onreadystatechange = null | ||||||
|  |       callbacks[src].forEach(item => { | ||||||
|  |         item(null, script) | ||||||
|  |       }) | ||||||
|  |       delete callbacks[src] | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 顺序加载一组远程脚本 | ||||||
|  |  * @param {Array} list 一组远程脚本 | ||||||
|  |  * @param {Function} cb 回调 | ||||||
|  |  */ | ||||||
|  | export function loadScriptQueue(list, cb) { | ||||||
|  |   const first = list.shift() | ||||||
|  |   list.length ? loadScript(first, () => loadScriptQueue(list, cb)) : loadScript(first, cb) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export default loadScript | ||||||
							
								
								
									
										29
									
								
								src/utils/loadTinymce.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/utils/loadTinymce.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | import loadScript from './loadScript' | ||||||
|  | import ELEMENT from 'element-ui' | ||||||
|  | import pluginsConfig from './pluginsConfig' | ||||||
|  |  | ||||||
|  | let tinymceObj | ||||||
|  |  | ||||||
|  | export default function loadTinymce(cb) { | ||||||
|  |   const { tinymceUrl } = pluginsConfig | ||||||
|  |  | ||||||
|  |   if (tinymceObj) { | ||||||
|  |     cb(tinymceObj) | ||||||
|  |     return | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   const loading = ELEMENT.Loading.service({ | ||||||
|  |     fullscreen: true, | ||||||
|  |     lock: true, | ||||||
|  |     text: '富文本资源加载中...', | ||||||
|  |     spinner: 'el-icon-loading', | ||||||
|  |     background: 'rgba(255, 255, 255, 0.5)' | ||||||
|  |   }) | ||||||
|  |  | ||||||
|  |   loadScript(tinymceUrl, () => { | ||||||
|  |     loading.close() | ||||||
|  |     // eslint-disable-next-line no-undef | ||||||
|  |     tinymceObj = tinymce | ||||||
|  |     cb(tinymceObj) | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								src/utils/pluginsConfig.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/utils/pluginsConfig.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | const CDN = 'https://lib.baomitu.com/' // CDN Homepage: https://cdn.baomitu.com/ | ||||||
|  | const publicPath = process.env.BASE_URL | ||||||
|  |  | ||||||
|  | function splicingPluginUrl(PluginName, version, fileName) { | ||||||
|  |   return `${CDN}${PluginName}/${version}/${fileName}` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export default { | ||||||
|  |   beautifierUrl: splicingPluginUrl('js-beautify', '1.13.5', 'beautifier.min.js'), | ||||||
|  |   // monacoEditorUrl: splicingPluginUrl('monaco-editor', '0.19.3', 'min/vs'), // 使用 monaco-editor CDN 链接 | ||||||
|  |   monacoEditorUrl: `${publicPath}libs/monaco-editor/vs`, // 使用 monaco-editor 本地代码 | ||||||
|  |   tinymceUrl: splicingPluginUrl('tinymce', '5.7.0', 'tinymce.min.js') | ||||||
|  | } | ||||||
| @@ -2,7 +2,7 @@ | |||||||
|  * @Author: zwq |  * @Author: zwq | ||||||
|  * @Date: 2021-07-19 15:18:30 |  * @Date: 2021-07-19 15:18:30 | ||||||
|  * @LastEditors: zhp |  * @LastEditors: zhp | ||||||
|  * @LastEditTime: 2024-03-28 15:28:07 |  * @LastEditTime: 2024-04-03 10:54:53 | ||||||
|  * @Description: |  * @Description: | ||||||
| --> | --> | ||||||
| <template> | <template> | ||||||
| @@ -16,11 +16,11 @@ | |||||||
|       许昌安彩AGV原片周转看板 |       许昌安彩AGV原片周转看板 | ||||||
|       <h3 class="unit">单位:河南汇融数字科技有限公司</h3> |       <h3 class="unit">单位:河南汇融数字科技有限公司</h3> | ||||||
|       <h3 class="time">{{ times }}</h3> |       <h3 class="time">{{ times }}</h3> | ||||||
|       <el-button type="text" class="title-button" :style="{ right: 18 + 'px', top: 26 + 'px', fontSize: '32px' }" |       <!-- <el-button type="text" class="title-button" :style="{ right: 18 + 'px', top: 26 + 'px', fontSize: '32px' }" | ||||||
|         @click="changeFullScreen"> |         @click="changeFullScreen"> | ||||||
|         <svg-icon width="32" height="32" v-if="isFullScreen" icon-class="unFullScreenView" /> |         <svg-icon width="32" height="32" v-if="isFullScreen" icon-class="unFullScreenView" /> | ||||||
|         <svg-icon width="32" height="32" v-else icon-class="fullScreenView" /> |         <svg-icon width="32" height="32" v-else icon-class="fullScreenView" /> | ||||||
|       </el-button> |       </el-button> --> | ||||||
|     </el-row> |     </el-row> | ||||||
|     <el-row class="container-main flex-col" type="flex"> |     <el-row class="container-main flex-col" type="flex"> | ||||||
|       <el-row :style="{ padding: '0 ' + 9 + 'px' }" :gutter="15 * beilv" type="flex" class="flex-1"> |       <el-row :style="{ padding: '0 ' + 9 + 'px' }" :gutter="15 * beilv" type="flex" class="flex-1"> | ||||||
| @@ -34,14 +34,16 @@ | |||||||
|         <el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="12"> |         <el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="12"> | ||||||
|           <base-container :beilv="1" :size="'eqStatus'" :title="'周转进度'" :title-icon="'order'" :back="'energy'"> |           <base-container :beilv="1" :size="'eqStatus'" :title="'周转进度'" :title-icon="'order'" :back="'energy'"> | ||||||
|             <div class="order" style="width:100%; overflow: hidden scroll;height: 350px;"> |             <div class="order" style="width:100%; overflow: hidden scroll;height: 350px;"> | ||||||
|               <el-row v-for="op in orderProcessList" :key="op.id" style="margin-bottom: 1em"> |               <el-row v-for="op in orderProcessList" :key="op.id" style="margin-bottom: .5em"> | ||||||
|                 <p v-if="op.outRate === 1" class="now-secondary-title" style="color:#4679FD"> |                 <!-- <p v-if="op.outRate === 1" class="now-secondary-title" | ||||||
|  |                   style="font-size: 14px; opacity: calc(.6);color:#4679FD"> | ||||||
|                   <i class="el-icon-check" /> |                   <i class="el-icon-check" /> | ||||||
|                   {{ op.name }} |                   {{ op.name }} | ||||||
|                 </p> |                 </p> --> | ||||||
|                 <p v-else class="now-secondary-title">{{ op.name }}</p> |                 <!-- <p class="now-secondary-title">{{ op.name }}</p> --> | ||||||
|                 <el-progress :stroke-width="10" define-back-color="rgba(32, 57, 96, 1)" text-color="white" |                 <p  class="now-secondary-title" style="font-size: 14px;opacity: calc(.6);">{{ op.name }}</p> | ||||||
|                   :percentage="op.outRate * 100" class="custom-progress-bar" /> |                 <el-progress style="width: 935px;" text-color="rgba(255, 255, 255, .6)" :stroke-width="10" | ||||||
|  |                   define-back-color="rgba(32, 57, 96, 1)" :percentage="op.outRate * 100" class="custom-progress-bar" /> | ||||||
|               </el-row> |               </el-row> | ||||||
|             </div> |             </div> | ||||||
|           </base-container> |           </base-container> | ||||||
| @@ -496,7 +498,7 @@ export default { | |||||||
|         seconds = "0" + seconds; |         seconds = "0" + seconds; | ||||||
|       } |       } | ||||||
|       //拼接格式化当前时间 |       //拼接格式化当前时间 | ||||||
|       this.times = year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds; |       this.times = year + "." + month + "." + day + " " + hours + ":" + minutes + ":" + seconds; | ||||||
|     }, |     }, | ||||||
|     windowWidth(value) { |     windowWidth(value) { | ||||||
|       this.clientWidth = value |       this.clientWidth = value | ||||||
| @@ -530,11 +532,6 @@ export default { | |||||||
| </script> | </script> | ||||||
|  |  | ||||||
| <style lang="scss" scoped> | <style lang="scss" scoped> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| .visual-container { | .visual-container { | ||||||
|   width: 1920px; |   width: 1920px; | ||||||
|   height: 1080px; |   height: 1080px; | ||||||
| @@ -556,7 +553,7 @@ export default { | |||||||
|           top: 25px; |           top: 25px; | ||||||
|           color: rgba(255, 255, 255, 0.80); |           color: rgba(255, 255, 255, 0.80); | ||||||
|           font-size: 20px; |           font-size: 20px; | ||||||
|           letter-spacing: 0px; |           letter-spacing: 1px; | ||||||
|         } |         } | ||||||
|         .time { |         .time { | ||||||
|           position: absolute; |           position: absolute; | ||||||
| @@ -564,7 +561,7 @@ export default { | |||||||
|             top: 25px; |             top: 25px; | ||||||
|           color: rgba(255, 255, 255, 0.80); |           color: rgba(255, 255, 255, 0.80); | ||||||
|           font-size: 20px; |           font-size: 20px; | ||||||
|           letter-spacing: 0px; |           letter-spacing: .72px; | ||||||
|         } |         } | ||||||
|     .title-button { |     .title-button { | ||||||
|       color: #00fff0; |       color: #00fff0; | ||||||
| @@ -607,6 +604,14 @@ export default { | |||||||
| ::v-deep .el-progress-bar__inner { | ::v-deep .el-progress-bar__inner { | ||||||
|   background-color: unset; |   background-color: unset; | ||||||
|   background-image: linear-gradient(to right, #4573fe, #47f8dc); |   background-image: linear-gradient(to right, #4573fe, #47f8dc); | ||||||
|  | } | ||||||
|  | ::v-deep .el-progress__text { | ||||||
|  |   width: 50px; | ||||||
|  |   margin-top: -70px; | ||||||
|  |   margin-left: 834px; | ||||||
|  |   text-align: right; | ||||||
|  |   // background-color: unset; | ||||||
|  |   // background-image: linear-gradient(to right, #4573fe, #47f8dc); | ||||||
| } | } | ||||||
|  .visual-select { |  .visual-select { | ||||||
|    position: absolute; |    position: absolute; | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| <!-- | <!-- | ||||||
|  * @Author: zhp |  * @Author: zhp | ||||||
|  * @Date: 2024-01-29 16:50:26 |  * @Date: 2024-01-29 16:50:26 | ||||||
|  * @LastEditTime: 2024-03-28 16:35:49 |  * @LastEditTime: 2024-04-25 09:03:50 | ||||||
|  * @LastEditors: zhp |  * @LastEditors: zhp | ||||||
|  * @Description: |  * @Description: | ||||||
| --> | --> | ||||||
| @@ -17,11 +17,11 @@ | |||||||
|       许昌安彩冷端看板 |       许昌安彩冷端看板 | ||||||
|       <h3 class="unit">单位:河南汇融数字科技有限公司</h3> |       <h3 class="unit">单位:河南汇融数字科技有限公司</h3> | ||||||
|       <h3 class="time">{{ times }}</h3> |       <h3 class="time">{{ times }}</h3> | ||||||
|       <el-button type="text" class="title-button" :style="{ right: 18 + 'px', top: 26 + 'px',fontSize:'32px'}" |       <!-- <el-button type="text" class="title-button" :style="{ right: 18 + 'px', top: 26 + 'px',fontSize:'32px'}" | ||||||
|         @click="changeFullScreen"> |         @click="changeFullScreen"> | ||||||
|         <svg-icon width="32" height="32" v-if="isFullScreen" icon-class="unFullScreenView" /> |         <svg-icon width="32" height="32" v-if="isFullScreen" icon-class="unFullScreenView" /> | ||||||
|         <svg-icon width="32" height="32" v-else icon-class="fullScreenView" /> |         <svg-icon width="32" height="32" v-else icon-class="fullScreenView" /> | ||||||
|       </el-button> |       </el-button> --> | ||||||
|     </el-row> |     </el-row> | ||||||
|     <el-row class="container-main flex-col" type="flex"> |     <el-row class="container-main flex-col" type="flex"> | ||||||
|       <el-row :style="{ padding: '0 ' + 9 + 'px' }" :gutter="15" type="flex" class="flex-1"> |       <el-row :style="{ padding: '0 ' + 9 + 'px' }" :gutter="15" type="flex" class="flex-1"> | ||||||
| @@ -34,19 +34,27 @@ | |||||||
|         </el-col> |         </el-col> | ||||||
|  |  | ||||||
|         <el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="8"> |         <el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="8"> | ||||||
|           <base-container :no-content-padding="true" :title="'产量及良率统计'" :size="'small'" |           <base-container :show-time="true" :no-content-padding="true" :title="'产量及良率统计'" :size="'small'" | ||||||
|             :title-icon="'energyMonitoring'"> |             :title-icon="'energyMonitoring'"> | ||||||
|             <!-- <div style="width: 45%;position: absolute; top: 3em; right: 3em;"> |             <!-- <div style="width: 45%;position: absolute; top: 3em; right: 3em;"> | ||||||
|               <top-radio-group /> |               <top-radio-group /> | ||||||
|             </div> --> |             </div> --> | ||||||
|             <!-- 像下面这样表格里的limit值,也许可以用js动态计算出来 --> |             <!-- 像下面这样表格里的limit值,也许可以用js动态计算出来 --> | ||||||
|  |             <div v-if="coldDetData" class="myLegend"> | ||||||
|  |               <div class=" barCircleLegend"></div> | ||||||
|  |               <div class=" barCircle"></div> | ||||||
|  |               <h4 class="barText">产线良品率</h4> | ||||||
|  |               <div class="barLegend"></div> | ||||||
|  |               <h4 class="barCircleText">产线产量</h4> | ||||||
|  |             </div> | ||||||
|             <double-y-chart ref="productChart" :id="'doubleYChart'" :name-list="cxNameList" :data-list="cxDataList" |             <double-y-chart ref="productChart" :id="'doubleYChart'" :name-list="cxNameList" :data-list="cxDataList" | ||||||
|               :height="359" :show-legend="true" /> |               :height="359" :show-legend="true" /> | ||||||
|           </base-container> |           </base-container> | ||||||
|         </el-col> |         </el-col> | ||||||
|  |  | ||||||
|         <el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="8"> |         <el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="8"> | ||||||
|           <base-container :no-content-padding="true" :title="'ISRA 缺陷数据'" :size="'small'" :title-icon="'scrap'"> |           <base-container :show-time="true" :no-content-padding="true" :title="'ISRA 缺陷数据'" :size="'small'" | ||||||
|  |             :title-icon="'scrap'"> | ||||||
|             <!-- <base-table1 :page="1" :limit="999" :show-index="false" :table-config="ISRATableProps" |             <!-- <base-table1 :page="1" :limit="999" :show-index="false" :table-config="ISRATableProps" | ||||||
|               :table-data="ISRAList" /> --> |               :table-data="ISRAList" /> --> | ||||||
|             <ISRAChart ref="ISRAChart" /> |             <ISRAChart ref="ISRAChart" /> | ||||||
| @@ -57,18 +65,18 @@ | |||||||
|  |  | ||||||
|       <el-row :style="{ padding: '0 ' + 9 + 'px' }" :gutter="10" type="flex" class="flex-1"> |       <el-row :style="{ padding: '0 ' + 9 + 'px' }" :gutter="10" type="flex" class="flex-1"> | ||||||
|         <el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="12"> |         <el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="12"> | ||||||
|           <base-container :no-content-padding="true" :height="256" :title="'废片 缺陷数据'" :size="'eqStatus'" |           <base-container :show-time="true" :no-content-padding="true" :height="256" :title="'废片 缺陷数据'" | ||||||
|             :title-icon="'scrap'"> |             :size="'eqStatus'" :title-icon="'scrap'"> | ||||||
|             <!-- <div style="width: 45%;position: absolute; top: 3em; right: 3em;"> |             <!-- <div style="width: 45%;position: absolute; top: 3em; right: 3em;"> | ||||||
|               <top-radio-group /> |               <top-radio-group /> | ||||||
|             </div> --> |             </div> --> | ||||||
|             <!-- <el-row :gutter="9"> --> |             <!-- <el-row :gutter="9"> --> | ||||||
|             <!-- <el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="24"> --> |             <!-- <el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="24"> --> | ||||||
|             <pile-bar-chart style="margin-bottom: -15px" ref="firstPileChart" :height="90" /> |             <pile-bar-chart id=" 'one' " style="margin-top: -5px;" ref="firstPileChart" :height="80" /> | ||||||
|             <second-pile-bar-chart style="margin-bottom: -15px" id=" 'second' " ref="secondPileChart" :height="90" /> |             <second-pile-bar-chart id=" 'second' " ref="secondPileChart" :height="90" /> | ||||||
|             <third-pile-bar-chart style="margin-bottom: -15px" id=" 'third' " ref="thirdPileChart" :height="90" /> |             <third-pile-bar-chart id=" 'third' " ref="thirdPileChart" :height="90" /> | ||||||
|             <fourth-pile-bar-chart style="margin-bottom: -15px" id=" 'fourth' " ref="fourthPileChart" :height="90" /> |             <fourth-pile-bar-chart id=" 'fourth' " ref="fourthPileChart" :height="90" /> | ||||||
|             <fifth-pile-bar-chart style="margin-bottom: -15px" id=" 'fifth' " ref="fifthPileChart" :height="100" /> |             <fifth-pile-bar-chart style="margin-top: -5px;" id=" 'fifth' " ref="fifthPileChart" :height="90" /> | ||||||
|             <!-- <pile-bar-chart ref="secondPileChart" |             <!-- <pile-bar-chart ref="secondPileChart" | ||||||
|               :height="90" /> |               :height="90" /> | ||||||
|             <pile-bar-chart ref="thirdPileChart" |             <pile-bar-chart ref="thirdPileChart" | ||||||
| @@ -91,7 +99,8 @@ | |||||||
|           </base-container> |           </base-container> | ||||||
|         </el-col> |         </el-col> | ||||||
|         <el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="14"> |         <el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="14"> | ||||||
|           <base-container :height="318 + 338 + 16" :size="'eqStatus'" :title="'设备状态监控'" :title-icon="'eqMonitoring'"> |           <base-container :show-time="false" :height="318 + 338 + 16" :size="'eqStatus'" :title="'设备状态监控'" | ||||||
|  |             :title-icon="'eqMonitoring'"> | ||||||
|             <!-- <div style="width: 45%;position: absolute; top: 3em; right: 3em;"> |             <!-- <div style="width: 45%;position: absolute; top: 3em; right: 3em;"> | ||||||
|               <top-radio-group /> |               <top-radio-group /> | ||||||
|             </div> --> |             </div> --> | ||||||
| @@ -244,6 +253,7 @@ export default { | |||||||
|       funWs: undefined, |       funWs: undefined, | ||||||
|       SJGws: undefined, |       SJGws: undefined, | ||||||
|       funWsData: {}, |       funWsData: {}, | ||||||
|  |       coldDetData:[], | ||||||
|       SJGWsData: {}, |       SJGWsData: {}, | ||||||
|       cxNameList:[], |       cxNameList:[], | ||||||
|       cxDataList:[], |       cxDataList:[], | ||||||
| @@ -302,6 +312,7 @@ export default { | |||||||
|       window.location.reload() |       window.location.reload() | ||||||
|     }, 86400000) |     }, 86400000) | ||||||
|     // this.getData() |     // this.getData() | ||||||
|  |     // this.getReaiData() | ||||||
|   }, |   }, | ||||||
|   destroyed() { |   destroyed() { | ||||||
|     this.CutWebsocketClose() |     this.CutWebsocketClose() | ||||||
| @@ -314,85 +325,7 @@ export default { | |||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   mounted() { |   mounted() { | ||||||
|     let nameList = [] |     this.getProductData() | ||||||
|     let nameWasteList = [] |  | ||||||
|     let topNameList = [] |  | ||||||
|     let productList = [] |  | ||||||
|     let wasteList = [] |  | ||||||
|     let yieldList = [] |  | ||||||
|     // let sumAreaList = [] |  | ||||||
|     // let yieldList = [] |  | ||||||
|     // this.cutTableDataList = |  | ||||||
|     let coldDetData = [ |  | ||||||
|       { |  | ||||||
|         "first": 0.8834, |  | ||||||
|         "lineName": "Y61", |  | ||||||
|         "product": 0.8834, |  | ||||||
|         "productArea": 35069.28, |  | ||||||
|         "second": 0, |  | ||||||
|         'sumArea': 38400, |  | ||||||
|         'wastArea': 3330.72, |  | ||||||
|         "yield": 0.9133 |  | ||||||
|       }, |  | ||||||
|       { |  | ||||||
|         "first": 0.847, |  | ||||||
|         "lineName": "Y62", |  | ||||||
|         "product": 0.847, |  | ||||||
|         "productArea": 26765.46, |  | ||||||
|         "second": 0, |  | ||||||
|         'sumArea': 1111111, |  | ||||||
|         'wastArea': 22222, |  | ||||||
|         "yield": 0.9133 |  | ||||||
|       }, |  | ||||||
|       { |  | ||||||
|         "first": 0.8668, |  | ||||||
|         "lineName": "Y63", |  | ||||||
|         "product": 0.8668, |  | ||||||
|         "productArea": 26448.46, |  | ||||||
|         "second": 0, |  | ||||||
|         'sumArea': 1111111, |  | ||||||
|         'wastArea': 22222, |  | ||||||
|         "yield": 0.9133 |  | ||||||
|       }, |  | ||||||
|       { |  | ||||||
|         "first": 0.9064, |  | ||||||
|         "lineName": "Y64", |  | ||||||
|         "product": 0.9064, |  | ||||||
|         "productArea": 26667.32, |  | ||||||
|         "second": 0, |  | ||||||
|         'sumArea': 1111111, |  | ||||||
|         'wastArea': 22222, |  | ||||||
|         "yield": 0.9133 |  | ||||||
|       }, |  | ||||||
|       { |  | ||||||
|         "first": 0.8838, |  | ||||||
|         "lineName": "Y65", |  | ||||||
|         "product": 0.8838, |  | ||||||
|         "productArea": 26554.32, |  | ||||||
|         "second": 0, |  | ||||||
|         'sumArea': 1111111, |  | ||||||
|         'wastArea': 22222, |  | ||||||
|         "yield": 0.9133 |  | ||||||
|       } |  | ||||||
|     ] |  | ||||||
|     coldDetData.forEach((ele, index) => { |  | ||||||
|       nameList.push(ele.lineName) |  | ||||||
|       topNameList.push('产线: ' + ele.lineName + '   ' + '总面积:' + ele.sumArea) |  | ||||||
|       productList.push(ele.productArea) |  | ||||||
|       wasteList.push(ele.wastArea) |  | ||||||
|       nameWasteList.push('缺陷面积:' + ele.wastArea) |  | ||||||
|       yieldList.push({ |  | ||||||
|         name: '良品', |  | ||||||
|         yield:ele.yield |  | ||||||
|       }) |  | ||||||
|       // sumAreaList.push(ele.sumArea) |  | ||||||
|       // yieldList.push((ele.yield * 100).toFixed(3)) |  | ||||||
|     }) |  | ||||||
|     this.$refs.firstPileChart.initChart(nameList, [topNameList[0]], [nameWasteList[0]], [productList[0]], [wasteList[0]]) |  | ||||||
|     this.$refs.secondPileChart.initChart(nameList, [topNameList[1]], [nameWasteList[1]], [productList[1]], [wasteList[1]]) |  | ||||||
|     this.$refs.thirdPileChart.initChart(nameList, [topNameList[2]], [nameWasteList[2]], [productList[2]], [wasteList[2]]) |  | ||||||
|     this.$refs.fourthPileChart.initChart(nameList, [topNameList[3]], [nameWasteList[3]], [productList[3]], [wasteList[3]]) |  | ||||||
|     this.$refs.fifthPileChart.initChart(nameList, [topNameList[4]], [nameWasteList[4]], [productList[4]], [wasteList[4]]) |  | ||||||
|     // this.$refs.productChart.initChart(nameList, yieldList, sumAreaList) |     // this.$refs.productChart.initChart(nameList, yieldList, sumAreaList) | ||||||
|     this.getTimes() |     this.getTimes() | ||||||
|     // console.log(moment(this.logoutTime - 28800000).format('HH:mm:ss')); |     // console.log(moment(this.logoutTime - 28800000).format('HH:mm:ss')); | ||||||
| @@ -414,6 +347,131 @@ export default { | |||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   methods: { |   methods: { | ||||||
|  |     getProductData() { | ||||||
|  |       let nameList = [] | ||||||
|  |       let nameWasteList = [] | ||||||
|  |       let topNameList = [] | ||||||
|  |       let productList = [] | ||||||
|  |       let wasteList = [] | ||||||
|  |       let yieldList = [] | ||||||
|  |       let sumAreaList = [] | ||||||
|  |       // let yieldList = [] | ||||||
|  |       // this.cutTableDataList = | ||||||
|  |       this.coldDetData = [ | ||||||
|  |         { | ||||||
|  |           "first": 0.8834, | ||||||
|  |           "lineName": "Y61", | ||||||
|  |           "product": 0.8834, | ||||||
|  |           "productArea": 35069.28, | ||||||
|  |           "second": 0, | ||||||
|  |           'sumArea': 38400, | ||||||
|  |           'wastArea': 3330.72, | ||||||
|  |           "yield": 0.9133 | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "first": 0.847, | ||||||
|  |           "lineName": "Y62", | ||||||
|  |           "product": 0.847, | ||||||
|  |           "productArea": 26765.46, | ||||||
|  |           "second": 0, | ||||||
|  |           'sumArea': 1111111, | ||||||
|  |           'wastArea': 22222, | ||||||
|  |           "yield": 0.9133 | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "first": 0.8668, | ||||||
|  |           "lineName": "Y63", | ||||||
|  |           "product": 0.8668, | ||||||
|  |           "productArea": 26448.46, | ||||||
|  |           "second": 0, | ||||||
|  |           'sumArea': 1111111, | ||||||
|  |           'wastArea': 22222, | ||||||
|  |           "yield": 0.9133 | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "first": 0.9064, | ||||||
|  |           "lineName": "Y64", | ||||||
|  |           "product": 0.9064, | ||||||
|  |           "productArea": 26667.32, | ||||||
|  |           "second": 0, | ||||||
|  |           'sumArea': 1111111, | ||||||
|  |           'wastArea': 22222, | ||||||
|  |           "yield": 0.9133 | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "first": 0.8838, | ||||||
|  |           "lineName": "Y65", | ||||||
|  |           "product": 0.8838, | ||||||
|  |           "productArea": 26554.32, | ||||||
|  |           "second": 0, | ||||||
|  |           'sumArea': 1111111, | ||||||
|  |           'wastArea': 22222, | ||||||
|  |           "yield": 0.9133 | ||||||
|  |         } | ||||||
|  |       ] | ||||||
|  |       this.coldDetData.forEach((ele, index) => { | ||||||
|  |         nameList.push(ele.lineName) | ||||||
|  |         topNameList.push('产线: ' + ele.lineName + '   ' + '总面积:' + ele.sumArea + '㎡') | ||||||
|  |         productList.push(ele.productArea) | ||||||
|  |         wasteList.push(ele.wastArea) | ||||||
|  |         nameWasteList.push('缺陷面积:' + this.NumFormat(ele.wastArea) + '㎡') | ||||||
|  |         // yieldList.push({ | ||||||
|  |         //   name: '良品', | ||||||
|  |         //   yield:ele.yield | ||||||
|  |         // }) | ||||||
|  |         sumAreaList.push(ele.sumArea) | ||||||
|  |         yieldList.push((ele.yield * 100).toFixed(0)) | ||||||
|  |       }) | ||||||
|  |       this.$nextTick(() => { | ||||||
|  |         this.$refs.productChart.initChart(nameList, yieldList, sumAreaList) | ||||||
|  |         this.$refs.firstPileChart.initChart(nameList, [topNameList[0]], [nameWasteList[0]], [productList[0]], [wasteList[0]]) | ||||||
|  |         this.$refs.secondPileChart.initChart(nameList, [topNameList[1]], [nameWasteList[1]], [productList[1]], [wasteList[1]]) | ||||||
|  |         this.$refs.thirdPileChart.initChart(nameList, [topNameList[2]], [nameWasteList[2]], [productList[2]], [wasteList[2]]) | ||||||
|  |         this.$refs.fourthPileChart.initChart(nameList, [topNameList[3]], [nameWasteList[3]], [productList[3]], [wasteList[3]]) | ||||||
|  |         this.$refs.fifthPileChart.initChart(nameList, [topNameList[4]], [nameWasteList[4]], [productList[4]], [wasteList[4]]) | ||||||
|  |       }) | ||||||
|  |     }, | ||||||
|  |     // getReaiData() { | ||||||
|  |     //   let detData = [ | ||||||
|  |     //     { | ||||||
|  |     //       name: '1', | ||||||
|  |     //       run: '运行', | ||||||
|  |     //     }, | ||||||
|  |     //     { | ||||||
|  |     //       name: '2', | ||||||
|  |     //       run: '未运行', | ||||||
|  |     //     }, | ||||||
|  |     //     { | ||||||
|  |     //       name: '3', | ||||||
|  |     //       run: '运行', | ||||||
|  |     //     }, | ||||||
|  |     //     { | ||||||
|  |     //       name: '4', | ||||||
|  |     //       run: '未运行', | ||||||
|  |     //     }, | ||||||
|  |     //     { | ||||||
|  |     //       name: '1', | ||||||
|  |     //       run: '运行', | ||||||
|  |     //     }, | ||||||
|  |     //   ] | ||||||
|  |     //   let arr = [] | ||||||
|  |     //   let index = 0 | ||||||
|  |     //   for (let i in detData) { | ||||||
|  |     //     index++, | ||||||
|  |     //       arr.push([ | ||||||
|  |     //         `<span style="color:rgba(255,255,255,0.5)" >${index || ''} | ||||||
|  |     //         </span>`, | ||||||
|  |     //         // `<span style="color:rgba(255,255,255,0.5)" >${i || ''} | ||||||
|  |     //         // </span>`, | ||||||
|  |     //         `<span style="color:rgba(255,255,255,0.5)">${i || ''}</span>`, | ||||||
|  |     //         `<span style="color:rgba(255,255,255,0.5)"><div style="${detData[i] == '运行' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:10px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%;  background-color: #FFBD02;float:left;margin:10px 10px 0 0 '}"></div>  ${detData[i] || ''}</span>`, | ||||||
|  |     //       ]) | ||||||
|  |     //   } | ||||||
|  |     //   // this.$nextTick(() => { | ||||||
|  |     //     this.annealFunConfig.data = arr | ||||||
|  |     //     this.$refs['annealFunScrollBoard'].updateRows(arr) | ||||||
|  |     //   // }) | ||||||
|  |     // }, | ||||||
|     // getData() { |     // getData() { | ||||||
|     //   let detData = [ |     //   let detData = [ | ||||||
|     //     { |     //     { | ||||||
| @@ -444,8 +502,10 @@ export default { | |||||||
|     //     `<span style="color:rgba(255,255,255,0.5)">${item.name || ''}</span>`, |     //     `<span style="color:rgba(255,255,255,0.5)">${item.name || ''}</span>`, | ||||||
|     //     `<span style="color:rgba(255,255,255,0.5)"><div style="${item.run == '运行' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:10px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%;  background-color: #FFBD02;float:left;margin:10px 10px 0 0 '}"></div>  ${item.run || ''}</span>`, |     //     `<span style="color:rgba(255,255,255,0.5)"><div style="${item.run == '运行' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:10px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%;  background-color: #FFBD02;float:left;margin:10px 10px 0 0 '}"></div>  ${item.run || ''}</span>`, | ||||||
|     //   ]) |     //   ]) | ||||||
|  |     //   // this.$nextTick(() => { | ||||||
|     //     this.realEqConfig.data = this.realEqList |     //     this.realEqConfig.data = this.realEqList | ||||||
|     //     this.$refs['realEqScrollBoard'].updateRows(this.realEqList) |     //     this.$refs['realEqScrollBoard'].updateRows(this.realEqList) | ||||||
|  |     //   //  }) | ||||||
|     // }, |     // }, | ||||||
|     CutWebsocketClose(e) { |     CutWebsocketClose(e) { | ||||||
|       this.Cutws.ws.onclose = (event) => { console.log(event );} |       this.Cutws.ws.onclose = (event) => { console.log(event );} | ||||||
| @@ -495,7 +555,7 @@ export default { | |||||||
|         seconds = "0" + seconds; |         seconds = "0" + seconds; | ||||||
|       } |       } | ||||||
|       //拼接格式化当前时间 |       //拼接格式化当前时间 | ||||||
|       this.times = year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds; |       this.times = year + "." + month + "." + day + " " + hours + ":" + minutes + ":" + seconds; | ||||||
|     }, |     }, | ||||||
|     SJGInitWebSocket() { |     SJGInitWebSocket() { | ||||||
|       let date = new Date().valueOf() |       let date = new Date().valueOf() | ||||||
| @@ -525,10 +585,9 @@ export default { | |||||||
|           ]) |           ]) | ||||||
|         } |         } | ||||||
|         this.realEqConfig.data = this.realEqList |         this.realEqConfig.data = this.realEqList | ||||||
|         this.$nextTick(() => { |         // this.$nextTick(() => { | ||||||
|           this.$refs['realEqScrollBoard'].updateRows(this.realEqList) |           this.$refs['realEqScrollBoard'].updateRows(this.realEqList) | ||||||
|  |         // }) | ||||||
|         }) |  | ||||||
|       }; |       }; | ||||||
|       // if (typeof (WebSocket) === 'undefined') { |       // if (typeof (WebSocket) === 'undefined') { | ||||||
|       //   alert('您的浏览器不支持WebSocket') |       //   alert('您的浏览器不支持WebSocket') | ||||||
| @@ -560,43 +619,52 @@ export default { | |||||||
|         this.cutWsData = event?.data ? JSON.parse(event?.data) : {} |         this.cutWsData = event?.data ? JSON.parse(event?.data) : {} | ||||||
|         if (this.cutWsData.type === 'cutting' && this.cutWsData.name === 'table') { |         if (this.cutWsData.type === 'cutting' && this.cutWsData.name === 'table') { | ||||||
|           let cutArr = this.cutWsData.productHourData.map((item, index) => [ |           let cutArr = this.cutWsData.productHourData.map((item, index) => [ | ||||||
|             `<span style="color:rgba(255,255,255,0.7)" >${index + 1 || ''} |             `<span style="color:rgba(255,255,255,0.5)" >${index + 1 || ''} | ||||||
|             </span>`, |             </span>`, | ||||||
|             `<span style="color:rgba(255,255,255,0.7)" >${item.lineName || ''} |             `<span style="color:rgba(255,255,255,0.5)" >${item.lineName || ''} | ||||||
|             </span>`, |             </span>`, | ||||||
|             `<span style="color:rgba(255,255,255,0.7)">${this.formatTime(item.time) || ''}</span>`, |             `<span style="color:rgba(255,255,255,0.5)">${this.formatTime(item.time) || ''}</span>`, | ||||||
|             `<span style="color:rgba(255,255,255,0.7)">${this.getSize(item.size) || ''}</span>`, |             `<span style="color:rgba(255,255,255,0.5)">${this.getSize(item.size) || ''}</span>`, | ||||||
|             `<span style="color:rgba(255,255,255,0.7)">${item.productArea + '㎡' || ''}</span>`, |             `<span style="color:rgba(255,255,255,0.5)">${this.NumFormat(item.productArea) + '㎡' || ''}</span>`, | ||||||
|             `<span style="color:rgba(255,255,255,0.7)">${item.wasteArea + '㎡' || ''}</span>`, |             `<span style="color:rgba(255,255,255,0.5)">${this.NumFormat(item.wasteArea) + '㎡' || ''}</span>`, | ||||||
|             `<div style = "${(item.product * 100).toFixed(2) > 91 ? 'display:block;color:#00FFF7' : 'display:none;'}">${(item.product * 100).toFixed(2) + '%' || ''}</div> |             `<div style = "${(item.product * 100).toFixed(0) >= 91 ? 'display:block;color:#00FFF7' : 'display:none;'}">${(item.product * 100).toFixed(0) + '%' || ''}</div> | ||||||
|            <div style = "${(item.product * 100).toFixed(2) < 91 ? 'display:block; color:rgba(255, 209, 96, 1)' : 'display:none;'}">${(item.product * 100).toFixed(2) + '%' || ''}</div>` |            <div style = "${(item.product * 100).toFixed(0) <= 91 ? 'display:block; color:rgba(255, 209, 96, 1)' : 'display:none;'}">${(item.product * 100).toFixed(2) + '%' || ''}</div>` | ||||||
|           ]) |           ]) | ||||||
|           this.cutConfig.data = cutArr |           this.cutConfig.data = cutArr | ||||||
|           this.$refs['cutScrollBoard'].updateRows(cutArr) |           // this.$nextTick(() => { | ||||||
|  |             this.$refs['cutScrollBoard'].updateRows(cutArr) | ||||||
|  |           // }) | ||||||
|  |           // this.cutConfig.data = cutArr | ||||||
|  |           // this.$refs['cutScrollBoard'].updateRows(cutArr) | ||||||
|         } else if (this.cutWsData.type === 'cutting' && this.cutWsData.name === 'chart' && this.cutWsData.dateType === 'day') { |         } else if (this.cutWsData.type === 'cutting' && this.cutWsData.name === 'chart' && this.cutWsData.dateType === 'day') { | ||||||
|           let nameList = [] |           if (this.cutWsData.coldDetData.length !== 0) { | ||||||
|           let nameWasteList = [] |             let nameList = [] | ||||||
|           let topNameList = [] |             let nameWasteList = [] | ||||||
|           let productList = [] |             let topNameList = [] | ||||||
|           let wasteList = [] |             let productList = [] | ||||||
|           let sumAreaList = [] |             let wasteList = [] | ||||||
|           let yieldList = [] |             let sumAreaList = [] | ||||||
|           // this.cutTableDataList = |             let yieldList = [] | ||||||
|           this.cutWsData.coldDetData.forEach((ele, index) => { |             this.coldDetData = this.cutWsData.coldDetData | ||||||
|             nameList.push(ele.lineName) |             // this.cutTableDataList = | ||||||
|             topNameList.push('产线: ' + ele.lineName + '   ' + '总面积:' + ele.sumArea) |             this.cutWsData.coldDetData.forEach((ele, index) => { | ||||||
|             productList.push(ele.productArea) |               nameList.push(ele.lineName) | ||||||
|             wasteList.push(ele.wastArea) |               topNameList.push('产线: ' + ele.lineName + '   ' + '总面积:' + ele.sumArea + '㎡') | ||||||
|             nameWasteList.push('缺陷面积:' + ele.wastArea) |               productList.push(ele.productArea) | ||||||
|             sumAreaList.push(ele.sumArea) |               wasteList.push(ele.wastArea) | ||||||
|             yieldList.push(parseFloat((ele.yield * 100).toFixed(3))) |               nameWasteList.push('缺陷面积:' + this.NumFormat(ele.wastArea) + '㎡') | ||||||
|           }) |               sumAreaList.push(ele.sumArea) | ||||||
|           this.$refs.firstPileChart.initChart(nameList, [topNameList[0]], [nameWasteList[0]], [productList[0]], [wasteList[0]]) |               yieldList.push(parseFloat((ele.yield * 100).toFixed(2))) | ||||||
|           this.$refs.secondPileChart.initChart(nameList, [topNameList[1]], [nameWasteList[1]], [productList[1]], [wasteList[1]]) |             }) | ||||||
|           this.$refs.thirdPileChart.initChart(nameList, [topNameList[0]], [nameWasteList[0]], [productList[0]], [wasteList[0]]) |             this.$nextTick(() => { | ||||||
|           this.$refs.fourthPileChart.initChart(nameList, [topNameList[0]], [nameWasteList[0]], [productList[0]], [wasteList[0]]) |               this.$refs.firstPileChart.initChart(nameList, [topNameList[0]], [nameWasteList[0]], [productList[0]], [wasteList[0]]) | ||||||
|           this.$refs.fifthPileChart.initChart(nameList, [topNameList[0]], [nameWasteList[0]], [productList[0]], [wasteList[0]]) |               this.$refs.secondPileChart.initChart(nameList, [topNameList[1]], [nameWasteList[1]], [productList[1]], [wasteList[1]]) | ||||||
|           this.$refs.productChart.initChart(nameList, yieldList, sumAreaList) |               this.$refs.thirdPileChart.initChart(nameList, [topNameList[2]], [nameWasteList[2]], [productList[2]], [wasteList[2]]) | ||||||
|  |               this.$refs.fourthPileChart.initChart(nameList, [topNameList[3]], [nameWasteList[3]], [productList[3]], [wasteList[3]]) | ||||||
|  |               this.$refs.fifthPileChart.initChart(nameList, [topNameList[4]], [nameWasteList[4]], [productList[4]], [wasteList[4]]) | ||||||
|  |               this.$refs.productChart.initChart(nameList, yieldList, sumAreaList) | ||||||
|  |             }) | ||||||
|  |           } | ||||||
|         } |         } | ||||||
|       }; |       }; | ||||||
|       // if (typeof (WebSocket) === 'undefined') { |       // if (typeof (WebSocket) === 'undefined') { | ||||||
| @@ -632,17 +700,18 @@ export default { | |||||||
|           for (let i in this.funWsData.data.annealFanInfo) { |           for (let i in this.funWsData.data.annealFanInfo) { | ||||||
|             index++, |             index++, | ||||||
|               arr.push([ |               arr.push([ | ||||||
|                 ` |                 `<span style="color:rgba(255,255,255,0.5)" >${index || ''} | ||||||
|           <span style="color:rgba(255,255,255,0.5)" >${index || ''} |  | ||||||
|             </span>`, |             </span>`, | ||||||
|                 `<span style="color:rgba(255,255,255,0.5)" >${i || ''} |                 // `<span style="color:rgba(255,255,255,0.5)" >${i || ''} | ||||||
|             </span>`, |                 // </span>`, | ||||||
|                 `<span style="color:rgba(255,255,255,0.5)">${item.name || ''}</span>`, |                 `<span style="color:rgba(255,255,255,0.5)">${i || ''}</span>`, | ||||||
|                 `<span style="color:rgba(255,255,255,0.5)"><div style="${item.run == '运行' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:10px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%;  background-color: #FFBD02;float:left;margin:10px 10px 0 0 '}"></div>  ${item.run || ''}</span>`, |                 `<span style="color:rgba(255,255,255,0.5)"><div style="${this.funWsData.data.annealFanInfo[i] == '运行' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:10px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%;  background-color: #FFBD02;float:left;margin:10px 10px 0 0 '}"></div>  ${this.funWsData.data.annealFanInfo[i] || ''}</span>`, | ||||||
|               ]) |               ]) | ||||||
|           } |           } | ||||||
|           this.annealFunConfig.data = arr |           this.annealFunConfig.data = arr | ||||||
|           this.$refs['annealFunScrollBoard'].updateRows(arr) |           // this.$nextTick(() => { | ||||||
|  |             this.$refs['annealFunScrollBoard'].updateRows(arr) | ||||||
|  |           // }) | ||||||
|         } |         } | ||||||
|         if (this.funWsData.type === 'FanInfo') { |         if (this.funWsData.type === 'FanInfo') { | ||||||
|           let arr = [] |           let arr = [] | ||||||
| @@ -650,14 +719,16 @@ export default { | |||||||
|           for (let i in this.funWsData.data.fanInfo) { |           for (let i in this.funWsData.data.fanInfo) { | ||||||
|             index++, |             index++, | ||||||
|               arr.push([ |               arr.push([ | ||||||
|                 `<span style="color:rgba(255,255,255,0.5)" >${index || ''}</span>`, |                 `<span style="color:rgba(255,255,255,0.5)" >${index || ''} | ||||||
|                 `<span style="color:rgba(255,255,255,0.5)" >${i || ''}</span>`, |             </span>`, | ||||||
|                 `<span style="color:rgba(255,255,255,0.5)">${item.name || ''}</span>`, |                 `<span style="color:rgba(255,255,255,0.5)">${i || ''}</span>`, | ||||||
|                 `<span style="color:rgba(255,255,255,0.5)"><div style="${item.run == '运行' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:10px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%;  background-color: #FFBD02;float:left;margin:10px 10px 0 0 '}"></div>  ${item.run || ''}</span>`, |                 `<span style="color:rgba(255,255,255,0.5)"><div style="${this.funWsData.data.fanInfo[i] == '运行' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:10px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%;  background-color: #FFBD02;float:left;margin:10px 10px 0 0 '}"></div>  ${this.funWsData.data.fanInfo[i] || ''}</span>`, | ||||||
|               ]) |               ]) | ||||||
|           } |           } | ||||||
|           this.funConfig.data = arr |           this.funConfig.data = arr | ||||||
|           this.$refs['funScrollBoard'].updateRows(arr) |           // this.$nextTick(() => { | ||||||
|  |             this.$refs['funScrollBoard'].updateRows(arr) | ||||||
|  |           // }) | ||||||
|         } |         } | ||||||
|       }; |       }; | ||||||
|       // if (typeof (WebSocket) === 'undefined') { |       // if (typeof (WebSocket) === 'undefined') { | ||||||
| @@ -678,6 +749,25 @@ export default { | |||||||
|       //   this.funWebsocket.onclose = this.funWebsocketClose |       //   this.funWebsocket.onclose = this.funWebsocketClose | ||||||
|       // } |       // } | ||||||
|     }, |     }, | ||||||
|  |     NumFormat(value) { | ||||||
|  |       if (!value) return '0.00' | ||||||
|  |       value = value.toFixed(2) | ||||||
|  |       var intPart = Math.trunc(value) // 获取整数部分 | ||||||
|  |       // var intPartFormat = intPart.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,') // 将整数部分逢三一断 | ||||||
|  |       var floatPart = '.00' // 预定义小数部分 | ||||||
|  |       var value2Array = value.split('.') | ||||||
|  |       // =2表示数据有小数位 | ||||||
|  |       if (value2Array.length === 2) { | ||||||
|  |         floatPart = value2Array[1].toString() // 拿到小数部分 | ||||||
|  |         if (floatPart.length === 1) { | ||||||
|  |           return intPart + '.' + floatPart + '0' | ||||||
|  |         } else { | ||||||
|  |           return intPart + '.' + floatPart | ||||||
|  |         } | ||||||
|  |       } else { | ||||||
|  |         return intPart + floatPart | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     // funWebsocketOnOpen() { |     // funWebsocketOnOpen() { | ||||||
|     //   console.log('socket连接成功') |     //   console.log('socket连接成功') | ||||||
|     //   this.SJGWebsocket.onmessage() |     //   this.SJGWebsocket.onmessage() | ||||||
| @@ -772,7 +862,47 @@ export default { | |||||||
| </script> | </script> | ||||||
|  |  | ||||||
| <style lang="scss" scoped> | <style lang="scss" scoped> | ||||||
|  | .myLegend{ | ||||||
|  |   position: absolute; | ||||||
|  |   top: -20px; | ||||||
|  |   right: 20px; | ||||||
|  |   font-size: 12px; | ||||||
|  |   color: rgba(255,255,255,.6); | ||||||
|  |   .barLegend{ | ||||||
|  |     // float: left; | ||||||
|  |     background: linear-gradient(#9DD5FF, #1295FF); | ||||||
|  |     width: 10px; | ||||||
|  |     height: 10px; | ||||||
|  |     display: inline-block; | ||||||
|  |     margin-right: 5px; | ||||||
|  |     border-radius: 30%; | ||||||
|  |   } | ||||||
|  |   .barText{ | ||||||
|  |     // float: right; | ||||||
|  |     display: inline-block; | ||||||
|  |     margin-right: 10px; | ||||||
|  |   } | ||||||
|  |   .barCircleLegend{ | ||||||
|  |     width: 15px; | ||||||
|  |     height: 1px; | ||||||
|  |     background-color: rgba(255, 209, 96, 1); | ||||||
|  |     position: absolute; | ||||||
|  |     left: -4.1715px; | ||||||
|  |     top: 21.7px; | ||||||
|  |   } | ||||||
|  |   .barCircle{ | ||||||
|  |     width: 6px; | ||||||
|  |     height: 6px; | ||||||
|  |     border-radius: 50%; | ||||||
|  |     background-color: rgba(255, 209, 96, 1); | ||||||
|  |     display: inline-block; | ||||||
|  |     margin-right: 10px; | ||||||
|  |     margin-bottom: 1.7px; | ||||||
|  |   } | ||||||
|  |   .barCircleText{ | ||||||
|  |     display: inline-block; | ||||||
|  |   } | ||||||
|  | } | ||||||
| .visual-container { | .visual-container { | ||||||
|   width: 1920px; |   width: 1920px; | ||||||
|   height: 1080px; |   height: 1080px; | ||||||
| @@ -794,7 +924,7 @@ export default { | |||||||
|       top: 25px; |       top: 25px; | ||||||
|       color: rgba(255, 255, 255, 0.80); |       color: rgba(255, 255, 255, 0.80); | ||||||
|       font-size: 20px; |       font-size: 20px; | ||||||
|       letter-spacing: 0px; |       letter-spacing: 1px; | ||||||
|       } |       } | ||||||
|  |  | ||||||
|     .time { |     .time { | ||||||
| @@ -803,7 +933,7 @@ export default { | |||||||
|       color: rgba(255, 255, 255, 0.80); |       color: rgba(255, 255, 255, 0.80); | ||||||
|       top: 25px; |       top: 25px; | ||||||
|       font-size: 20px; |       font-size: 20px; | ||||||
|       letter-spacing: 0px; |       letter-spacing: .72px; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     .title-button { |     .title-button { | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| <!-- | <!-- | ||||||
|  * @Author: zhp |  * @Author: zhp | ||||||
|  * @Date: 2024-01-29 13:45:56 |  * @Date: 2024-01-29 13:45:56 | ||||||
|  * @LastEditTime: 2024-03-13 08:58:01 |  * @LastEditTime: 2024-04-24 15:48:32 | ||||||
|  * @LastEditors: zhp |  * @LastEditors: zhp | ||||||
|  * @Description: |  * @Description: | ||||||
| --> | --> | ||||||
| @@ -13,6 +13,7 @@ | |||||||
| </template> | </template> | ||||||
|  |  | ||||||
| <script> | <script> | ||||||
|  | import { position } from '@antv/x6-common/lib/dom/position'; | ||||||
| import * as echarts from 'echarts'; | import * as echarts from 'echarts'; | ||||||
| // import resize from './../mixins/resize' | // import resize from './../mixins/resize' | ||||||
| // import NotMsg from './../components/NotMsg' | // import NotMsg from './../components/NotMsg' | ||||||
| @@ -26,7 +27,7 @@ export default { | |||||||
| 		return { | 		return { | ||||||
| 			chart: null, | 			chart: null, | ||||||
| 			// notMsg:true, | 			// notMsg:true, | ||||||
| 			colors:['#2760ff', '#518eec', '#0ee8e4', '#ddb523'], |       colors: ['#2760ff', '#518eec', '#49FBD6', '#ddb523'], | ||||||
| 			chartData: [] | 			chartData: [] | ||||||
| 		}; | 		}; | ||||||
| 	}, | 	}, | ||||||
| @@ -45,8 +46,49 @@ export default { | |||||||
| 				this.$emit('emitFun') | 				this.$emit('emitFun') | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	}, |   }, | ||||||
| 	methods: { |   mounted() { | ||||||
|  |     this.chartData = [ | ||||||
|  |       { | ||||||
|  |         name: '0904褶皱/严重', | ||||||
|  |         num: 1112, | ||||||
|  |         yield: 0.97, | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         name: '0904褶皱/严重', | ||||||
|  |         num: 1112, | ||||||
|  |         yield: 0.97, | ||||||
|  |       }, | ||||||
|  |        { | ||||||
|  |          name: '0904褶皱/严重', | ||||||
|  |         num: 1112, | ||||||
|  |         yield: 0.97, | ||||||
|  |       }, | ||||||
|  |        { | ||||||
|  |          name: '0904褶皱/严重', | ||||||
|  |         num: 1112, | ||||||
|  |         yield: 0.97, | ||||||
|  |       } | ||||||
|  |     ] | ||||||
|  |     this.updateChart() | ||||||
|  |   }, | ||||||
|  |   methods: { | ||||||
|  |     getEqualNewlineString(params, length) { | ||||||
|  |       let text = '' | ||||||
|  |       let count = Math.ceil(params.length / length) // 向上取整数 | ||||||
|  |       // 一行展示length个 | ||||||
|  |       if (count > 1) { | ||||||
|  |         for (let z = 1; z <= count; z++) { | ||||||
|  |           text += params.substr((z - 1) * length, length) | ||||||
|  |           if (z < count) { | ||||||
|  |             text += '\n' | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } else { | ||||||
|  |         text += params.substr(0, length) | ||||||
|  |       } | ||||||
|  |       return text | ||||||
|  |     }, | ||||||
| 		updateChart() { | 		updateChart() { | ||||||
| 			console.log('update') | 			console.log('update') | ||||||
| 			let num = 0 | 			let num = 0 | ||||||
| @@ -71,7 +113,7 @@ export default { | |||||||
| 				color:this.colors, | 				color:this.colors, | ||||||
| 				title:{ | 				title:{ | ||||||
| 					text: num, | 					text: num, | ||||||
| 					subtext: '总数', | 					subtext: '总数/个', | ||||||
| 					top: '32%', | 					top: '32%', | ||||||
| 					left: '49%', | 					left: '49%', | ||||||
| 					textAlign: 'center', | 					textAlign: 'center', | ||||||
| @@ -83,45 +125,77 @@ export default { | |||||||
| 						fontSize: 20, | 						fontSize: 20, | ||||||
| 						color: '#fff00', | 						color: '#fff00', | ||||||
| 					}, | 					}, | ||||||
| 				}, |         }, | ||||||
| 				legend: { |         grid: { | ||||||
| 					bottom: '10%', |           left: '1%', | ||||||
| 					left: 'center', |           right: '1%', | ||||||
| 					itemWidth: 12, |           bottom: '0', | ||||||
| 					itemHeight:12, |           containLabel: true | ||||||
|           icon: 'rect', |         }, | ||||||
| 					textStyle: { | 				// legend: { | ||||||
| 						color: '#fff' | 				// 	bottom: '10%', | ||||||
| 					}, | 				// 	left: 'center', | ||||||
| 					data:this.chartData && this.chartData.length > 0 && this.chartData.map((item,index)=>({ | 				// 	itemWidth: 12, | ||||||
| 						name:item.name, | 				// 	itemHeight:12, | ||||||
| 						itemStyle:{ |         //   icon: 'roundRect', | ||||||
| 							color: this.colors[index%4] | 				// 	textStyle: { | ||||||
| 						} | 				// 		color: '#fff' | ||||||
| 					})) | 				// 	}, | ||||||
| 				}, | 				// 	data:this.chartData && this.chartData.length > 0 && this.chartData.map((item,index)=>({ | ||||||
|  | 				// 		name:item.name, | ||||||
|  | 				// 		itemStyle:{ | ||||||
|  | 				// 			color: this.colors[index%4] | ||||||
|  | 				// 		} | ||||||
|  | 				// 	})) | ||||||
|  | 				// }, | ||||||
| 				series:[{ | 				series:[{ | ||||||
| 						name: 'ISRA缺陷检测', | 						name: 'ISRA缺陷检测', | ||||||
| 						type: 'pie', |             type: 'pie', | ||||||
|  |             // position:outerHeight, | ||||||
| 						center: ['50%', '40%'], | 						center: ['50%', '40%'], | ||||||
| 						radius: ['45%', '70%'], | 						radius: ['45%', '70%'], | ||||||
| 						avoidLabelOverlap: true, | 						avoidLabelOverlap: true, | ||||||
| 						label: { |           label: { | ||||||
| 							show: false |             show: true, | ||||||
|  |             normal: { | ||||||
|  |               alignTo: 'labelLine', | ||||||
|  |               margin: 10, | ||||||
|  |               edgeDistance: 10, | ||||||
|  |               lineHeight: 16, | ||||||
|  |               // 各分区的提示内容 | ||||||
|  |               // params: 即下面传入的data数组,通过自定义函数,展示你想要的内容和格式 | ||||||
|  |               formatter: function (params) { | ||||||
|  |                 console.log(params); | ||||||
|  |                 return ; | ||||||
|  |               }, | ||||||
|  |               formatter: (params) => { | ||||||
|  |                 //调用自定义显示格式 | ||||||
|  |                 return this.getEqualNewlineString(params.value + " | " + params.percent.toFixed(0) + "%"); | ||||||
|  |               }, | ||||||
|  |               textStyle: {            // 提示文字的样式 | ||||||
|  |                 // color: '#595959', | ||||||
|  |                 fontSize: 16 | ||||||
|  |               } | ||||||
|  |             } | ||||||
| 						}, | 						}, | ||||||
| 						labelLine: { | 						labelLine: { | ||||||
| 							show: true, |               show: true, | ||||||
|  |               length: 25, | ||||||
|  |               length2: 10, | ||||||
| 						}, | 						}, | ||||||
| 						data: this.chartData && this.chartData.length > 0 && this.chartData.map((item, index) => ({ | 						data: this.chartData && this.chartData.length > 0 && this.chartData.map((item, index) => ({ | ||||||
| 						name:item.name, | 						name:item.name, | ||||||
| 						value: item.num, |             value: item.num, | ||||||
|  |             label: { | ||||||
|  |               color: this.colors[index % 4] | ||||||
|  |             }, | ||||||
| 						itemStyle:{ | 						itemStyle:{ | ||||||
| 							color:{ | 							color:{ | ||||||
| 								type: 'linear', | 								type: 'linear', | ||||||
| 								x: 1, | 								x: 0, | ||||||
| 								y: 1, | 								y: 0, | ||||||
| 								x2: 0, | 								x2: 0, | ||||||
| 								y2: 0, | 								y2: 1, | ||||||
| 								global: false, | 								global: false, | ||||||
| 								colorStops:[ | 								colorStops:[ | ||||||
| 									{offset: 0,color: this.colors[index%4]}, | 									{offset: 0,color: this.colors[index%4]}, | ||||||
| @@ -145,15 +219,19 @@ export default { | |||||||
| .isra-chart { | .isra-chart { | ||||||
| 	width: 100%; | 	width: 100%; | ||||||
| 	height: 100%; | 	height: 100%; | ||||||
|  |   position: absolute; | ||||||
|  |   top: 7%; | ||||||
| } | } | ||||||
|  |     .isra-chart-tooltip { | ||||||
|  |       background: #0a2b4f77 !important; | ||||||
|  |       border: none !important; | ||||||
|  |       backdrop-filter: blur(12px); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     .isra-chart-tooltip * { | ||||||
|  |       color: #fff !important; | ||||||
|  |     } | ||||||
| </style> | </style> | ||||||
| <style> | <style> | ||||||
|   .isra-chart-tooltip { |  | ||||||
|     background: #0a2b4f77 !important; |  | ||||||
|     border: none !important; |  | ||||||
|     backdrop-filter: blur(12px); |  | ||||||
|   } |  | ||||||
|   .isra-chart-tooltip * { |  | ||||||
|     color: #fff !important; |  | ||||||
|   } |  | ||||||
| </style> | </style> | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  * @Author: zwq |  * @Author: zwq | ||||||
|  * @Date: 2022-01-21 14:43:06 |  * @Date: 2022-01-21 14:43:06 | ||||||
|  * @LastEditors: zhp |  * @LastEditors: zhp | ||||||
|  * @LastEditTime: 2024-03-28 16:45:24 |  * @LastEditTime: 2024-04-03 16:33:24 | ||||||
|  * @Description: |  * @Description: | ||||||
| --> | --> | ||||||
| <template> | <template> | ||||||
| @@ -85,7 +85,6 @@ export default { | |||||||
|       defaultConfig: { |       defaultConfig: { | ||||||
|         // 默认的legend配置 |         // 默认的legend配置 | ||||||
|         legend: { |         legend: { | ||||||
|           orient: 'vertical', |  | ||||||
|           left: '75%', |           left: '75%', | ||||||
|           bottom: 0, |           bottom: 0, | ||||||
|           itemHeight: 10, |           itemHeight: 10, | ||||||
| @@ -158,6 +157,9 @@ export default { | |||||||
|   methods: { |   methods: { | ||||||
|     initChart() { |     initChart() { | ||||||
|       this.chart = echarts.init(document.getElementById(this.id)) |       this.chart = echarts.init(document.getElementById(this.id)) | ||||||
|  |       this.$nextTick(() => { | ||||||
|  |         this.chart.resize(); | ||||||
|  |       }); | ||||||
|       this.chart.setOption({ |       this.chart.setOption({ | ||||||
|         title: this.showCenterTitle |         title: this.showCenterTitle | ||||||
|           ? { |           ? { | ||||||
| @@ -194,7 +196,7 @@ export default { | |||||||
|           // 默认配置 |           // 默认配置 | ||||||
|           ...this.defaultConfig.legend, |           ...this.defaultConfig.legend, | ||||||
|           // 外部传入配置 |           // 外部传入配置 | ||||||
|           ...this.legendConfig |           // ...this.legendConfig | ||||||
|         }, |         }, | ||||||
|         color: this.barColor, |         color: this.barColor, | ||||||
|         series: [ |         series: [ | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  * @Author: gtz |  * @Author: gtz | ||||||
|  * @Date: 2022-01-19 15:58:17 |  * @Date: 2022-01-19 15:58:17 | ||||||
|  * @LastEditors: zhp |  * @LastEditors: zhp | ||||||
|  * @LastEditTime: 2024-03-27 10:26:35 |  * @LastEditTime: 2024-04-22 09:41:21 | ||||||
|  * @Description: file content |  * @Description: file content | ||||||
|  * @FilePath: \mt-bus-fe\src\views\OperationalOverview\components\baseContainer\index.vue |  * @FilePath: \mt-bus-fe\src\views\OperationalOverview\components\baseContainer\index.vue | ||||||
| --> | --> | ||||||
| @@ -30,7 +30,7 @@ | |||||||
|         <!-- <span v-if="showTime" style="font-size: 20px;color:#52FFF8;margin-left: 10px;margin-top: 2px;"> |         <!-- <span v-if="showTime" style="font-size: 20px;color:#52FFF8;margin-left: 10px;margin-top: 2px;"> | ||||||
|           {{ time2 +'-'+ time }} |           {{ time2 +'-'+ time }} | ||||||
|         </span> --> |         </span> --> | ||||||
|         <span  style="font-size: 20px;color:#52FFF8;margin-left: 10px;margin-top: 2px;"> |         <span v-if="showTime"  style="font-size: 20px;color:#52FFF8;margin-left: 10px;margin-top: 2px;"> | ||||||
|           {{ startTime + '-' + endTime }} |           {{ startTime + '-' + endTime }} | ||||||
|         </span> |         </span> | ||||||
|       </div> |       </div> | ||||||
| @@ -56,6 +56,10 @@ export default { | |||||||
|       type: Boolean, |       type: Boolean, | ||||||
|       default: true |       default: true | ||||||
|     }, |     }, | ||||||
|  |     showTime: { | ||||||
|  |       type: Boolean, | ||||||
|  |       default: true | ||||||
|  |     }, | ||||||
|     noPadding: { |     noPadding: { | ||||||
|       type: Boolean, |       type: Boolean, | ||||||
|       default: false |       default: false | ||||||
| @@ -164,7 +168,7 @@ export default { | |||||||
|   width: 100%; |   width: 100%; | ||||||
|   // background-color: rgba($color: #061027, $alpha: 0.15); |   // background-color: rgba($color: #061027, $alpha: 0.15); | ||||||
|   position: relative; |   position: relative; | ||||||
|   opacity: calc(.8); |   // opacity: calc(.8); | ||||||
|   // border: 2px solid; |   // border: 2px solid; | ||||||
|     // background: url('../../../../assets/img/energy.png') no-repeat; |     // background: url('../../../../assets/img/energy.png') no-repeat; | ||||||
|     // background-size: 100% 100%; |     // background-size: 100% 100%; | ||||||
| @@ -274,6 +278,8 @@ export default { | |||||||
|     width: 100%; |     width: 100%; | ||||||
|     color: #ffffff; |     color: #ffffff; | ||||||
|     font-size: 24px; |     font-size: 24px; | ||||||
|  |     font-weight: normal; | ||||||
|  |     letter-spacing: .8px; | ||||||
|     padding: 0.67em 0.67em 0.3em 0.67em; |     padding: 0.67em 0.67em 0.3em 0.67em; | ||||||
|     display: flex; |     display: flex; | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -2,13 +2,13 @@ | |||||||
| <!-- | <!-- | ||||||
|  * @Author: zhp |  * @Author: zhp | ||||||
|  * @Date: 2023-09-21 09:06:28 |  * @Date: 2023-09-21 09:06:28 | ||||||
|  * @LastEditTime: 2024-03-25 18:34:58 |  * @LastEditTime: 2024-04-23 15:34:56 | ||||||
|  * @LastEditors: zhp |  * @LastEditors: zhp | ||||||
|  * @Description: |  * @Description: | ||||||
| --> | --> | ||||||
| <template> | <template> | ||||||
|   <div> |   <div> | ||||||
|     <div :id="id" class="productChart" :style="{ height:   '390px', width: width }" /> |     <div :id="id" class="coldProductChart" :style="{ height:   '390px', width: width }" /> | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| @@ -71,9 +71,9 @@ export default { | |||||||
|   mounted() { |   mounted() { | ||||||
|     console.log('mounted') |     console.log('mounted') | ||||||
|     console.log('borderRadius: ', this.borderRadius) |     console.log('borderRadius: ', this.borderRadius) | ||||||
|     // this.$nextTick(() => { |     this.$el.addEventListener('resize', () => { | ||||||
|     //   this.initChart() |       console.log('resziing.....'); | ||||||
|     // }) |     }); | ||||||
|   }, |   }, | ||||||
|   beforeDestroy() { |   beforeDestroy() { | ||||||
|     if (!this.chart) { |     if (!this.chart) { | ||||||
| @@ -83,6 +83,9 @@ export default { | |||||||
|     this.chart = null |     this.chart = null | ||||||
|   }, |   }, | ||||||
|   methods: { |   methods: { | ||||||
|  |     // getNumLength(num) { | ||||||
|  |     //   return num.toString().length; | ||||||
|  |     // }, | ||||||
|     initChart(nameList, passRateList, outputNumList) { |     initChart(nameList, passRateList, outputNumList) { | ||||||
|       console.log(nameList, passRateList) |       console.log(nameList, passRateList) | ||||||
|      let  series= [ |      let  series= [ | ||||||
| @@ -97,11 +100,12 @@ export default { | |||||||
|                { offset: 0.3, color: '#1295FF' } |                { offset: 0.3, color: '#1295FF' } | ||||||
|              ]), |              ]), | ||||||
|              label: { |              label: { | ||||||
|                show: true,		//开启显示 |                show: false,		//开启显示 | ||||||
|                position: 'top',	//在上方显示 |                position: 'top',	//在上方显示 | ||||||
|                textStyle: {	    //数值样式 |                textStyle: {	    //数值样式 | ||||||
|                  color: '#ced1d5', |                  color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|                  fontSize: 12 |                  fontSize: 12, | ||||||
|  |                  fontWight: 'bolder' | ||||||
|                } |                } | ||||||
|              }, |              }, | ||||||
|             } |             } | ||||||
| @@ -114,6 +118,7 @@ export default { | |||||||
|           name: '产线良品率', |           name: '产线良品率', | ||||||
|           symbol: 'circle', //变为实心圆 |           symbol: 'circle', //变为实心圆 | ||||||
|           type: 'line', |           type: 'line', | ||||||
|  |           // symbolSize: 7, | ||||||
|           yAxisIndex: 0, |           yAxisIndex: 0, | ||||||
|           areaStyle: { |           areaStyle: { | ||||||
|             opacity: 0.8, |             opacity: 0.8, | ||||||
| @@ -141,9 +146,21 @@ export default { | |||||||
|       ] |       ] | ||||||
|       // const colors = ['#5470C6', '#91CC75', '#EE6666'] |       // const colors = ['#5470C6', '#91CC75', '#EE6666'] | ||||||
|       this.chart = echarts.init(document.getElementById(this.id)) |       this.chart = echarts.init(document.getElementById(this.id)) | ||||||
|  |       let isFinished = false //标记 isFinished | ||||||
|  |       this.chart.on('finished', _ => { | ||||||
|  |         if (!isFinished) { | ||||||
|  |           console.log('我只执行一次') | ||||||
|  |           isFinished = true | ||||||
|  |           // this.isLoading = false //关闭loading | ||||||
|  |           this.chart.resize() //重新渲染charts大小 | ||||||
|  |         } | ||||||
|  |         console.log(113, 'finished') | ||||||
|  |       }) | ||||||
|       this.chart.setOption({ |       this.chart.setOption({ | ||||||
|         // color: colors, |         // color: colors, | ||||||
|         tooltip: { |         tooltip: { | ||||||
|  |           trigger: 'item', | ||||||
|  |           className: "isra-chart-tooltip", | ||||||
|           trigger: 'axis', |           trigger: 'axis', | ||||||
|           axisPointer: { |           axisPointer: { | ||||||
|             type: 'cross' |             type: 'cross' | ||||||
| @@ -151,38 +168,50 @@ export default { | |||||||
|         }, |         }, | ||||||
|         grid: { |         grid: { | ||||||
|           left: "3%", |           left: "3%", | ||||||
|           right: "5%", |           right: "10%", | ||||||
|           bottom: "3%", |           bottom: "3%", | ||||||
|           containLabel: true |           containLabel: true | ||||||
|         }, |         }, | ||||||
|         legend: { |         // legend: { | ||||||
|           itemWidth: 10, |         //   itemWidth: 10, | ||||||
|           itemHeight: 10, |         //   itemHeight: 10, | ||||||
|           top: '20', |         //   top: '5', | ||||||
|           // right: '20px', |         //   right: '20px', | ||||||
|           data: ['产线产量', '产线良品率'], |         //   data: [ | ||||||
|           textStyle: { |         //     // { icon: 'rect', name: '直接访问' }, | ||||||
|             fontSize: 12 * this.beilv, |         //     { icon: 'roundRect', name: '产线产量' }, | ||||||
|             color: '#ced1d5' |         //     // { | ||||||
|           } |         //     //   icon: 'circle', name: '产线良品率', | ||||||
|         }, |         //     //   itemWidth: 7, | ||||||
|  |         //     //   itemHeight: 7, | ||||||
|  |         //     //  }, | ||||||
|  |         //   ], | ||||||
|  |         //   textStyle: { | ||||||
|  |         //     fontSize: 12 * this.beilv, | ||||||
|  |         //     color: '#ced1d5' | ||||||
|  |         //   } | ||||||
|  |         // }, | ||||||
|         xAxis: { |         xAxis: { | ||||||
|  |           axisTick: { | ||||||
|  |             show: false | ||||||
|  |           }, | ||||||
|           type: 'category', |           type: 'category', | ||||||
|           axisLine: { |           axisLine: { | ||||||
|             lineStyle: { |             lineStyle: { | ||||||
|               type: 'solid', |               type: 'solid', | ||||||
|               color: '#213259', // 左边线的颜色 |               color: '#25528f', // 左边线的颜色 | ||||||
|               width: '1' // 坐标线的宽度 |               width: '1' // 坐标线的宽度 | ||||||
|             } |             } | ||||||
|           }, |           }, | ||||||
|           axisLabel: { |           axisLabel: { | ||||||
|             textStyle: { |             textStyle: { | ||||||
|  |               align: 'center', | ||||||
|               color: 'rgba(255,255,255,0.5)' // 坐标值得具体的颜色 |               color: 'rgba(255,255,255,0.5)' // 坐标值得具体的颜色 | ||||||
|             } |             } | ||||||
|           }, |           }, | ||||||
|           splitLine: { |           splitLine: { | ||||||
|             lineStyle: { |             lineStyle: { | ||||||
|               color: '#213259' |               color: '#25528f' | ||||||
|             } |             } | ||||||
|           }, |           }, | ||||||
|           data: nameList |           data: nameList | ||||||
| @@ -192,18 +221,21 @@ export default { | |||||||
|         // }, |         // }, | ||||||
|         yAxis: [ |         yAxis: [ | ||||||
|           { |           { | ||||||
|             min: function() { // 取最小值向下取整为最小刻度 |             min: function () { // 取最小值向下取整为最小刻度 | ||||||
|               return 0 |               return 0 | ||||||
|             }, |             }, | ||||||
|             max: function(value) { // 取最大值向上取整为最大刻度 |             max: function (value) { // 取最大值向上取整为最大刻度 | ||||||
|               return Math.ceil(value.max) |  | ||||||
|             }, |             }, | ||||||
|             scale: true, |             scale: true, | ||||||
|             type: 'value', |             type: 'value', | ||||||
|             name: '良品率/%', |             name: '良品率/%', | ||||||
|  |             max: 100,//最大值 | ||||||
|  |             min: 0,//最小值 | ||||||
|  |             interval: 20,//间隔 | ||||||
|             nameTextStyle: {// y轴上方单位的颜色 |             nameTextStyle: {// y轴上方单位的颜色 | ||||||
|               color: '#fff', |               color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|               align: "left", |               align: "left", | ||||||
|  |               padding: [0, 0, 0, 8] | ||||||
|             }, |             }, | ||||||
|             position: 'right', |             position: 'right', | ||||||
|             alignTicks: true, |             alignTicks: true, | ||||||
| @@ -211,19 +243,20 @@ export default { | |||||||
|               show: true, |               show: true, | ||||||
|               lineStyle: { |               lineStyle: { | ||||||
|                 type: 'solid', |                 type: 'solid', | ||||||
|                 color: '#213259', // 左边线的颜色 |                 color: '#25528f', // 左边线的颜色 | ||||||
|                 width: '1' // 坐标线的宽度 |                 width: '1' // 坐标线的宽度 | ||||||
|               } |               } | ||||||
|             }, |             }, | ||||||
|             axisLabel: { |             axisLabel: { | ||||||
|               textStyle: { |               textStyle: { | ||||||
|                 color: '#ced1d5', // 坐标值得具体的颜色 |                 color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|                 formatter: '{value}%' |                 formatter: '{value}%', | ||||||
|  |                 align:'left', | ||||||
|               } |               } | ||||||
|             }, |             }, | ||||||
|             splitLine: { |             splitLine: { | ||||||
|               lineStyle: { |               lineStyle: { | ||||||
|                 color: '#213259' |                 color: '#25528f' | ||||||
|               } |               } | ||||||
|             } |             } | ||||||
|             // type: 'value' |             // type: 'value' | ||||||
| @@ -235,19 +268,25 @@ export default { | |||||||
|             // }, |             // }, | ||||||
|           }, |           }, | ||||||
|           { |           { | ||||||
|             min: function() { // 取最小值向下取整为最小刻度 |             min: function () { // 取最小值向下取整为最小刻度 | ||||||
|               return 0 |               return 0 | ||||||
|             }, |             }, | ||||||
|             max: function(value) { // 取最大值向上取整为最大刻度 |             max: function (value) { // 取最大值向上取整为最大刻度 | ||||||
|               return Math.ceil(value.max) |  | ||||||
|  |               // console.log(value.max.toString().length) | ||||||
|  |               // String(value.max)[0] | ||||||
|  |               // for | ||||||
|  |               // return String(value.max)[0] + | ||||||
|             }, |             }, | ||||||
|  |             minInterval: 5,//间隔 | ||||||
|             scale: true, |             scale: true, | ||||||
|             type: 'value', |             type: 'value', | ||||||
|             name: '产量/㎡', // y轴上方的单位 |             name: '产量/㎡', // y轴上方的单位 | ||||||
|             nameTextStyle: { |             nameTextStyle: { | ||||||
|               color: "#fff", |               color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|               // fontSize: 10, |               // fontSize: 10, | ||||||
|               align: "right", |               align: "right", | ||||||
|  |               padding:[0,4,0,0] | ||||||
|             }, |             }, | ||||||
|             position: 'left', |             position: 'left', | ||||||
|             alignTicks: true, |             alignTicks: true, | ||||||
| @@ -255,19 +294,21 @@ export default { | |||||||
|               show: true, |               show: true, | ||||||
|               lineStyle: { |               lineStyle: { | ||||||
|                 type: 'solid', |                 type: 'solid', | ||||||
|                 color: '#213259', // 左边线的颜色 |                 color: '#25528f', // 左边线的颜色 | ||||||
|                 width: '1' // 坐标线的宽度 |                 width: '1' // 坐标线的宽度 | ||||||
|               } |               } | ||||||
|             }, |             }, | ||||||
|             axisLabel: { |             axisLabel: { | ||||||
|  |               // padding: [0, 20, 0, 0], | ||||||
|               textStyle: { |               textStyle: { | ||||||
|  |                 margin: 60, | ||||||
|                 color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 |                 color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|                 formatter: '{value} 片' |                 formatter: '{value} 片' | ||||||
|               } |               } | ||||||
|             }, |             }, | ||||||
|             splitLine: { |             splitLine: { | ||||||
|               lineStyle: { |               lineStyle: { | ||||||
|                 color: '#213259' |                 color: '#25528f' | ||||||
|               } |               } | ||||||
|             } |             } | ||||||
|             // type: 'value' |             // type: 'value' | ||||||
| @@ -286,7 +327,16 @@ export default { | |||||||
| } | } | ||||||
| </script> | </script> | ||||||
| <style> | <style> | ||||||
| .productChart{ | .coldProductChart{ | ||||||
|   top: -10px; |   top: -10px; | ||||||
| } | } | ||||||
|  | .isra-chart-tooltip { | ||||||
|  |   background: #0a2b4f77 !important; | ||||||
|  |   border: none !important; | ||||||
|  |   backdrop-filter: blur(12px); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  .isra-chart-tooltip * { | ||||||
|  |   color: #fff !important; | ||||||
|  |   } | ||||||
| </style> | </style> | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| <!-- | <!-- | ||||||
|  * @Author: zhp |  * @Author: zhp | ||||||
|  * @Date: 2023-09-21 09:06:28 |  * @Date: 2023-09-21 09:06:28 | ||||||
|  * @LastEditTime: 2024-03-28 16:31:20 |  * @LastEditTime: 2024-04-23 15:36:35 | ||||||
|  * @LastEditors: zhp |  * @LastEditors: zhp | ||||||
|  * @Description: |  * @Description: | ||||||
| --> | --> | ||||||
| @@ -105,8 +105,9 @@ export default { | |||||||
|                show: true,		//开启显示 |                show: true,		//开启显示 | ||||||
|                position: 'top',	//在上方显示 |                position: 'top',	//在上方显示 | ||||||
|                textStyle: {	    //数值样式 |                textStyle: {	    //数值样式 | ||||||
|                  color: '#ced1d5', |                  color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|                  fontSize: 12 |                  fontSize: 12, | ||||||
|  |                  fontWight:'bolder' | ||||||
|                } |                } | ||||||
|              }, |              }, | ||||||
|             } |             } | ||||||
| @@ -142,7 +143,7 @@ export default { | |||||||
|             } |             } | ||||||
|           }, |           }, | ||||||
|           // data: passRateList |           // data: passRateList | ||||||
|           data: [] |           data: passRateList | ||||||
|         } |         } | ||||||
|       ] |       ] | ||||||
|       // const colors = ['#5470C6', '#91CC75', '#EE6666'] |       // const colors = ['#5470C6', '#91CC75', '#EE6666'] | ||||||
| @@ -161,24 +162,30 @@ export default { | |||||||
|         this.chart.setOption({ |         this.chart.setOption({ | ||||||
|           // color: colors, |           // color: colors, | ||||||
|           tooltip: { |           tooltip: { | ||||||
|  |             trigger: 'item', | ||||||
|  |             className: "isra-chart-tooltip", | ||||||
|             trigger: 'axis', |             trigger: 'axis', | ||||||
|             axisPointer: { |             axisPointer: { | ||||||
|               type: 'cross' |               type: 'cross' | ||||||
|             } |             } | ||||||
|           }, |           }, | ||||||
|           grid: { top: 90, right: 60, bottom: 20, left: 20, containLabel: true }, |           grid: { top: 70, right: 20, bottom: 10, left: 10, containLabel: true }, | ||||||
|           legend: { |           // legend: { | ||||||
|             itemWidth: 10, |           //   itemWidth: 10, | ||||||
|             itemHeight: 10, |           //   itemHeight: 10, | ||||||
|             top: '0%', |           //   top: '2%', | ||||||
|             right: '20px', |           //   right: '30px', | ||||||
|             data: ['产线产量', '产线良品率'], |           //   data: ['产线良品率', '产线产量'], | ||||||
|             textStyle: { |           //   textStyle: { | ||||||
|               fontSize: 12 * this.beilv, |           //     fontSize: 12 * this.beilv, | ||||||
|               color: '#ced1d5' |           //     color: '#ced1d5', | ||||||
|             } |           //     fontWight: 'bolder' | ||||||
|           }, |           //   } | ||||||
|  |           // }, | ||||||
|           xAxis: { |           xAxis: { | ||||||
|  |             axisTick: { | ||||||
|  |               show: false | ||||||
|  |             }, | ||||||
|             type: 'category', |             type: 'category', | ||||||
|             axisLine: { |             axisLine: { | ||||||
|               lineStyle: { |               lineStyle: { | ||||||
| @@ -187,8 +194,11 @@ export default { | |||||||
|                 width: '1' // 坐标线的宽度 |                 width: '1' // 坐标线的宽度 | ||||||
|               } |               } | ||||||
|             }, |             }, | ||||||
|  |             textStyle: { | ||||||
|  |               fontWight: 'bolder' | ||||||
|  |             }, | ||||||
|             axisLabel: { |             axisLabel: { | ||||||
|               color: "#fff", |               color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|               fontSize: 12, |               fontSize: 12, | ||||||
|               // formatter: '{value}' |               // formatter: '{value}' | ||||||
|               // textStyle: { |               // textStyle: { | ||||||
| @@ -207,18 +217,21 @@ export default { | |||||||
|           // }, |           // }, | ||||||
|           yAxis: [ |           yAxis: [ | ||||||
|             { |             { | ||||||
|               // min: function() { // 取最小值向下取整为最小刻度 |               min: function () { // 取最小值向下取整为最小刻度 | ||||||
|               //   return 0 |                 return 0 | ||||||
|               // }, |               }, | ||||||
|               // max: function(value) { // 取最大值向上取整为最大刻度 |               max: function (value) { // 取最大值向上取整为最大刻度 | ||||||
|               //   return Math.ceil(value.max) |               }, | ||||||
|               // }, |  | ||||||
|               scale: true, |               scale: true, | ||||||
|               type: 'value', |               type: 'value', | ||||||
|               name: '良品率/%', |               name: '良品率/%', | ||||||
|  |               max: 100,//最大值 | ||||||
|  |               min: 0,//最小值 | ||||||
|  |               interval: 20,//间隔 | ||||||
|               nameTextStyle: {// y轴上方单位的颜色 |               nameTextStyle: {// y轴上方单位的颜色 | ||||||
|                 color: '#fff', |                 color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|                 align: "left", |                 align: "left", | ||||||
|  |                 padding: [0, 0, 0, 2] | ||||||
|               }, |               }, | ||||||
|               position: 'right', |               position: 'right', | ||||||
|               alignTicks: true, |               alignTicks: true, | ||||||
| @@ -231,7 +244,7 @@ export default { | |||||||
|                 } |                 } | ||||||
|               }, |               }, | ||||||
|               axisLabel: { |               axisLabel: { | ||||||
|                 color: "#fff", |                 color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|                 fontSize: 12, |                 fontSize: 12, | ||||||
|                 // formatter: '{value}' |                 // formatter: '{value}' | ||||||
|                 formatter: '{value}%' |                 formatter: '{value}%' | ||||||
| @@ -251,18 +264,24 @@ export default { | |||||||
|               // }, |               // }, | ||||||
|             }, |             }, | ||||||
|             { |             { | ||||||
|               // min: function() { // 取最小值向下取整为最小刻度 |               min: function () { // 取最小值向下取整为最小刻度 | ||||||
|               //   return 0 |                 return 0 | ||||||
|               // }, |               }, | ||||||
|               // max: function(value) { // 取最大值向上取整为最大刻度 |               max: function (value) { // 取最大值向上取整为最大刻度 | ||||||
|               //   return Math.ceil(value.max) |  | ||||||
|               // }, |                 // console.log(value.max.toString().length) | ||||||
|  |                 // String(value.max)[0] | ||||||
|  |                 // for | ||||||
|  |                 // return String(value.max)[0] + | ||||||
|  |               }, | ||||||
|  |               minInterval: 5,//间隔 | ||||||
|               scale: true, |               scale: true, | ||||||
|               type: 'value', |               type: 'value', | ||||||
|               name: '产量/片', // y轴上方的单位 |               name: '产量/片', // y轴上方的单位 | ||||||
|               nameTextStyle: { |               nameTextStyle: { | ||||||
|                 color: "#fff", |                 color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|                 // fontSize: 10, |                 // fontSize: 10, | ||||||
|  |                 padding: [0, 4, 0, 0], | ||||||
|                 align: "right", |                 align: "right", | ||||||
|               }, |               }, | ||||||
|               // position: 'left', |               // position: 'left', | ||||||
| @@ -278,7 +297,7 @@ export default { | |||||||
|               axisLabel: { |               axisLabel: { | ||||||
|                 // textStyle: { |                 // textStyle: { | ||||||
|                 // color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 |                 // color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|                 color: "#fff", |                 color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|                 // show: true, |                 // show: true, | ||||||
|                 lineStyle: { |                 lineStyle: { | ||||||
|                   color: "#25528f", |                   color: "#25528f", | ||||||
| @@ -314,4 +333,13 @@ export default { | |||||||
|   width: 100%; |   width: 100%; | ||||||
|   top: -30px; |   top: -30px; | ||||||
| } | } | ||||||
|  |     .isra-chart-tooltip { | ||||||
|  |       background: #0a2b4f77 !important; | ||||||
|  |       border: none !important; | ||||||
|  |       backdrop-filter: blur(12px); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     .isra-chart-tooltip * { | ||||||
|  |       color: #fff !important; | ||||||
|  |     } | ||||||
| </style> | </style> | ||||||
|   | |||||||
| @@ -111,8 +111,9 @@ export default { | |||||||
|                 show: true,		//开启显示 |                 show: true,		//开启显示 | ||||||
|                 position: 'top',	//在上方显示 |                 position: 'top',	//在上方显示 | ||||||
|                 textStyle: {	    //数值样式 |                 textStyle: {	    //数值样式 | ||||||
|                   color: '#ced1d5', |                   color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|                   fontSize: 12 |                   fontSize: 12, | ||||||
|  |                   fontWeight: 'normal' | ||||||
|                 } |                 } | ||||||
|               }, |               }, | ||||||
|             } |             } | ||||||
| @@ -127,12 +128,14 @@ export default { | |||||||
|         this.chart.setOption({ |         this.chart.setOption({ | ||||||
|           tooltip: { |           tooltip: { | ||||||
|             trigger: 'axis', |             trigger: 'axis', | ||||||
|  |             trigger: 'item', | ||||||
|  |             className: "isra-chart-tooltip", | ||||||
|             axisPointer: { |             axisPointer: { | ||||||
|               // 坐标轴指示器,坐标轴触发有效 |               // 坐标轴指示器,坐标轴触发有效 | ||||||
|               type: 'shadow' // 默认为直线,可选为:'line' | 'shadow' |               type: 'shadow' // 默认为直线,可选为:'line' | 'shadow' | ||||||
|             } |             } | ||||||
|           }, |           }, | ||||||
|           grid: { top: 90, right: 60, bottom: 20, left: 30, containLabel: true }, |           grid: { top: 70, right: 40, bottom: 10, left: 40, containLabel: true }, | ||||||
|           // legend: { |           // legend: { | ||||||
|           //   itemWidth: 10, |           //   itemWidth: 10, | ||||||
|           //   itemHeight: 10, |           //   itemHeight: 10, | ||||||
| @@ -144,6 +147,9 @@ export default { | |||||||
|           //   } |           //   } | ||||||
|           // }, |           // }, | ||||||
|           xAxis: { |           xAxis: { | ||||||
|  |             axisTick: { | ||||||
|  |               show: false | ||||||
|  |             }, | ||||||
|             type: 'category', |             type: 'category', | ||||||
|             axisLine: { |             axisLine: { | ||||||
|               lineStyle: { |               lineStyle: { | ||||||
| @@ -152,8 +158,11 @@ export default { | |||||||
|                 width: '1' // 坐标线的宽度 |                 width: '1' // 坐标线的宽度 | ||||||
|               } |               } | ||||||
|             }, |             }, | ||||||
|  |             textStyle: { | ||||||
|  |               fontWeight: 'bolder' | ||||||
|  |             }, | ||||||
|             axisLabel: { |             axisLabel: { | ||||||
|               color: "#fff", |               color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|               fontSize: 12, |               fontSize: 12, | ||||||
|               // formatter: '{value}' |               // formatter: '{value}' | ||||||
|             }, |             }, | ||||||
| @@ -167,13 +176,13 @@ export default { | |||||||
|           yAxis: { |           yAxis: { | ||||||
|             name: '单位kwh', |             name: '单位kwh', | ||||||
|             nameTextStyle: { |             nameTextStyle: { | ||||||
|               color: '#fff', |               color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|               fontSize: 10, |               fontSize: 12, | ||||||
|               align: 'right', |               align: 'right', | ||||||
|             }, |             }, | ||||||
|             type: 'value', |             type: 'value', | ||||||
|             axisLabel: { |             axisLabel: { | ||||||
|               color: "#fff", |               color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色 | ||||||
|               fontSize: 12, |               fontSize: 12, | ||||||
|               // formatter: '{value}/kwh' |               // formatter: '{value}/kwh' | ||||||
|             }, |             }, | ||||||
| @@ -219,4 +228,13 @@ export default { | |||||||
|   width: 100%; |   width: 100%; | ||||||
|   top: -30px; |   top: -30px; | ||||||
| } | } | ||||||
|  | .isra-chart-tooltip { | ||||||
|  |   background: #0a2b4f77 !important; | ||||||
|  |   border: none !important; | ||||||
|  |   backdrop-filter: blur(12px); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .isra-chart-tooltip * { | ||||||
|  |   color: #fff !important; | ||||||
|  | } | ||||||
| </style> | </style> | ||||||
|   | |||||||
| @@ -1,13 +1,13 @@ | |||||||
| <!-- | <!-- | ||||||
|  * @Author: zhp |  * @Author: zhp | ||||||
|  * @Date: 2023-12-27 13:54:52 |  * @Date: 2023-12-27 13:54:52 | ||||||
|  * @LastEditTime: 2024-03-28 16:30:14 |  * @LastEditTime: 2024-04-19 15:43:08 | ||||||
|  * @LastEditors: zhp |  * @LastEditors: zhp | ||||||
|  * @Description: |  * @Description: | ||||||
| --> | --> | ||||||
| <template> | <template> | ||||||
|   <div> |   <div> | ||||||
|     <div :id="id" class="productChart" :style="{ height: height + 'px', width: width }" /> |     <div :id="id" :style="{ height:'75px', width: width }" /> | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| @@ -71,7 +71,10 @@ export default { | |||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   mounted() { |   mounted() { | ||||||
|     console.log('mounted') |     // console.log('mounted') | ||||||
|  |     window.addEventListener('resize', () => { | ||||||
|  |       this.resize() | ||||||
|  |     }) | ||||||
|     // console.log('borderRadius: ', this.borderRadius) |     // console.log('borderRadius: ', this.borderRadius) | ||||||
|     // console.log('33333', this.dataList) |     // console.log('33333', this.dataList) | ||||||
|     // let arr = [] |     // let arr = [] | ||||||
| @@ -91,12 +94,21 @@ export default { | |||||||
|     this.chart = null |     this.chart = null | ||||||
|   }, |   }, | ||||||
|   methods: { |   methods: { | ||||||
|  |     resize() { | ||||||
|  |       this.chart.resize({ | ||||||
|  |         width: 'auto', | ||||||
|  |         height: 90 | ||||||
|  |       });; | ||||||
|  |     }, | ||||||
|     initChart(nameList, topNameList, nameWasteList, passRateList, wasteList) { |     initChart(nameList, topNameList, nameWasteList, passRateList, wasteList) { | ||||||
|       let rawData = [] |       if (topNameList.length === 0 && nameWasteList.length === 0 && passRateList === 0 && wasteList === 0) { | ||||||
|       let colors = ['#0fdedb', '#2359ec'] |         return | ||||||
|  |       } else { | ||||||
|  |         let rawData = [] | ||||||
|  |         let colors = ['#0fdedb', '#2359ec'] | ||||||
|         rawData.push(passRateList, wasteList) |         rawData.push(passRateList, wasteList) | ||||||
|       const totalData = []; |         const totalData = []; | ||||||
|       // if (rawData.length != 0 && raw,Data,length != 0) { |         // if (rawData.length != 0 && raw,Data,length != 0) { | ||||||
|         for (let i = 0; i < rawData[0].length; ++i) { |         for (let i = 0; i < rawData[0].length; ++i) { | ||||||
|           let sum = 0; |           let sum = 0; | ||||||
|           for (let j = 0; j < rawData.length; ++j) { |           for (let j = 0; j < rawData.length; ++j) { | ||||||
| @@ -104,134 +116,156 @@ export default { | |||||||
|           } |           } | ||||||
|           totalData.push(sum); |           totalData.push(sum); | ||||||
|         } |         } | ||||||
|       // } |         // } | ||||||
|       console.log('total', totalData) |         // rawData[1].map((d, did) => | ||||||
|       this.chart = echarts.init(document.getElementById(this.id)) |         //   console.log((d / totalData[did]).toFixed(3)) | ||||||
|       const series = [ |         //   // totalData[did] <= 0 ? 0 : d / totalData[did] | ||||||
|         '良品', |         // ) | ||||||
|         '废品', |         console.log('total', totalData) | ||||||
|         // 'Affiliate Ad', |         const series = [ | ||||||
|         // 'Video Ad', |           '良品', | ||||||
|         // 'Search Engine' |           '废品', | ||||||
|       ].map((name, sid) => { |           // 'Affiliate Ad', | ||||||
|         // console.log(sid) |           // 'Video Ad', | ||||||
|         return { |           // 'Search Engine' | ||||||
|           name, |         ].map((name, sid) => { | ||||||
|           type: 'bar', |           // console.log(sid) | ||||||
|           stack: 'total', |           return { | ||||||
|           barWidth: 12, |             name, | ||||||
|           // label: { |             type: 'bar', | ||||||
|           //   show: true, |             stack: 'total', | ||||||
|           //   formatter: (params) => Math.round(params.value * 1000) / 10 + '%' |             barWidth: 12, | ||||||
|           // }, |             // label: { | ||||||
|           color:colors[sid], |             //   show: true, | ||||||
|           data: rawData.length != 0 ? rawData[sid].map((d, did) => |             //   formatter: (params) => Math.round(params.value * 1000) / 10 + '%' | ||||||
|             totalData[did] <= 0 ? 0 : d / totalData[did] |             // }, | ||||||
|           ) : [] |             color: colors[sid], | ||||||
|         }; |             data: rawData.length != 0 ? rawData[sid].map((d, did) => | ||||||
|       }); |               totalData[did] <= 0 ? 0 : (d / totalData[did]).toFixed(4) | ||||||
|       // this.charts.resize({ |             ) : [] | ||||||
|       //   //width: width, |           }; | ||||||
|       //   //height: height, |         }); | ||||||
|       //   // es6解构 |         // this.charts.resize({ | ||||||
|       //   width, |         //   //width: width, | ||||||
|       //   height |         //   //height: height, | ||||||
|       // }) |         //   // es6解构 | ||||||
|       this.chart.setOption({ |         //   width, | ||||||
|         legend: { |         //   height | ||||||
|           formatter: function (name) { |         // }) | ||||||
|             //通过name获取到数组对象中的单个对象 |         this.chart = echarts.init(document.getElementById(this.id)) | ||||||
|             let singleData = series.filter(function (item) { |         let isFinished = false //标记 isFinished | ||||||
|               return item.name == name |         this.chart.on('finished', _ => { | ||||||
|             }) |           if (!isFinished) { | ||||||
|             return name + parseFloat((singleData[0].data * 100).toFixed(3)) + '%' |             console.log('我只执行一次') | ||||||
|           }, |             isFinished = true | ||||||
|           itemWidth: 12, |             // this.isLoading = false //关闭loading | ||||||
|           itemHeight: 12, |             this.chart.resize() //重新渲染charts大小 | ||||||
|           bottom: '20', |  | ||||||
|           left: '20', |  | ||||||
|           icon: 'rect', |  | ||||||
|           textStyle: { |  | ||||||
|             color: '#ffffff' |  | ||||||
|           } |           } | ||||||
|         }, |           console.log(113, 'finished') | ||||||
|         grid: { |         }) | ||||||
|           top:'0', |         this.chart.setOption({ | ||||||
|           left: '3%', |           legend: { | ||||||
|           right: '4%', |             formatter: function (name) { | ||||||
|           // bottom: '3%', |               //通过name获取到数组对象中的单个对象 | ||||||
|           width: 'auto', |               let singleData = series.filter(function (item) { | ||||||
|           height: '95', |                 return item.name == name | ||||||
|           containLabel: true |               }) | ||||||
|         }, |               return name + parseFloat((singleData[0].data * 100).toFixed(2)) + '%' | ||||||
|         yAxis: [ |  | ||||||
|           { |  | ||||||
|             type: 'category', |  | ||||||
|             inverse: true, |  | ||||||
|             splitLine: { |  | ||||||
|               show: false |  | ||||||
|             }, |             }, | ||||||
|             axisTick: { |             itemWidth: 12, | ||||||
|               show: false |             itemHeight: 12, | ||||||
|             }, |             bottom: '20', | ||||||
|             axisLine: { |             left: '20', | ||||||
|               show: false |             icon: 'roundRect', | ||||||
|             }, |             textStyle: { | ||||||
|             axisLabel: { |               color: 'rgba(255,255,255,.9)', | ||||||
|               show: true, |               fontSize: 12, | ||||||
|               inside: true, |             } | ||||||
|               interval: 0, //横轴信息全部显 |  | ||||||
|               splitNumber: 50, |  | ||||||
|               // boundaryGap: [20, 20], |  | ||||||
|               textStyle: { |  | ||||||
|                 color: '#ffffff', |  | ||||||
|                 verticalAlign: 'bottom', |  | ||||||
|                 fontSize: 12, |  | ||||||
|                 align: 'left', |  | ||||||
|                 padding: [0, 0, 10, -5] |  | ||||||
|               } |  | ||||||
|             }, |  | ||||||
|             data: topNameList |  | ||||||
|           }, |           }, | ||||||
|           { |           grid: { | ||||||
|             type: 'category', |             top: '0', | ||||||
|             inverse: true, |             left: '3%', | ||||||
|             splitLine: { |             right: '4%', | ||||||
|               show: false |             // bottom: '3%', | ||||||
|  |             width: 'auto', | ||||||
|  |             height: '95', | ||||||
|  |             containLabel: true | ||||||
|  |           }, | ||||||
|  |           yAxis: [ | ||||||
|  |             { | ||||||
|  |               type: 'category', | ||||||
|  |               inverse: true, | ||||||
|  |               splitLine: { | ||||||
|  |                 show: false | ||||||
|  |               }, | ||||||
|  |               axisTick: { | ||||||
|  |                 show: false | ||||||
|  |               }, | ||||||
|  |               axisLine: { | ||||||
|  |                 show: false | ||||||
|  |               }, | ||||||
|  |               axisLabel: { | ||||||
|  |                 show: true, | ||||||
|  |                 inside: true, | ||||||
|  |                 interval: 0, //横轴信息全部显 | ||||||
|  |                 splitNumber: 50, | ||||||
|  |                 // boundaryGap: [20, 20], | ||||||
|  |                 textStyle: { | ||||||
|  |                   color: 'rgba(255,255,255,.9)', | ||||||
|  |                   verticalAlign: 'bottom', | ||||||
|  |                   fontSize: 16, | ||||||
|  |                   align: 'left', | ||||||
|  |                   padding: [0, 0, 10, -5] | ||||||
|  |                 } | ||||||
|  |               }, | ||||||
|  |               data: topNameList | ||||||
|             }, |             }, | ||||||
|             axisTick: { |             { | ||||||
|               show: false |               type: 'category', | ||||||
|             }, |               inverse: true, | ||||||
|             axisLine: { |               splitLine: { | ||||||
|               show: false |                 show: false | ||||||
|             }, |               }, | ||||||
|             axisLabel: { |               axisTick: { | ||||||
|               show: true, |                 show: false | ||||||
|               inside: true, |               }, | ||||||
|               interval: 0, //横轴信息全部显 |               axisLine: { | ||||||
|               splitNumber: 50, |                 show: false | ||||||
|               // boundaryGap: [20, 20], |               }, | ||||||
|               textStyle: { |               axisLabel: { | ||||||
|                 color: '#ffffff', |                 show: true, | ||||||
|                 verticalAlign: 'bottom', |                 inside: true, | ||||||
|                 fontSize: 12, |                 interval: 0, //横轴信息全部显 | ||||||
|                 align: 'right', |                 splitNumber: 50, | ||||||
|                 padding: [0, 0, 10, -5] |                 // boundaryGap: [20, 20], | ||||||
|               } |                 textStyle: { | ||||||
|             }, |                   color: 'rgba(255,255,255,.9)', | ||||||
|             data: nameWasteList |                   verticalAlign: 'bottom', | ||||||
|           } |                   fontSize: 16, | ||||||
|         ], |                   align: 'right', | ||||||
|         xAxis: { |                   padding: [0, 0, 10, -5] | ||||||
|           // max: 120, |                 } | ||||||
|           show: false, |               }, | ||||||
|         }, |               data: nameWasteList | ||||||
|         series:series |             } | ||||||
|       }) |           ], | ||||||
|       this.chart.resize({ |           xAxis: { | ||||||
|         width: 'auto', |             // max: 120, | ||||||
|         height: 90 |             show: false, | ||||||
|       });; |           }, | ||||||
|  |           series: series | ||||||
|  |         }) | ||||||
|  |         this.$nextTick(() => { | ||||||
|  |           setTimeout(() => { | ||||||
|  |             this.resize() | ||||||
|  |           }, 1000); | ||||||
|  |         }) | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // this.chart.resize({ | ||||||
|  |       //   width: 'auto', | ||||||
|  |       //   height: 90 | ||||||
|  |       // });; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -9,7 +9,8 @@ | |||||||
| 			:table-props="tableProps" | 			:table-props="tableProps" | ||||||
| 			:page="listQuery.pageNo" | 			:page="listQuery.pageNo" | ||||||
| 			:limit="listQuery.pageSize" | 			:limit="listQuery.pageSize" | ||||||
| 			:table-data="tableData"> | 			:table-data="tableData" | ||||||
|  | 			:max-height="tableH"> | ||||||
| 			<method-btn | 			<method-btn | ||||||
| 				v-if="tableBtn.length" | 				v-if="tableBtn.length" | ||||||
| 				slot="handleBtn" | 				slot="handleBtn" | ||||||
| @@ -33,38 +34,49 @@ import { | |||||||
| 	getcoreAlarmLogPage | 	getcoreAlarmLogPage | ||||||
| } from '@/api/base/coreAlarmLog'; | } from '@/api/base/coreAlarmLog'; | ||||||
| import {DICT_TYPE, getDictDatas, publicFormatter } from "@/utils/dict"; | import {DICT_TYPE, getDictDatas, publicFormatter } from "@/utils/dict"; | ||||||
|  | import tableHeightMixin from '@/mixins/lb/tableHeightMixin'; | ||||||
|  |  | ||||||
| const tableProps = [ | const tableProps = [ | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'alarmTime', | 		prop: 'alarmTime', | ||||||
| 		label: '报警时间', | 		label: '报警时间', | ||||||
| 		filter: parseTime | 		filter: parseTime, | ||||||
|  | 		width: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'alarmSource', | 		prop: 'alarmSource', | ||||||
| 		label: '报警来源' | 		label: '报警来源', | ||||||
|  | 		width: 200, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'alarmType', | 		prop: 'alarmType', | ||||||
| 		label: '报警类型' | 		label: '报警类型', | ||||||
|  | 		width: 180, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'alarmGrade', | 		prop: 'alarmGrade', | ||||||
| 		label: '报警级别', | 		label: '报警级别', | ||||||
| 		filter: publicFormatter(DICT_TYPE.EQU_ALARM_LEVEL) | 		filter: publicFormatter(DICT_TYPE.EQU_ALARM_LEVEL), | ||||||
|  | 		width: 120, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'alarmReason', | 		prop: 'alarmReason', | ||||||
| 		label: '报警原因' | 		label: '报警原因', | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'alarmContent', | 		prop: 'alarmContent', | ||||||
| 		label: '报警详细' | 		label: '报警详细', | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	} | 	} | ||||||
| ]; | ]; | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
| 	mixins: [basicPage], | 	mixins: [basicPage, tableHeightMixin], | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			urlOptions: { | 			urlOptions: { | ||||||
| @@ -74,7 +86,7 @@ export default { | |||||||
| 			tableBtn: [].filter((v)=>v), | 			tableBtn: [].filter((v)=>v), | ||||||
| 			tableData: [], | 			tableData: [], | ||||||
| 			listQuery: { | 			listQuery: { | ||||||
|         pageSize: 10, |         pageSize: 20, | ||||||
|         pageNo: 1, |         pageNo: 1, | ||||||
|         total: 0, |         total: 0, | ||||||
| 				alarmSource: undefined, | 				alarmSource: undefined, | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  * @Author: zwq |  * @Author: zwq | ||||||
|  * @Date: 2021-11-18 14:16:25 |  * @Date: 2021-11-18 14:16:25 | ||||||
|  * @LastEditors: DY |  * @LastEditors: DY | ||||||
|  * @LastEditTime: 2024-03-20 16:20:39 |  * @LastEditTime: 2024-04-02 16:46:17 | ||||||
|  * @Description: |  * @Description: | ||||||
| --> | --> | ||||||
| <template> | <template> | ||||||
| @@ -96,7 +96,7 @@ export default { | |||||||
| 			dataRule: { | 			dataRule: { | ||||||
|         code: [{ required: true, message: "客户编号不能为空", trigger: "blur" }], |         code: [{ required: true, message: "客户编号不能为空", trigger: "blur" }], | ||||||
|         name: [{ required: true, message: "客户名称不能为空", trigger: "blur" }], |         name: [{ required: true, message: "客户名称不能为空", trigger: "blur" }], | ||||||
| 				contact: [{ required: true, message: "联系人不能为空", trigger: "blur" }], | 				// contact: [{ required: true, message: "联系人不能为空", trigger: "blur" }], | ||||||
| 				telephone: [ | 				telephone: [ | ||||||
| 					{ required: false, trigger: "blur", message: "手机号不能为空" }, | 					{ required: false, trigger: "blur", message: "手机号不能为空" }, | ||||||
|           { |           { | ||||||
|   | |||||||
| @@ -9,7 +9,8 @@ | |||||||
| 			:table-props="tableProps" | 			:table-props="tableProps" | ||||||
| 			:page="listQuery.pageNo" | 			:page="listQuery.pageNo" | ||||||
| 			:limit="listQuery.pageSize" | 			:limit="listQuery.pageSize" | ||||||
| 			:table-data="tableData"> | 			:table-data="tableData" | ||||||
|  | 			:max-height="tableH"> | ||||||
| 			<method-btn | 			<method-btn | ||||||
| 				v-if="tableBtn.length" | 				v-if="tableBtn.length" | ||||||
| 				slot="handleBtn" | 				slot="handleBtn" | ||||||
| @@ -45,41 +46,56 @@ import { | |||||||
| 	getCustomerPage, | 	getCustomerPage, | ||||||
| 	deleteCustomer | 	deleteCustomer | ||||||
| } from '@/api/base/coreCustomer'; | } from '@/api/base/coreCustomer'; | ||||||
|  | import tableHeightMixin from '@/mixins/lb/tableHeightMixin'; | ||||||
|  |  | ||||||
| const tableProps = [ | const tableProps = [ | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'createTime', | 		prop: 'createTime', | ||||||
| 		label: '添加时间', | 		label: '添加时间', | ||||||
| 		filter: parseTime | 		filter: parseTime, | ||||||
|  | 		width: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'name', | 		prop: 'name', | ||||||
| 		label: '客户名称' | 		label: '客户名称', | ||||||
|  | 		width: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'code', | 		prop: 'code', | ||||||
| 		label: '客户编码' | 		label: '客户编码', | ||||||
|  | 		width: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'contact', | 		prop: 'contact', | ||||||
| 		label: '联系人' | 		label: '联系人', | ||||||
|  | 		width: 120, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'telephone', | 		prop: 'telephone', | ||||||
| 		label: '联系电话' | 		label: '联系电话', | ||||||
|  | 		width: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'address', | 		prop: 'address', | ||||||
| 		label: '地址' | 		label: '地址', | ||||||
|  | 		width: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'remark', | 		prop: 'remark', | ||||||
| 		label: '备注' | 		label: '备注', | ||||||
|  | 		minWidth: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| ]; | ]; | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
| 	mixins: [basicPage], | 	mixins: [basicPage, tableHeightMixin], | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			urlOptions: { | 			urlOptions: { | ||||||
| @@ -122,7 +138,7 @@ export default { | |||||||
| 					color: 'primary', | 					color: 'primary', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: 'separate', | 					type: this.$auth.hasPermi('base:core-customer:create') ? 'separate' : '', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: this.$auth.hasPermi('base:core-customer:create') ? 'button' : '', | 					type: this.$auth.hasPermi('base:core-customer:create') ? 'button' : '', | ||||||
|   | |||||||
| @@ -9,7 +9,8 @@ | |||||||
| 			:table-props="tableProps" | 			:table-props="tableProps" | ||||||
| 			:page="listQuery.pageNo" | 			:page="listQuery.pageNo" | ||||||
| 			:limit="listQuery.pageSize" | 			:limit="listQuery.pageSize" | ||||||
| 			:table-data="tableData"> | 			:table-data="tableData" | ||||||
|  | 			:max-height="tableH"> | ||||||
| 			<method-btn | 			<method-btn | ||||||
| 				v-if="tableBtn.length" | 				v-if="tableBtn.length" | ||||||
| 				slot="handleBtn" | 				slot="handleBtn" | ||||||
| @@ -45,6 +46,7 @@ import { | |||||||
| 	getCoreDepartmentPage, | 	getCoreDepartmentPage, | ||||||
| 	deleteCoreDepartment | 	deleteCoreDepartment | ||||||
| } from '@/api/base/coreDepartment'; | } from '@/api/base/coreDepartment'; | ||||||
|  | import tableHeightMixin from '@/mixins/lb/tableHeightMixin'; | ||||||
|  |  | ||||||
| const tableProps = [ | const tableProps = [ | ||||||
| 	{ | 	{ | ||||||
| @@ -71,7 +73,7 @@ const tableProps = [ | |||||||
| ]; | ]; | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
| 	mixins: [basicPage], | 	mixins: [basicPage, tableHeightMixin], | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			urlOptions: { | 			urlOptions: { | ||||||
| @@ -108,7 +110,7 @@ export default { | |||||||
| 					color: 'primary', | 					color: 'primary', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: 'separate', | 					type: this.$auth.hasPermi('base:core-department:create') ? 'separate' : '', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: this.$auth.hasPermi('base:core-department:create') ? 'button' : '', | 					type: this.$auth.hasPermi('base:core-department:create') ? 'button' : '', | ||||||
|   | |||||||
| @@ -64,8 +64,8 @@ | |||||||
| 				</el-form-item> | 				</el-form-item> | ||||||
| 			</el-col> | 			</el-col> | ||||||
| 			<el-col :span="8"> | 			<el-col :span="8"> | ||||||
| 				<el-form-item label="进场日期" prop="enterTime" :rules="[]"> | 				<el-form-item label="进厂日期" prop="enterTime" :rules="[]"> | ||||||
| 					<el-date-picker v-model="form.enterTime" :disabled="disabled" type="datetime" placeholder="请选择进场日期" | 					<el-date-picker v-model="form.enterTime" :disabled="disabled" type="datetime" placeholder="请选择进厂日期" | ||||||
| 						value-format="timestamp"></el-date-picker> | 						value-format="timestamp"></el-date-picker> | ||||||
| 				</el-form-item> | 				</el-form-item> | ||||||
| 			</el-col> | 			</el-col> | ||||||
|   | |||||||
| @@ -12,7 +12,8 @@ | |||||||
| 			:page="queryParams.pageNo" | 			:page="queryParams.pageNo" | ||||||
| 			:limit="queryParams.pageSize" | 			:limit="queryParams.pageSize" | ||||||
| 			:table-data="list" | 			:table-data="list" | ||||||
| 			@emitFun="handleEmitFun"> | 			@emitFun="handleEmitFun" | ||||||
|  | 			:max-height="tableH"> | ||||||
| 			<method-btn | 			<method-btn | ||||||
| 				v-if="tableBtn.length" | 				v-if="tableBtn.length" | ||||||
| 				slot="handleBtn" | 				slot="handleBtn" | ||||||
| @@ -78,7 +79,7 @@ | |||||||
| 					queryParams: { | 					queryParams: { | ||||||
| 						equipmentId: form.id, | 						equipmentId: form.id, | ||||||
| 						pageNo: 1, | 						pageNo: 1, | ||||||
| 						pageSize: 10, | 						pageSize: 20, | ||||||
| 					}, | 					}, | ||||||
| 					tableBtn: [ | 					tableBtn: [ | ||||||
| 						this.$auth.hasPermi('base:core-equipment-attr:update') | 						this.$auth.hasPermi('base:core-equipment-attr:update') | ||||||
| @@ -118,6 +119,7 @@ import { | |||||||
| } from '@/api/base/equipment'; | } from '@/api/base/equipment'; | ||||||
| import Editor from '@/components/Editor'; | import Editor from '@/components/Editor'; | ||||||
| import AssetsUpload from './components/AssetsUpload.vue'; | import AssetsUpload from './components/AssetsUpload.vue'; | ||||||
|  | import tableHeightMixin from '@/mixins/lb/tableHeightMixin'; | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
| 	name: 'Equipment', | 	name: 'Equipment', | ||||||
| @@ -125,7 +127,7 @@ export default { | |||||||
| 		Editor, | 		Editor, | ||||||
| 		EquipmentDrawer, | 		EquipmentDrawer, | ||||||
| 	}, | 	}, | ||||||
| 	mixins: [basicPageMixin], | 	mixins: [basicPageMixin, tableHeightMixin], | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			searchBarKeys: ['name', 'code'], | 			searchBarKeys: ['name', 'code'], | ||||||
| @@ -154,11 +156,11 @@ export default { | |||||||
| 					prop: 'createTime', | 					prop: 'createTime', | ||||||
| 					label: '添加时间', | 					label: '添加时间', | ||||||
| 					fixed: true, | 					fixed: true, | ||||||
| 					width: 180, | 					minWidth: 180, | ||||||
| 					filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'), | 					filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'), | ||||||
| 				}, | 				}, | ||||||
| 				{ prop: 'name', label: '设备名称' }, | 				{ prop: 'name', label: '设备名称', minWidth: 180, showOverflowtooltip: true }, | ||||||
| 				{ width: 256, prop: 'code', label: '设备编码' }, | 				{ minWidth: 250, prop: 'code', label: '设备编码' }, | ||||||
| 				{ prop: 'equipmentTypeName', label: '设备类型' }, | 				{ prop: 'equipmentTypeName', label: '设备类型' }, | ||||||
| 				{ prop: 'enName', label: '英文名称' }, | 				{ prop: 'enName', label: '英文名称' }, | ||||||
| 				{ prop: 'abbr', label: '缩写' }, | 				{ prop: 'abbr', label: '缩写' }, | ||||||
| @@ -209,7 +211,7 @@ export default { | |||||||
| 					color: 'primary', | 					color: 'primary', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: 'separate', | 					type: (this.$auth.hasPermi('base:core-equipment:export') || this.$auth.hasPermi('base:core-equipment:create')) ? 'separate' : '', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: this.$auth.hasPermi('base:core-equipment:export') | 					type: this.$auth.hasPermi('base:core-equipment:export') | ||||||
| @@ -484,7 +486,7 @@ export default { | |||||||
| 			// 查询参数 | 			// 查询参数 | ||||||
| 			queryParams: { | 			queryParams: { | ||||||
| 				pageNo: 1, | 				pageNo: 1, | ||||||
| 				pageSize: 10, | 				pageSize: 20, | ||||||
| 				code: '', | 				code: '', | ||||||
| 				name: '', | 				name: '', | ||||||
| 				special: false | 				special: false | ||||||
|   | |||||||
| @@ -12,7 +12,8 @@ | |||||||
| 			:page="queryParams.pageNo" | 			:page="queryParams.pageNo" | ||||||
| 			:limit="queryParams.pageSize" | 			:limit="queryParams.pageSize" | ||||||
| 			:table-data="list" | 			:table-data="list" | ||||||
| 			@emitFun="handleEmitFun"> | 			@emitFun="handleEmitFun" | ||||||
|  | 			:max-height="tableH"> | ||||||
| 			<method-btn | 			<method-btn | ||||||
| 				v-if="tableBtn.length" | 				v-if="tableBtn.length" | ||||||
| 				slot="handleBtn" | 				slot="handleBtn" | ||||||
| @@ -51,13 +52,13 @@ | |||||||
| import moment from 'moment'; | import moment from 'moment'; | ||||||
| import basicPageMixin from '@/mixins/lb/basicPageMixin'; | import basicPageMixin from '@/mixins/lb/basicPageMixin'; | ||||||
| import DialogForm from './dialogForm.vue'; | import DialogForm from './dialogForm.vue'; | ||||||
|  | import tableHeightMixin from '@/mixins/lb/tableHeightMixin'; | ||||||
| // import { getAccessToken } from '@/utils/auth'; | // import { getAccessToken } from '@/utils/auth'; | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
| 	name: 'EquipmentLineBind', | 	name: 'EquipmentLineBind', | ||||||
| 	components: { DialogForm }, | 	components: { DialogForm }, | ||||||
| 	mixins: [basicPageMixin], | 	mixins: [basicPageMixin, tableHeightMixin], | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			basePath: '/base/core-equipment-bind-section', | 			basePath: '/base/core-equipment-bind-section', | ||||||
| @@ -81,12 +82,13 @@ export default { | |||||||
| 					prop: 'createTime', | 					prop: 'createTime', | ||||||
| 					label: '添加时间', | 					label: '添加时间', | ||||||
| 					fixed: true, | 					fixed: true, | ||||||
| 					width: 180, | 					width: 150, | ||||||
|  | 					showOverflowtooltip: true, | ||||||
| 					filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'), | 					filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'), | ||||||
| 				}, | 				}, | ||||||
| 				{ prop: 'productionLineName', label: '产线名称' }, | 				{ prop: 'productionLineName', label: '产线名称', width: 120, showOverflowtooltip: true }, | ||||||
| 				{ prop: 'workshopSectionName', label: '工段名称' }, | 				{ prop: 'workshopSectionName', label: '工段名称', width: 120, showOverflowtooltip: true }, | ||||||
| 				{ prop: 'equipmentName', label: '设备名称' }, | 				{ prop: 'equipmentName', label: '设备名称', width: 150, showOverflowtooltip: true }, | ||||||
| 				{ prop: 'sort', label: '工段中排序' }, | 				{ prop: 'sort', label: '工段中排序' }, | ||||||
| 				{ | 				{ | ||||||
| 					prop: 'lineDataType', | 					prop: 'lineDataType', | ||||||
| @@ -124,7 +126,8 @@ export default { | |||||||
| 					color: 'primary', | 					color: 'primary', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: 'separate', | 					type: this.$auth.hasPermi('base:core-equipment-bind-section:create') | ||||||
|  | 						? 'separate' : '', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: this.$auth.hasPermi('base:core-equipment-bind-section:create') | 					type: this.$auth.hasPermi('base:core-equipment-bind-section:create') | ||||||
| @@ -236,7 +239,7 @@ export default { | |||||||
| 			// 查询参数 | 			// 查询参数 | ||||||
| 			queryParams: { | 			queryParams: { | ||||||
| 				pageNo: 1, | 				pageNo: 1, | ||||||
| 				pageSize: 10, | 				pageSize: 20, | ||||||
| 				equipmentName: null, | 				equipmentName: null, | ||||||
| 				productionLineId: null, | 				productionLineId: null, | ||||||
| 			}, | 			}, | ||||||
|   | |||||||
| @@ -12,7 +12,8 @@ | |||||||
| 			:page="queryParams.pageNo" | 			:page="queryParams.pageNo" | ||||||
| 			:limit="queryParams.pageSize" | 			:limit="queryParams.pageSize" | ||||||
| 			:table-data="list" | 			:table-data="list" | ||||||
| 			@emitFun="handleEmitFun"> | 			@emitFun="handleEmitFun" | ||||||
|  | 			:max-height="tableH"> | ||||||
| 			<method-btn | 			<method-btn | ||||||
| 				v-if="tableBtn.length" | 				v-if="tableBtn.length" | ||||||
| 				slot="handleBtn" | 				slot="handleBtn" | ||||||
| @@ -50,6 +51,7 @@ | |||||||
| <script> | <script> | ||||||
| import moment from 'moment'; | import moment from 'moment'; | ||||||
| import basicPageMixin from '@/mixins/lb/basicPageMixin'; | import basicPageMixin from '@/mixins/lb/basicPageMixin'; | ||||||
|  | import tableHeightMixin from '@/mixins/lb/tableHeightMixin'; | ||||||
|  |  | ||||||
| import { | import { | ||||||
| 	createEquipmentType, | 	createEquipmentType, | ||||||
| @@ -65,7 +67,7 @@ import { | |||||||
| export default { | export default { | ||||||
| 	name: 'EquipmentType', | 	name: 'EquipmentType', | ||||||
| 	components: {}, | 	components: {}, | ||||||
| 	mixins: [basicPageMixin], | 	mixins: [basicPageMixin, tableHeightMixin], | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			searchBarKeys: ['name'], | 			searchBarKeys: ['name'], | ||||||
| @@ -88,7 +90,7 @@ export default { | |||||||
| 					prop: 'createTime', | 					prop: 'createTime', | ||||||
| 					label: '添加时间', | 					label: '添加时间', | ||||||
| 					fixed: true, | 					fixed: true, | ||||||
| 					width: 180, | 					minWidth: 180, | ||||||
| 					filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'), | 					filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'), | ||||||
| 				}, | 				}, | ||||||
| 				{ prop: 'name', label: '类型名称' }, | 				{ prop: 'name', label: '类型名称' }, | ||||||
| @@ -109,7 +111,8 @@ export default { | |||||||
| 					color: 'primary', | 					color: 'primary', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: 'separate', | 					type: this.$auth.hasPermi('base:core-equipment-type:create') | ||||||
|  | 						? 'separate' : '', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: this.$auth.hasPermi('base:core-equipment-type:create') | 					type: this.$auth.hasPermi('base:core-equipment-type:create') | ||||||
| @@ -171,7 +174,7 @@ export default { | |||||||
| 			// 查询参数 | 			// 查询参数 | ||||||
| 			queryParams: { | 			queryParams: { | ||||||
| 				pageNo: 1, | 				pageNo: 1, | ||||||
| 				pageSize: 10, | 				pageSize: 20, | ||||||
| 				name: '', | 				name: '', | ||||||
| 			}, | 			}, | ||||||
| 			// 表单参数 | 			// 表单参数 | ||||||
|   | |||||||
| @@ -9,7 +9,8 @@ | |||||||
| 			:table-props="tableProps" | 			:table-props="tableProps" | ||||||
| 			:page="listQuery.pageNo" | 			:page="listQuery.pageNo" | ||||||
| 			:limit="listQuery.pageSize" | 			:limit="listQuery.pageSize" | ||||||
| 			:table-data="tableData"> | 			:table-data="tableData" | ||||||
|  | 			:max-height="tableH"> | ||||||
| 			<method-btn | 			<method-btn | ||||||
| 				v-if="tableBtn.length" | 				v-if="tableBtn.length" | ||||||
| 				slot="handleBtn" | 				slot="handleBtn" | ||||||
| @@ -43,38 +44,51 @@ import basicPage from '../../core/mixins/basic-page'; | |||||||
| import { parseTime } from '../../core/mixins/code-filter'; | import { parseTime } from '../../core/mixins/code-filter'; | ||||||
| import { getHotMaterialPage, deleteHotMaterial } from '@/api/base/coreHotMaterial'; | import { getHotMaterialPage, deleteHotMaterial } from '@/api/base/coreHotMaterial'; | ||||||
| import { publicFormatter } from "@/utils/dict"; | import { publicFormatter } from "@/utils/dict"; | ||||||
|  | import tableHeightMixin from '@/mixins/lb/tableHeightMixin'; | ||||||
|  |  | ||||||
| const tableProps = [ | const tableProps = [ | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'createTime', | 		prop: 'createTime', | ||||||
| 		label: '添加时间', | 		label: '添加时间', | ||||||
| 		filter: parseTime | 		filter: parseTime, | ||||||
|  | 		width: 180, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'name', | 		prop: 'name', | ||||||
| 		label: '原料名称' | 		label: '原料名称', | ||||||
|  | 		minWidth: 250, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'code', | 		prop: 'code', | ||||||
| 		label: '原料编码' | 		label: '原料编码', | ||||||
|  | 		width: 250, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'unit', | 		prop: 'unit', | ||||||
| 		label: '单位', | 		label: '单位', | ||||||
| 		filter: publicFormatter('unit_dict') | 		filter: publicFormatter('unit_dict'), | ||||||
|  | 		width: 90, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'dailyCost', | 		prop: 'dailyCost', | ||||||
| 		label: '每日消耗量' | 		label: '每日消耗量', | ||||||
|  | 		width: 120, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'remark', | 		prop: 'remark', | ||||||
| 		label: '备注' | 		label: '备注', | ||||||
|  | 		width: 120, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| ]; | ]; | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
| 	mixins: [basicPage], | 	mixins: [basicPage, tableHeightMixin], | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			urlOptions: { | 			urlOptions: { | ||||||
| @@ -123,7 +137,7 @@ export default { | |||||||
| 					color: 'primary', | 					color: 'primary', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: 'separate', | 					type: this.$auth.hasPermi('base:core-hot-material-check:create') ? 'separate' : '', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: this.$auth.hasPermi('base:core-hot-material-check:create') ? 'button' : '', | 					type: this.$auth.hasPermi('base:core-hot-material-check:create') ? 'button' : '', | ||||||
|   | |||||||
| @@ -9,7 +9,8 @@ | |||||||
| 			:table-props="tableProps" | 			:table-props="tableProps" | ||||||
| 			:page="listQuery.pageNo" | 			:page="listQuery.pageNo" | ||||||
| 			:limit="listQuery.pageSize" | 			:limit="listQuery.pageSize" | ||||||
| 			:table-data="tableData"> | 			:table-data="tableData" | ||||||
|  | 			:max-height="tableH"> | ||||||
| 			<method-btn | 			<method-btn | ||||||
| 				v-if="tableBtn.length" | 				v-if="tableBtn.length" | ||||||
| 				slot="handleBtn" | 				slot="handleBtn" | ||||||
| @@ -45,6 +46,7 @@ import { | |||||||
| 	getCoreMajorPage, | 	getCoreMajorPage, | ||||||
| 	deleteCoreMajor | 	deleteCoreMajor | ||||||
| } from '@/api/base/coreMajor'; | } from '@/api/base/coreMajor'; | ||||||
|  | import tableHeightMixin from '@/mixins/lb/tableHeightMixin'; | ||||||
|  |  | ||||||
| const tableProps = [ | const tableProps = [ | ||||||
| 	{ | 	{ | ||||||
| @@ -71,7 +73,7 @@ const tableProps = [ | |||||||
| ]; | ]; | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
| 	mixins: [basicPage], | 	mixins: [basicPage, tableHeightMixin], | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			urlOptions: { | 			urlOptions: { | ||||||
| @@ -108,7 +110,7 @@ export default { | |||||||
| 					color: 'primary', | 					color: 'primary', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: 'separate', | 					type: this.$auth.hasPermi('base:core-major:create') ? 'separate' : '', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: this.$auth.hasPermi('base:core-major:create') ? 'button' : '', | 					type: this.$auth.hasPermi('base:core-major:create') ? 'button' : '', | ||||||
|   | |||||||
| @@ -2,15 +2,17 @@ | |||||||
|  * @Author: zwq |  * @Author: zwq | ||||||
|  * @Date: 2021-11-18 14:16:25 |  * @Date: 2021-11-18 14:16:25 | ||||||
|  * @LastEditors: DY |  * @LastEditors: DY | ||||||
|  * @LastEditTime: 2024-03-13 13:54:01 |  * @LastEditTime: 2024-03-27 13:47:24 | ||||||
|  * @Description: |  * @Description: | ||||||
| --> | --> | ||||||
| <template> | <template> | ||||||
| 	<el-drawer | 	<el-drawer | ||||||
| 		:visible.sync="visible" | 		:visible.sync="visible" | ||||||
| 		:show-close="false" | 		:show-close="false" | ||||||
| 		:wrapper-closable="isdetail" | 		:wrapper-closable="true" | ||||||
| 		class="drawer" | 		class="drawer" | ||||||
|  | 		:before-close="beforeClose" | ||||||
|  | 		@closed="$emit('destroy')" | ||||||
| 		size="60%"> | 		size="60%"> | ||||||
| 		<small-title slot="title" :no-padding="true"> | 		<small-title slot="title" :no-padding="true"> | ||||||
| 			{{ isdetail ? '详情' : !dataForm.id ? '新增' : '编辑' }} | 			{{ isdetail ? '详情' : !dataForm.id ? '新增' : '编辑' }} | ||||||
| @@ -262,6 +264,15 @@ export default { | |||||||
| 	}, | 	}, | ||||||
| 	mounted() {}, | 	mounted() {}, | ||||||
| 	methods: { | 	methods: { | ||||||
|  | 		beforeClose(done) { | ||||||
|  | 			if (!this.isdetail) { | ||||||
|  | 				this.$confirm('确认关闭?') | ||||||
|  | 					.then(_ => { | ||||||
|  | 						done(); | ||||||
|  | 					}) | ||||||
|  | 					.catch(_ => {}); | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
| 		clearArea() { | 		clearArea() { | ||||||
| 			this.$set(this.dataForm, 'area', 0) | 			this.$set(this.dataForm, 'area', 0) | ||||||
| 			this.$set(this.dataForm, 'weight', 0) | 			this.$set(this.dataForm, 'weight', 0) | ||||||
|   | |||||||
| @@ -9,11 +9,12 @@ | |||||||
| 			:table-props="tableProps" | 			:table-props="tableProps" | ||||||
| 			:page="listQuery.pageNo" | 			:page="listQuery.pageNo" | ||||||
| 			:limit="listQuery.pageSize" | 			:limit="listQuery.pageSize" | ||||||
| 			:table-data="tableData"> | 			:table-data="tableData" | ||||||
|  | 			:max-height="tableH"> | ||||||
| 			<method-btn | 			<method-btn | ||||||
| 				v-if="tableBtn.length" | 				v-if="tableBtn.length" | ||||||
| 				slot="handleBtn" | 				slot="handleBtn" | ||||||
| 				:width="120" | 				:Width="120" | ||||||
| 				label="操作" | 				label="操作" | ||||||
| 				:method-list="tableBtn" | 				:method-list="tableBtn" | ||||||
| 				@clickBtn="handleClick" /> | 				@clickBtn="handleClick" /> | ||||||
| @@ -26,7 +27,8 @@ | |||||||
| 		<add-or-update | 		<add-or-update | ||||||
| 			v-if="addOrUpdateVisible" | 			v-if="addOrUpdateVisible" | ||||||
| 			ref="addOrUpdate" | 			ref="addOrUpdate" | ||||||
| 			@refreshDataList="getDataList" /> | 			@refreshDataList="getDataList" | ||||||
|  | 			@destroy="addOrUpdateVisible = false" /> | ||||||
| 	</div> | 	</div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| @@ -39,43 +41,58 @@ import { | |||||||
| 	getCoreProductPage, | 	getCoreProductPage, | ||||||
| 	deleteCoreProduct | 	deleteCoreProduct | ||||||
| } from '@/api/base/coreProduct'; | } from '@/api/base/coreProduct'; | ||||||
|  | import tableHeightMixin from '@/mixins/lb/tableHeightMixin'; | ||||||
|  |  | ||||||
| const tableProps = [ | const tableProps = [ | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'createTime', | 		prop: 'createTime', | ||||||
| 		label: '添加时间', | 		label: '添加时间', | ||||||
| 		filter: parseTime | 		filter: parseTime, | ||||||
|  | 		minWidth: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'name', | 		prop: 'name', | ||||||
| 		label: '产品名称' | 		label: '产品名称', | ||||||
|  | 		minWidth: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'code', | 		prop: 'code', | ||||||
| 		label: '产品编码' | 		label: '产品编码', | ||||||
|  | 		minWidth: 190, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'productType', | 		prop: 'productType', | ||||||
| 		label: '产品类型', | 		label: '产品类型', | ||||||
| 		filter: publicFormatter('product_type') | 		filter: publicFormatter('product_type'), | ||||||
|  | 		minWidth: 180, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'specifications', | 		prop: 'specifications', | ||||||
| 		label: '规格' | 		label: '规格', | ||||||
|  | 		minWidth: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'unit', | 		prop: 'unit', | ||||||
| 		label: '单位', | 		label: '单位', | ||||||
| 		filter: publicFormatter('unit_dict') | 		filter: publicFormatter('unit_dict'), | ||||||
|  | 		minWidth: 90, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'remark', | 		prop: 'remark', | ||||||
| 		label: '备注', | 		label: '备注', | ||||||
|  | 		minWidth: 120, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| ]; | ]; | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
| 	mixins: [basicPage], | 	mixins: [basicPage, tableHeightMixin], | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			urlOptions: { | 			urlOptions: { | ||||||
| @@ -124,7 +141,7 @@ export default { | |||||||
| 					color: 'primary', | 					color: 'primary', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: 'separate', | 					type: this.$auth.hasPermi('base:core-product:create') ? 'separate' : '', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: this.$auth.hasPermi('base:core-product:create') ? 'button' : '', | 					type: this.$auth.hasPermi('base:core-product:create') ? 'button' : '', | ||||||
|   | |||||||
| @@ -9,11 +9,12 @@ | |||||||
| 			:table-props="tableProps" | 			:table-props="tableProps" | ||||||
| 			:page="listQuery.pageNo" | 			:page="listQuery.pageNo" | ||||||
| 			:limit="listQuery.pageSize" | 			:limit="listQuery.pageSize" | ||||||
| 			:table-data="tableData"> | 			:table-data="tableData" | ||||||
|  | 			:max-height="tableH"> | ||||||
| 			<method-btn | 			<method-btn | ||||||
| 				v-if="tableBtn.length" | 				v-if="tableBtn.length" | ||||||
| 				slot="handleBtn" | 				slot="handleBtn" | ||||||
| 				:width="120" | 				:minWidth="120" | ||||||
| 				label="操作" | 				label="操作" | ||||||
| 				:method-list="tableBtn" | 				:method-list="tableBtn" | ||||||
| 				@clickBtn="handleClick" /> | 				@clickBtn="handleClick" /> | ||||||
| @@ -29,7 +30,7 @@ | |||||||
| 			@cancel="handleCancel" | 			@cancel="handleCancel" | ||||||
| 			@confirm="handleConfirm" | 			@confirm="handleConfirm" | ||||||
| 			:before-close="handleCancel" | 			:before-close="handleCancel" | ||||||
| 			width="50%"> | 			minWidth="50%"> | ||||||
| 			<add-or-update | 			<add-or-update | ||||||
| 				ref="addOrUpdate" | 				ref="addOrUpdate" | ||||||
| 				@refreshDataList="successSubmit"></add-or-update> | 				@refreshDataList="successSubmit"></add-or-update> | ||||||
| @@ -48,34 +49,47 @@ import { | |||||||
| import { getStatus } from '@/api/core/base/productionLine'; | import { getStatus } from '@/api/core/base/productionLine'; | ||||||
| import codeFilter from '../../core/mixins/code-filter'; | import codeFilter from '../../core/mixins/code-filter'; | ||||||
| import { publicFormatter } from '@/utils/dict'; | import { publicFormatter } from '@/utils/dict'; | ||||||
|  | import tableHeightMixin from '@/mixins/lb/tableHeightMixin'; | ||||||
|  |  | ||||||
| const tableProps = [ | const tableProps = [ | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'createTime', | 		prop: 'createTime', | ||||||
| 		label: '添加时间', | 		label: '添加时间', | ||||||
| 		filter: parseTime | 		filter: parseTime, | ||||||
|  | 		minWidth: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'factoryName', | 		prop: 'factoryName', | ||||||
| 		label: '工厂' | 		label: '工厂', | ||||||
|  | 		minWidth: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'roomNameDict', | 		prop: 'roomNameDict', | ||||||
| 		label: '车间名称', | 		label: '车间名称', | ||||||
| 		filter: publicFormatter('workshop') | 		filter: publicFormatter('workshop'), | ||||||
|  | 		minWidth: 120, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'name', | 		prop: 'name', | ||||||
| 		label: '产线名称' | 		label: '产线名称', | ||||||
|  | 		minWidth: 120, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'code', | 		prop: 'code', | ||||||
| 		label: '产线编码' | 		label: '产线编码', | ||||||
|  | 		minWidth: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'enabled', | 		prop: 'enabled', | ||||||
| 		label: '当前状态', | 		label: '当前状态', | ||||||
| 		filter: codeFilter('lineStatus') | 		filter: codeFilter('lineStatus'), | ||||||
|  | 		minWidth: 120, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	// { | 	// { | ||||||
| 	// 	prop: 'tvalue', | 	// 	prop: 'tvalue', | ||||||
| @@ -83,16 +97,20 @@ const tableProps = [ | |||||||
| 	// }, | 	// }, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'description', | 		prop: 'description', | ||||||
| 		label: '描述' | 		label: '描述', | ||||||
|  | 		minWidth: 120, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'remark', | 		prop: 'remark', | ||||||
| 		label: '备注' | 		label: '备注', | ||||||
|  | 		minWidth: 120, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	} | 	} | ||||||
| ]; | ]; | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
| 	mixins: [basicPage], | 	mixins: [basicPage, tableHeightMixin], | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			urlOptions: { | 			urlOptions: { | ||||||
| @@ -129,7 +147,7 @@ export default { | |||||||
| 					color: 'primary', | 					color: 'primary', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: 'separate', | 					type: this.$auth.hasPermi('base:core-production-line:create') ? 'separate' : '', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: this.$auth.hasPermi('base:core-production-line:create') ? 'button' : '', | 					type: this.$auth.hasPermi('base:core-production-line:create') ? 'button' : '', | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  * @Author: zwq |  * @Author: zwq | ||||||
|  * @Date: 2021-11-18 14:16:25 |  * @Date: 2021-11-18 14:16:25 | ||||||
|  * @LastEditors: DY |  * @LastEditors: DY | ||||||
|  * @LastEditTime: 2023-11-22 10:27:43 |  * @LastEditTime: 2024-04-02 16:46:49 | ||||||
|  * @Description: |  * @Description: | ||||||
| --> | --> | ||||||
| <template> | <template> | ||||||
| @@ -79,7 +79,7 @@ export default { | |||||||
| 			dataRule: { | 			dataRule: { | ||||||
|         code: [{ required: true, message: "供应商编号不能为空", trigger: "blur" }], |         code: [{ required: true, message: "供应商编号不能为空", trigger: "blur" }], | ||||||
|         name: [{ required: true, message: "供应商名称不能为空", trigger: "blur" }], |         name: [{ required: true, message: "供应商名称不能为空", trigger: "blur" }], | ||||||
| 				contact: [{ required: true, message: "联系人不能为空", trigger: "blur" }], | 				// contact: [{ required: true, message: "联系人不能为空", trigger: "blur" }], | ||||||
| 				telephone: [ | 				telephone: [ | ||||||
| 					{ required: false, trigger: "blur", message: "手机号不能为空" }, | 					{ required: false, trigger: "blur", message: "手机号不能为空" }, | ||||||
|           { |           { | ||||||
|   | |||||||
| @@ -9,7 +9,8 @@ | |||||||
| 			:table-props="tableProps" | 			:table-props="tableProps" | ||||||
| 			:page="listQuery.pageNo" | 			:page="listQuery.pageNo" | ||||||
| 			:limit="listQuery.pageSize" | 			:limit="listQuery.pageSize" | ||||||
| 			:table-data="tableData"> | 			:table-data="tableData" | ||||||
|  | 			:max-height="tableH"> | ||||||
| 			<method-btn | 			<method-btn | ||||||
| 				v-if="tableBtn.length" | 				v-if="tableBtn.length" | ||||||
| 				slot="handleBtn" | 				slot="handleBtn" | ||||||
| @@ -45,41 +46,56 @@ import { | |||||||
| 	getCoreSupplierPage, | 	getCoreSupplierPage, | ||||||
| 	deleteCoreSupplier | 	deleteCoreSupplier | ||||||
| } from '@/api/base/coreSupplier'; | } from '@/api/base/coreSupplier'; | ||||||
|  | import tableHeightMixin from '@/mixins/lb/tableHeightMixin'; | ||||||
|  |  | ||||||
| const tableProps = [ | const tableProps = [ | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'createTime', | 		prop: 'createTime', | ||||||
| 		label: '添加时间', | 		label: '添加时间', | ||||||
| 		filter: parseTime | 		filter: parseTime, | ||||||
|  | 		width: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'code', | 		prop: 'code', | ||||||
| 		label: '供应商编码' | 		label: '供应商编码', | ||||||
|  | 		width: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'name', | 		prop: 'name', | ||||||
| 		label: '供应商名称' | 		label: '供应商名称', | ||||||
|  | 		width: 180, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'contact', | 		prop: 'contact', | ||||||
| 		label: '联系人' | 		label: '联系人', | ||||||
|  | 		width: 180, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'telephone', | 		prop: 'telephone', | ||||||
| 		label: '联系电话' | 		label: '联系电话', | ||||||
|  | 		width: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'address', | 		prop: 'address', | ||||||
| 		label: '地址' | 		label: '地址', | ||||||
|  | 		width: 180, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'remark', | 		prop: 'remark', | ||||||
| 		label: '备注' | 		label: '备注', | ||||||
|  | 		minWidth: 90, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| ]; | ]; | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
| 	mixins: [basicPage], | 	mixins: [basicPage, tableHeightMixin], | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			urlOptions: { | 			urlOptions: { | ||||||
| @@ -116,7 +132,7 @@ export default { | |||||||
| 					color: 'primary', | 					color: 'primary', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: 'separate', | 					type: this.$auth.hasPermi('base:core-supplier:create') ? 'separate' : '', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: this.$auth.hasPermi('base:core-supplier:create') ? 'button' : '', | 					type: this.$auth.hasPermi('base:core-supplier:create') ? 'button' : '', | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  * @Author: zwq |  * @Author: zwq | ||||||
|  * @Date: 2021-11-18 14:16:25 |  * @Date: 2021-11-18 14:16:25 | ||||||
|  * @LastEditors: DY |  * @LastEditors: DY | ||||||
|  * @LastEditTime: 2024-03-22 08:53:20 |  * @LastEditTime: 2024-04-08 10:21:46 | ||||||
|  * @Description: |  * @Description: | ||||||
| --> | --> | ||||||
| <template> | <template> | ||||||
| @@ -214,7 +214,9 @@ export default { | |||||||
| 								actualQuantity: this.dataForm.actualQuantity | 								actualQuantity: this.dataForm.actualQuantity | ||||||
| 							}).then(response => { | 							}).then(response => { | ||||||
| 								this.$modal.msgSuccess("操作成功!工单状态稍后将会更新!"); | 								this.$modal.msgSuccess("操作成功!工单状态稍后将会更新!"); | ||||||
| 								this.saveData(tempList) | 								if (tempList.length > 0) { | ||||||
|  | 									this.saveData(tempList) | ||||||
|  | 								} | ||||||
| 								this.visible = false; | 								this.visible = false; | ||||||
| 								this.$emit("refreshDataList"); | 								this.$emit("refreshDataList"); | ||||||
| 							}); | 							}); | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  * @Author: zwq |  * @Author: zwq | ||||||
|  * @Date: 2021-11-18 14:16:25 |  * @Date: 2021-11-18 14:16:25 | ||||||
|  * @LastEditors: DY |  * @LastEditors: DY | ||||||
|  * @LastEditTime: 2024-03-21 16:52:46 |  * @LastEditTime: 2024-04-10 16:16:31 | ||||||
|  * @Description: |  * @Description: | ||||||
| --> | --> | ||||||
| <template> | <template> | ||||||
| @@ -182,7 +182,8 @@ | |||||||
| 					:table-props="tableProps" | 					:table-props="tableProps" | ||||||
| 					:page="listQuery.pageNo" | 					:page="listQuery.pageNo" | ||||||
| 					:limit="listQuery.pageSize" | 					:limit="listQuery.pageSize" | ||||||
| 					:table-data="orderList"> | 					:table-data="orderList" | ||||||
|  | 					:max-height="tableH"> | ||||||
| 					<method-btn | 					<method-btn | ||||||
| 						v-if="!isdetail" | 						v-if="!isdetail" | ||||||
| 						slot="handleBtn" | 						slot="handleBtn" | ||||||
| @@ -200,23 +201,26 @@ | |||||||
| 					@pagination="getList" /> --> | 					@pagination="getList" /> --> | ||||||
| 			</div> | 			</div> | ||||||
|  |  | ||||||
| 			<div class="card" style="padding-bottom: 16px;"> | 			<div v-if="$auth.hasPermiAnd(['base:material-product-bom-det:query', 'extend:process-flow:query'])"> | ||||||
| 				<div class="boxTitle"> | 				<div class="card" style="padding-bottom: 16px;"> | ||||||
| 					<span class="blueTitle"></span> | 					<div class="boxTitle"> | ||||||
| 					<span>预计用料信息</span> | 						<span class="blueTitle"></span> | ||||||
|  | 						<span>预计用料信息</span> | ||||||
|  | 					</div> | ||||||
|  | 					<base-table | ||||||
|  | 						:table-props="tableProps1" | ||||||
|  | 						:page="listQuery1.pageNo" | ||||||
|  | 						:limit="listQuery1.pageSize" | ||||||
|  | 						:table-data="materialList" | ||||||
|  | 						:max-height="tableH" /> | ||||||
|  | 					<!-- <pagination | ||||||
|  | 						v-show="listQuery1.total > 0" | ||||||
|  | 						:total="listQuery1.total" | ||||||
|  | 						:page.sync="listQuery1.pageNo" | ||||||
|  | 						:limit.sync="listQuery1.pageSize" | ||||||
|  | 						:page-sizes="[5, 10, 15]" | ||||||
|  | 						@pagination="getList" /> --> | ||||||
| 				</div> | 				</div> | ||||||
| 				<base-table |  | ||||||
| 					:table-props="tableProps1" |  | ||||||
| 					:page="listQuery1.pageNo" |  | ||||||
| 					:limit="listQuery1.pageSize" |  | ||||||
| 					:table-data="materialList" /> |  | ||||||
| 				<!-- <pagination |  | ||||||
| 					v-show="listQuery1.total > 0" |  | ||||||
| 					:total="listQuery1.total" |  | ||||||
| 					:page.sync="listQuery1.pageNo" |  | ||||||
| 					:limit.sync="listQuery1.pageSize" |  | ||||||
| 					:page-sizes="[5, 10, 15]" |  | ||||||
| 					@pagination="getList" /> --> |  | ||||||
| 			</div> | 			</div> | ||||||
|  |  | ||||||
| 			<!-- <div class="drawer-body__footer"> | 			<!-- <div class="drawer-body__footer"> | ||||||
| @@ -235,6 +239,7 @@ import SmallTitle from './SmallTitle'; | |||||||
| import { publicFormatter } from "@/utils/dict"; | import { publicFormatter } from "@/utils/dict"; | ||||||
| import { parseTime } from '@/utils/ruoyi' | import { parseTime } from '@/utils/ruoyi' | ||||||
| import topTabVue from '../../order/base/orderManage/components/topTab.vue'; | import topTabVue from '../../order/base/orderManage/components/topTab.vue'; | ||||||
|  | import tableHeightMixin from '@/mixins/lb/tableHeightMixin'; | ||||||
|  |  | ||||||
| const tableBtn = [ | const tableBtn = [ | ||||||
| 	{ | 	{ | ||||||
| @@ -292,9 +297,11 @@ const tableProps1 = [ | |||||||
| ]; | ]; | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
|  | 	mixins: [tableHeightMixin], | ||||||
| 	components: { SmallTitle, topTabVue }, | 	components: { SmallTitle, topTabVue }, | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
|  | 			heightNum: 380, | ||||||
| 			tableBtn, | 			tableBtn, | ||||||
| 			tableProps, | 			tableProps, | ||||||
| 			tableProps1, | 			tableProps1, | ||||||
| @@ -455,8 +462,8 @@ export default { | |||||||
| 				// this.listQuery.total = response.data.total; | 				// this.listQuery.total = response.data.total; | ||||||
| 			}); | 			}); | ||||||
| 			// 获取预使用原料列表 | 			// 获取预使用原料列表 | ||||||
| 			console.log() | 			console.log('111我看看', this.dataForm.materialMethod) | ||||||
| 			if (this.dataForm.id) { | 			if (this.dataForm.id && this.$auth.hasPermiAnd(['base:material-product-bom-det:query', 'extend:process-flow:query'])) { | ||||||
| 				if (this.dataForm.materialMethod === 1) { | 				if (this.dataForm.materialMethod === 1) { | ||||||
| 					// 产品 | 					// 产品 | ||||||
| 					getlistByProductId({ | 					getlistByProductId({ | ||||||
|   | |||||||
| @@ -9,7 +9,8 @@ | |||||||
| 			:table-props="tableProps" | 			:table-props="tableProps" | ||||||
| 			:page="listQuery.pageNo" | 			:page="listQuery.pageNo" | ||||||
| 			:limit="listQuery.pageSize" | 			:limit="listQuery.pageSize" | ||||||
| 			:table-data="tableData"> | 			:table-data="tableData" | ||||||
|  | 			:max-height="tableH"> | ||||||
| 			<method-btn | 			<method-btn | ||||||
| 				v-if="tableBtn.length" | 				v-if="tableBtn.length" | ||||||
| 				slot="handleBtn" | 				slot="handleBtn" | ||||||
| @@ -62,7 +63,7 @@ import { | |||||||
| 	getCoreWOList | 	getCoreWOList | ||||||
| } from '@/api/base/coreWorkOrder'; | } from '@/api/base/coreWorkOrder'; | ||||||
| import { publicFormatter } from '@/utils/dict'; | import { publicFormatter } from '@/utils/dict'; | ||||||
|  | import tableHeightMixin from '@/mixins/lb/tableHeightMixin'; | ||||||
|  |  | ||||||
| const tableProps = [ | const tableProps = [ | ||||||
| 	{ | 	{ | ||||||
| @@ -132,7 +133,7 @@ const tableProps = [ | |||||||
| ]; | ]; | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
| 	mixins: [basicPage], | 	mixins: [basicPage, tableHeightMixin], | ||||||
| 	components: { | 	components: { | ||||||
| 		AddWorkOrder, | 		AddWorkOrder, | ||||||
| 		AddOrUpdate, | 		AddOrUpdate, | ||||||
| @@ -156,92 +157,105 @@ export default { | |||||||
| 				// 			showTip: '预使用原料信息' | 				// 			showTip: '预使用原料信息' | ||||||
| 				// 	  } | 				// 	  } | ||||||
| 				// 	: undefined, | 				// 	: undefined, | ||||||
| 					{ | 					this.$auth.hasPermi(`base:core-work-order:update`) | ||||||
| 						type: 'active', | 					? { | ||||||
| 						btnName: '激活', | 							type: 'active', | ||||||
| 						showParam: { | 							btnName: '激活', | ||||||
| 							type: '|', | 							showParam: { | ||||||
| 							data: [ | 								type: '|', | ||||||
| 								{ | 								data: [ | ||||||
| 									name: 'status', | 									{ | ||||||
| 									type: 'equal', | 										name: 'status', | ||||||
| 									value: 1 | 										type: 'equal', | ||||||
| 								}, | 										value: 1 | ||||||
| 								{ | 									}, | ||||||
| 									name: 'status', | 									{ | ||||||
| 									type: 'equal', | 										name: 'status', | ||||||
| 									value: 3 | 										type: 'equal', | ||||||
| 								} | 										value: 3 | ||||||
| 							] | 									} | ||||||
|  | 								] | ||||||
|  | 							} | ||||||
| 						} | 						} | ||||||
| 					}, | 					: undefined, | ||||||
| 					{ | 					this.$auth.hasPermi(`base:core-work-order:update`) | ||||||
| 						type: 'pause', | 					? { | ||||||
| 						btnName: '暂停', | 							type: 'pause', | ||||||
| 						showParam: { | 							btnName: '暂停', | ||||||
| 							type: '|', | 							showParam: { | ||||||
| 							data: [ | 								type: '|', | ||||||
| 								{ | 								data: [ | ||||||
| 									name: 'status', | 									{ | ||||||
| 									type: 'equal', | 										name: 'status', | ||||||
| 									value: 2 | 										type: 'equal', | ||||||
| 								} | 										value: 2 | ||||||
| 							] | 									} | ||||||
|  | 								] | ||||||
|  | 							} | ||||||
| 						} | 						} | ||||||
| 					}, | 					: undefined, | ||||||
| 					{ | 					this.$auth.hasPermi(`base:core-work-order:update`) | ||||||
| 						type: 'nullify', | 					? { | ||||||
| 						btnName: '作废', | 							type: 'nullify', | ||||||
| 						showParam: { | 							btnName: '作废', | ||||||
| 							type: '|', | 							showParam: { | ||||||
| 							data: [ | 								type: '|', | ||||||
| 								{ | 								data: [ | ||||||
| 									name: 'status', | 									{ | ||||||
| 									type: 'equal', | 										name: 'status', | ||||||
| 									value: 1 | 										type: 'equal', | ||||||
| 								} | 										value: 1 | ||||||
| 							] | 									} | ||||||
|  | 								] | ||||||
|  | 							} | ||||||
| 						} | 						} | ||||||
| 					}, | 					: undefined, | ||||||
| 					{ | 					this.$auth.hasPermi(`base:core-work-order:update`) | ||||||
| 						type: 'finish', | 					? { | ||||||
| 						btnName: '完成', | 							type: 'finish', | ||||||
| 						showParam: { | 							btnName: '完成', | ||||||
| 							type: '|', | 							showParam: { | ||||||
| 							data: [ | 								type: '|', | ||||||
| 								{ | 								data: [ | ||||||
| 									name: 'status', | 									{ | ||||||
| 									type: 'equal', | 										name: 'status', | ||||||
| 									value: 2 | 										type: 'equal', | ||||||
| 								}, | 										value: 2 | ||||||
| 								{ | 									}, | ||||||
| 									name: 'status', | 									{ | ||||||
| 									type: 'equal', | 										name: 'status', | ||||||
| 									value: 3 | 										type: 'equal', | ||||||
| 								} | 										value: 3 | ||||||
| 							] | 									} | ||||||
|  | 								] | ||||||
|  | 							} | ||||||
| 						} | 						} | ||||||
| 					}, | 					: undefined, | ||||||
| 					{ | 					this.$auth.hasPermi(`base:core-work-order:update`) | ||||||
| 						type: 'stop', | 					? { | ||||||
| 						btnName: '终止', | 							type: 'stop', | ||||||
| 						showParam: { | 							btnName: '终止', | ||||||
| 							type: '|', | 							showParam: { | ||||||
| 							data: [ | 								type: '|', | ||||||
| 								{ | 								data: [ | ||||||
| 									name: 'status', | 									{ | ||||||
| 									type: 'equal', | 										name: 'status', | ||||||
| 									value: 2 | 										type: 'equal', | ||||||
| 								}, | 										value: 2 | ||||||
| 								{ | 									}, | ||||||
| 									name: 'status', | 									{ | ||||||
| 									type: 'equal', | 										name: 'status', | ||||||
| 									value: 3 | 										type: 'equal', | ||||||
| 								} | 										value: 3 | ||||||
| 							] | 									} | ||||||
|  | 								] | ||||||
|  | 							} | ||||||
| 						} | 						} | ||||||
| 					}, | 					: undefined, | ||||||
| 					this.$auth.hasPermi(`base:core-work-order:detail`) | 					this.$auth.hasPermiAnd([ | ||||||
|  | 						'base:core-work-order:query', | ||||||
|  | 						'base:order:query' | ||||||
|  | 					]) | ||||||
| 					? { | 					? { | ||||||
| 							type: 'detail', | 							type: 'detail', | ||||||
| 							btnName: '查看详情', | 							btnName: '查看详情', | ||||||
|   | |||||||
| @@ -9,7 +9,8 @@ | |||||||
| 			:table-props="tableProps" | 			:table-props="tableProps" | ||||||
| 			:page="listQuery.pageNo" | 			:page="listQuery.pageNo" | ||||||
| 			:limit="listQuery.pageSize" | 			:limit="listQuery.pageSize" | ||||||
| 			:table-data="tableData"> | 			:table-data="tableData" | ||||||
|  | 			:max-height="tableH"> | ||||||
| 			<method-btn | 			<method-btn | ||||||
| 				v-if="tableBtn.length" | 				v-if="tableBtn.length" | ||||||
| 				slot="handleBtn" | 				slot="handleBtn" | ||||||
| @@ -46,20 +47,27 @@ import { | |||||||
| 	deleteCoreWorker | 	deleteCoreWorker | ||||||
| } from '@/api/base/coreWorker'; | } from '@/api/base/coreWorker'; | ||||||
| import moment from 'moment'; | import moment from 'moment'; | ||||||
|  | import tableHeightMixin from '@/mixins/lb/tableHeightMixin'; | ||||||
|  |  | ||||||
| const tableProps = [ | const tableProps = [ | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'createTime', | 		prop: 'createTime', | ||||||
| 		label: '创建时间', | 		label: '创建时间', | ||||||
| 		filter: parseTime | 		filter: parseTime, | ||||||
|  | 		width: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'name', | 		prop: 'name', | ||||||
| 		label: '姓名' | 		label: '姓名', | ||||||
|  | 		width: 120, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'code', | 		prop: 'code', | ||||||
| 		label: '员工号' | 		label: '员工号', | ||||||
|  | 		width: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'sex', | 		prop: 'sex', | ||||||
| @@ -70,32 +78,44 @@ const tableProps = [ | |||||||
| 		prop: 'entryTime', | 		prop: 'entryTime', | ||||||
| 		label: '入职时间', | 		label: '入职时间', | ||||||
| 		filter: (val) => val ? moment(val).format('yyyy-MM-DD') : '', | 		filter: (val) => val ? moment(val).format('yyyy-MM-DD') : '', | ||||||
|  | 		width: 120, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'telephone', | 		prop: 'telephone', | ||||||
| 		label: '联系电话' | 		label: '联系电话', | ||||||
|  | 		width: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'status', | 		prop: 'status', | ||||||
| 		label: '状态', | 		label: '状态', | ||||||
| 		filter: (val) => ['', '在职', '离职'][val] | 		filter: (val) => ['', '在职', '离职'][val], | ||||||
|  | 		width: 120, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'departmentName', | 		prop: 'departmentName', | ||||||
| 		label: '部门' | 		label: '部门', | ||||||
|  | 		width: 120, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'majorName', | 		prop: 'majorName', | ||||||
| 		label: '专业' | 		label: '专业', | ||||||
|  | 		width: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'remark', | 		prop: 'remark', | ||||||
| 		label: '备注' | 		label: '备注', | ||||||
|  | 		width: 150, | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| ]; | ]; | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
| 	mixins: [basicPage], | 	mixins: [basicPage, tableHeightMixin], | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			urlOptions: { | 			urlOptions: { | ||||||
| @@ -143,7 +163,7 @@ export default { | |||||||
| 					color: 'primary', | 					color: 'primary', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: 'separate', | 					type: this.$auth.hasPermi('base:core-worker:create') ? 'separate' : '', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: this.$auth.hasPermi('base:core-worker:create') ? 'button' : '', | 					type: this.$auth.hasPermi('base:core-worker:create') ? 'button' : '', | ||||||
|   | |||||||
| @@ -9,7 +9,8 @@ | |||||||
| 			:table-props="tableProps" | 			:table-props="tableProps" | ||||||
| 			:page="listQuery.pageNo" | 			:page="listQuery.pageNo" | ||||||
| 			:limit="listQuery.pageSize" | 			:limit="listQuery.pageSize" | ||||||
| 			:table-data="tableData"> | 			:table-data="tableData" | ||||||
|  | 			:max-height="tableH"> | ||||||
| 			<method-btn | 			<method-btn | ||||||
| 				v-if="tableBtn.length" | 				v-if="tableBtn.length" | ||||||
| 				slot="handleBtn" | 				slot="handleBtn" | ||||||
| @@ -45,6 +46,7 @@ import { | |||||||
| 	getCWSectionPage, | 	getCWSectionPage, | ||||||
| 	deleteCWSection | 	deleteCWSection | ||||||
| } from '@/api/base/coreWorkshopSection'; | } from '@/api/base/coreWorkshopSection'; | ||||||
|  | import tableHeightMixin from '@/mixins/lb/tableHeightMixin'; | ||||||
|  |  | ||||||
| const tableProps = [ | const tableProps = [ | ||||||
| 	{ | 	{ | ||||||
| @@ -70,12 +72,13 @@ const tableProps = [ | |||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'remark', | 		prop: 'remark', | ||||||
| 		label: '备注' | 		label: '备注', | ||||||
|  | 		showOverflowtooltip: true | ||||||
| 	}, | 	}, | ||||||
| ]; | ]; | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
| 	mixins: [basicPage], | 	mixins: [basicPage, tableHeightMixin], | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			urlOptions: { | 			urlOptions: { | ||||||
| @@ -112,7 +115,7 @@ export default { | |||||||
| 					color: 'primary', | 					color: 'primary', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: 'separate', | 					type: this.$auth.hasPermi('base:core-workshop-section:create') ? 'separate' : '', | ||||||
| 				}, | 				}, | ||||||
| 				{ | 				{ | ||||||
| 					type: this.$auth.hasPermi('base:core-workshop-section:create') ? 'button' : '', | 					type: this.$auth.hasPermi('base:core-workshop-section:create') ? 'button' : '', | ||||||
|   | |||||||
| @@ -1,19 +1,24 @@ | |||||||
| <template> | <template> | ||||||
|   <el-drawer :visible.sync="drawer" :append-to-body="true" size="80%" > | 	<el-drawer | ||||||
|     <small-title slot="title" :no-padding="true"> | 		:visible.sync="drawer" | ||||||
|       <!-- <template v-for="demo in demoList"> --> | 		:append-to-body="true" | ||||||
|       <!-- <el-button :key="demo.name" :type="demo.name === curDemo ? 'primary' : ' '" @click="curDemo = demo.name"> --> | 		size="80%"> | ||||||
|       <!-- {{ $t('module.packingManage.printModelDesign') }} --> | 		<small-title | ||||||
|       模板设计 | 			slot="title" | ||||||
|       <!-- </el-button> --> | 			:no-padding="true"> | ||||||
|       <!-- </template> --> | 			<!-- <template v-for="demo in demoList"> --> | ||||||
|     </small-title> | 			<!-- <el-button :key="demo.name" :type="demo.name === curDemo ? 'primary' : ' '" @click="curDemo = demo.name"> --> | ||||||
|     <el-card> | 			<!-- {{ $t('module.packingManage.printModelDesign') }} --> | ||||||
|       <el-row style="margin-bottom: 10px"> | 			模板设计 | ||||||
|         <el-col :span="4"> | 			<!-- </el-button> --> | ||||||
|           <!-- 模板选择 --> | 			<!-- </template> --> | ||||||
|  | 		</small-title> | ||||||
|  | 		<el-card> | ||||||
|  | 			<el-row style="margin-bottom: 10px"> | ||||||
|  | 				<!-- <el-col :span="4"> --> | ||||||
|  | 				<!-- 模板选择 --> | ||||||
|  |  | ||||||
|           <!-- <el-select | 				<!-- <el-select | ||||||
|           v-model="mode" |           v-model="mode" | ||||||
|           filterable |           filterable | ||||||
|           :default-value="0" |           :default-value="0" | ||||||
| @@ -25,393 +30,469 @@ | |||||||
|             {{ opt.name }} |             {{ opt.name }} | ||||||
|           </el-option> |           </el-option> | ||||||
|         </el-select> --> |         </el-select> --> | ||||||
|         </el-col> | 				<!-- </el-col> --> | ||||||
|         <el-col :span="20"> | 				<el-col :span="24"> | ||||||
|           <!-- 纸张设置 --> | 					<!-- 纸张设置 --> | ||||||
|           <el-button-group style="margin:0 10px"> | 					<el-button-group style="margin: 0 10px"> | ||||||
|             <el-button v-for="(value,type) in paperTypes" :key="type" :type="curPaperType === type ? 'primary' : ' '" | 						<el-button | ||||||
|               @click="setPaper(type,value)"> | 							v-for="(value, type) in paperTypes" | ||||||
|               {{ type }} | 							:key="type" | ||||||
|             </el-button> | 							:type="curPaperType === type ? 'primary' : ' '" | ||||||
|           </el-button-group> | 							@click="setPaper(type, value)"> | ||||||
|           <el-input-number style="margin:0 10px" :value="scaleValue " :precision="2" :step="0.1" :min="scaleMin" | 							{{ type }} | ||||||
|             :max="scaleMax" @change="changeScale" /> | 						</el-button> | ||||||
|           <el-popover v-model="paperPopVisible" placement="bottom" width="300" title="设置纸张宽高(mm)"> | 					</el-button-group> | ||||||
|             <div style="display: flex;align-items: center;justify-content: space-between;margin-bottom: 10px"> | 					<el-input-number | ||||||
|               <el-input v-model="paperWidth" type="number" style=" width: 100px; text-align: center" place="宽(mm)" />~ | 						style="margin: 0 10px; width: 140px" | ||||||
|               <el-input v-model="paperHeight" type="number" style=" width: 100px; text-align: center" place="高(mm)" /> | 						:value="scaleValue" | ||||||
|             </div> | 						:precision="2" | ||||||
|             <div> | 						:step="0.1" | ||||||
|               <el-button type="primary" style="width: 100%" size="mini" @click="otherPaper">确定</el-button> | 						:min="scaleMin" | ||||||
|             </div> | 						:max="scaleMax" | ||||||
|             <el-button slot="reference" type="primary" style="margin:0 10px">自定义宽高</el-button> | 						@change="changeScale" /> | ||||||
|           </el-popover> | 					<el-popover | ||||||
|  | 						v-model="paperPopVisible" | ||||||
|  | 						placement="bottom" | ||||||
|  | 						width="300" | ||||||
|  | 						title="设置纸张宽高(mm)"> | ||||||
|  | 						<div | ||||||
|  | 							style=" | ||||||
|  | 								display: flex; | ||||||
|  | 								align-items: center; | ||||||
|  | 								justify-content: space-between; | ||||||
|  | 								margin-bottom: 10px; | ||||||
|  | 							"> | ||||||
|  | 							<el-input | ||||||
|  | 								v-model="paperWidth" | ||||||
|  | 								type="number" | ||||||
|  | 								style="width: 100px; text-align: center" | ||||||
|  | 								place="宽(mm)" /> | ||||||
|  | 							~ | ||||||
|  | 							<el-input | ||||||
|  | 								v-model="paperHeight" | ||||||
|  | 								type="number" | ||||||
|  | 								style="width: 100px; text-align: center" | ||||||
|  | 								place="高(mm)" /> | ||||||
|  | 						</div> | ||||||
|  | 						<div> | ||||||
|  | 							<el-button | ||||||
|  | 								type="primary" | ||||||
|  | 								style="width: 100%" | ||||||
|  | 								size="mini" | ||||||
|  | 								@click="otherPaper"> | ||||||
|  | 								确定 | ||||||
|  | 							</el-button> | ||||||
|  | 						</div> | ||||||
|  | 						<el-button | ||||||
|  | 							slot="reference" | ||||||
|  | 							type="primary" | ||||||
|  | 							style="margin: 0 10px"> | ||||||
|  | 							自定义宽高 | ||||||
|  | 						</el-button> | ||||||
|  | 					</el-popover> | ||||||
|  |  | ||||||
|           <!--          <a-button-group>--> | 					<!--          <a-button-group>--> | ||||||
|           <!--            <template v-for="(value,type) in paperTypes">--> | 					<!--            <template v-for="(value,type) in paperTypes">--> | ||||||
|           <!--              <a-button :type="curPaperType === type ? 'primary' : 'info'" @click="setPaper(type,value)" :key="type">--> | 					<!--              <a-button :type="curPaperType === type ? 'primary' : 'info'" @click="setPaper(type,value)" :key="type">--> | ||||||
|           <!--                {{ type }}--> | 					<!--                {{ type }}--> | ||||||
|           <!--              </a-button>--> | 					<!--              </a-button>--> | ||||||
|           <!--            </template>--> | 					<!--            </template>--> | ||||||
|           <!--            <a-popover v-model="paperPopVisible" title="设置纸张宽高(mm)" trigger="click">--> | 					<!--            <a-popover v-model="paperPopVisible" title="设置纸张宽高(mm)" trigger="click">--> | ||||||
|           <!--              <div slot="content">--> | 					<!--              <div slot="content">--> | ||||||
|           <!--                <a-input-group compact style="margin: 10px 10px">--> | 					<!--                <a-input-group compact style="margin: 10px 10px">--> | ||||||
|           <!--                  <a-input type="number" v-model="paperWidth" style=" width: 100px; text-align: center"--> | 					<!--                  <a-input type="number" v-model="paperWidth" style=" width: 100px; text-align: center"--> | ||||||
|           <!--                           placeholder="宽(mm)"/>--> | 					<!--                           placeholder="宽(mm)"/>--> | ||||||
|           <!--                  <a-input style=" width: 30px; border-left: 0; pointer-events: none; backgroundColor: #fff"--> | 					<!--                  <a-input style=" width: 30px; border-left: 0; pointer-events: none; backgroundColor: #fff"--> | ||||||
|           <!--                           placeholder="~" disabled--> | 					<!--                           placeholder="~" disabled--> | ||||||
|           <!--                  />--> | 					<!--                  />--> | ||||||
|           <!--                  <a-input type="number" v-model="paperHeight" style="width: 100px; text-align: center; border-left: 0"--> | 					<!--                  <a-input type="number" v-model="paperHeight" style="width: 100px; text-align: center; border-left: 0"--> | ||||||
|           <!--                           placeholder="高(mm)"/>--> | 					<!--                           placeholder="高(mm)"/>--> | ||||||
|           <!--                </a-input-group>--> | 					<!--                </a-input-group>--> | ||||||
|           <!--                <a-button type="primary" style="width: 100%" @click="otherPaper">确定</a-button>--> | 					<!--                <a-button type="primary" style="width: 100%" @click="otherPaper">确定</a-button>--> | ||||||
|           <!--              </div>--> | 					<!--              </div>--> | ||||||
|           <!--              <a-button :type="'other'==curPaperType?'primary':''">自定义纸张</a-button>--> | 					<!--              <a-button :type="'other'==curPaperType?'primary':''">自定义纸张</a-button>--> | ||||||
|           <!--            </a-popover>--> | 					<!--            </a-popover>--> | ||||||
|           <!--          </a-button-group>--> | 					<!--          </a-button-group>--> | ||||||
|  |  | ||||||
|           <!-- 预览/打印 --> | 					<!-- 预览/打印 --> | ||||||
|           <el-button-group> | 					<el-button-group> | ||||||
|             <el-button type="primary" icon="redo" @click="rotatePaper()">旋转</el-button> | 						<el-button | ||||||
|             <el-button type="primary" icon="el-icon-view" @click="preView"> | 							type="primary" | ||||||
|               预览 | 							icon="redo" | ||||||
|             </el-button> | 							@click="rotatePaper()"> | ||||||
|             <!-- <el-button type="primary" icon="el-icon-printer" @click="print"> | 							旋转 | ||||||
|  | 						</el-button> | ||||||
|  | 						<el-button | ||||||
|  | 							type="primary" | ||||||
|  | 							icon="el-icon-view" | ||||||
|  | 							@click="preView"> | ||||||
|  | 							预览 | ||||||
|  | 						</el-button> | ||||||
|  | 						<!-- <el-button type="primary" icon="el-icon-printer" @click="print"> | ||||||
|             直接打印 |             直接打印 | ||||||
|           </el-button> --> |           </el-button> --> | ||||||
|             <el-button type="primary" icon="el-icon-s-management" @click="save"> | 						<el-button | ||||||
|               保存 | 							type="primary" | ||||||
|             </el-button> | 							icon="el-icon-s-management" | ||||||
|             <el-button type="danger" icon="el-icon-delete" @click="clearPaper"> | 							@click="save"> | ||||||
|               清空 | 							保存 | ||||||
|             </el-button> | 						</el-button> | ||||||
|           </el-button-group> | 						<el-button | ||||||
|           <!-- 保存/清空 --> | 							type="danger" | ||||||
|  | 							icon="el-icon-delete" | ||||||
|         </el-col> | 							@click="clearPaper"> | ||||||
|       </el-row> | 							清空 | ||||||
|       <el-row :gutter="24"> | 						</el-button> | ||||||
|         <el-col :span="4"> | 					</el-button-group> | ||||||
|           <el-card style="height: 100vh"> | 					<!-- 保存/清空 --> | ||||||
|             <el-row> | 				</el-col> | ||||||
|               <el-col :span="24" class="rect-printElement-types hiprintEpContainer" /> | 			</el-row> | ||||||
|             </el-row> | 			<el-row :gutter="24"> | ||||||
|           </el-card> | 				<el-col :span="4"> | ||||||
|         </el-col> | 					<el-card style="height: 100vh"> | ||||||
|         <el-col :span="16"> | 						<el-row> | ||||||
|           <el-card class="card-design"> | 							<el-col | ||||||
|             <div id="hiprint-printTemplate" class="hiprint-printTemplate" /> | 								:span="24" | ||||||
|           </el-card> | 								class="rect-printElement-types hiprintEpContainer" /> | ||||||
|         </el-col> | 						</el-row> | ||||||
|         <el-col :span="4" class="params_setting_container"> | 					</el-card> | ||||||
|           <el-card> | 				</el-col> | ||||||
|             <el-row class="hinnn-layout-sider"> | 				<el-col :span="16"> | ||||||
|               <div id="PrintElementOptionSetting" /> | 					<el-card class="card-design"> | ||||||
|             </el-row> | 						<div | ||||||
|           </el-card> | 							id="hiprint-printTemplate" | ||||||
|         </el-col> | 							class="hiprint-printTemplate" /> | ||||||
|       </el-row> | 					</el-card> | ||||||
|       <!-- 预览 --> | 				</el-col> | ||||||
|       <print-preview ref="preView" /> | 				<el-col | ||||||
|     </el-card> | 					:span="4" | ||||||
|   </el-drawer> | 					class="params_setting_container"> | ||||||
|  | 					<el-card> | ||||||
|  | 						<el-row class="hinnn-layout-sider"> | ||||||
|  | 							<div id="PrintElementOptionSetting" /> | ||||||
|  | 						</el-row> | ||||||
|  | 					</el-card> | ||||||
|  | 				</el-col> | ||||||
|  | 			</el-row> | ||||||
|  | 			<!-- 预览 --> | ||||||
|  | 			<print-preview ref="preView" /> | ||||||
|  | 		</el-card> | ||||||
|  | 	</el-drawer> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| <script> | <script> | ||||||
|  | import printPreview from './preview'; | ||||||
| import printPreview from './preview' | import { MessageBox } from 'element-ui'; | ||||||
| import { MessageBox } from 'element-ui' | import { hiprint } from 'vue-plugin-hiprint'; | ||||||
| import { hiprint } from 'vue-plugin-hiprint' | import providers from './providers'; | ||||||
| import providers from './providers' |  | ||||||
| // import printData from './print-data' | // import printData from './print-data' | ||||||
| import $ from 'jquery' | import $ from 'jquery'; | ||||||
| import SmallTitle from './SmallTitle.vue' | import SmallTitle from './SmallTitle.vue'; | ||||||
| let hiprintTemplate = null | let hiprintTemplate = null; | ||||||
| export default { | export default { | ||||||
|   name: 'PrintCustom', | 	name: 'PrintCustom', | ||||||
|   components: { printPreview, SmallTitle }, | 	components: { printPreview, SmallTitle }, | ||||||
|   // props: { | 	// props: { | ||||||
|   //   modelData: { | 	//   modelData: { | ||||||
|   //     type: String, | 	//     type: String, | ||||||
|   //     default: '' | 	//     default: '' | ||||||
|   //   } | 	//   } | ||||||
|   // }, | 	// }, | ||||||
|   data() { | 	data() { | ||||||
|     return { | 		return { | ||||||
|       // paperPopVisible: false, | 			// paperPopVisible: false, | ||||||
|       // 模板选择 | 			// 模板选择 | ||||||
|       mode: 0, | 			mode: 0, | ||||||
|       template: null, | 			template: null, | ||||||
|       modeList: [], | 			modeList: [], | ||||||
|       // 当前纸张 | 			// 当前纸张 | ||||||
|       curPaper: { | 			curPaper: { | ||||||
|         // type: 'other', | 				// type: 'other', | ||||||
|         // width: 220, | 				// width: 220, | ||||||
|         // height: 80 | 				// height: 80 | ||||||
|       }, | 			}, | ||||||
|       printData:{}, | 			printData: {}, | ||||||
|       drawer: false, | 			drawer: false, | ||||||
|       // 纸张类型 | 			// 纸张类型 | ||||||
|       paperTypes: { | 			paperTypes: { | ||||||
|         'A3': { | 				A3: { | ||||||
|           width: 420, | 					width: 420, | ||||||
|           height: 296.6 | 					height: 296.6, | ||||||
|         }, | 				}, | ||||||
|         'A4': { | 				A4: { | ||||||
|           width: 210, | 					width: 210, | ||||||
|           height: 297 | 					height: 297, | ||||||
|         }, | 				}, | ||||||
|         'A5': { | 				A5: { | ||||||
|           width: 210, | 					width: 210, | ||||||
|           height: 147.6 | 					height: 147.6, | ||||||
|         }, | 				}, | ||||||
|         'B3': { | 				A6: { | ||||||
|           width: 500, | 					width: 95, | ||||||
|           height: 352.6 | 					height: 125, | ||||||
|         }, | 				}, | ||||||
|         'B4': { | 				B3: { | ||||||
|           width: 250, | 					width: 500, | ||||||
|           height: 352.6 | 					height: 352.6, | ||||||
|         }, | 				}, | ||||||
|         'B5': { | 				B4: { | ||||||
|           width: 250, | 					width: 250, | ||||||
|           height: 175.6 | 					height: 352.6, | ||||||
|         } | 				}, | ||||||
|       }, | 				B5: { | ||||||
|       scaleValue: 1, | 					width: 250, | ||||||
|       scaleMax: 5, | 					height: 175.6, | ||||||
|       scaleMin: 0.5, | 				}, | ||||||
|       // 自定义纸张 | 			}, | ||||||
|       paperPopVisible: false, | 			scaleValue: 1, | ||||||
|       paperWidth: '210', | 			scaleMax: 5, | ||||||
|       paperHeight: '297' | 			scaleMin: 0.5, | ||||||
|     } | 			// 自定义纸张 | ||||||
|   }, | 			paperPopVisible: false, | ||||||
|   computed: { | 			paperWidth: '210', | ||||||
|     curPaperType() { | 			paperHeight: '297', | ||||||
|       let type = 'other' | 		}; | ||||||
|       const types = this.paperTypes | 	}, | ||||||
|       for (const key in types) { | 	computed: { | ||||||
|         const item = types[key] | 		curPaperType() { | ||||||
|         const { width, height } = this.curPaper | 			let type = 'other'; | ||||||
|         if (item.width === width && item.height === height) { | 			const types = this.paperTypes; | ||||||
|           type = key | 			for (const key in types) { | ||||||
|         } | 				const item = types[key]; | ||||||
|       } | 				const { width, height } = this.curPaper; | ||||||
|       return type | 				if (item.width === width && item.height === height) { | ||||||
|     } | 					type = key; | ||||||
|   }, | 				} | ||||||
|   created() { | 			} | ||||||
|     // $('.hiprintEpContainer').empty() | 			return type; | ||||||
|   }, | 		}, | ||||||
|   destroyed () { | 	}, | ||||||
|     $('.hiprintEpContainer').empty() | 	created() { | ||||||
|     console.log(11111) | 		// $('.hiprintEpContainer').empty() | ||||||
|   }, | 	}, | ||||||
|   methods: { | 	destroyed() { | ||||||
|     // handleClose() { | 		$('.hiprintEpContainer').empty(); | ||||||
|     //   $('.hiprintEpContainer').empty() | 		console.log(11111); | ||||||
|     // }, | 	}, | ||||||
|     closed() { | 	methods: { | ||||||
|       $('.hiprintEpContainer').empty() | 		// handleClose() { | ||||||
|       $('.hiprint-printTemplate').empty() | 		//   $('.hiprintEpContainer').empty() | ||||||
|     }, | 		// }, | ||||||
|     init(data) { | 		closed() { | ||||||
|       this.drawer = true | 			$('.hiprintEpContainer').empty(); | ||||||
|       this.modelData = data | 			$('.hiprint-printTemplate').empty(); | ||||||
|       this.modeList = providers.map((e) => { | 		}, | ||||||
|         return { type: e.type, name: e.name, value: e.value } | 		init(data) { | ||||||
|       }) | 			this.drawer = true; | ||||||
|       this.changeMode() | 			this.modelData = data; | ||||||
|     }, | 			this.modeList = providers.map((e) => { | ||||||
|     changeMode() { | 				return { type: e.type, name: e.name, value: e.value }; | ||||||
|       // hiprintTemplate.clear() | 			}); | ||||||
|       // console.log(this.modelData) | 			this.changeMode(); | ||||||
|       this.$nextTick(() => { | 		}, | ||||||
|         const { mode } = this | 		changeMode() { | ||||||
|         const provider = providers[mode] | 			// hiprintTemplate.clear() | ||||||
|         hiprint.init({ | 			// console.log(this.modelData) | ||||||
|           providers: [provider.f] | 			this.$nextTick(() => { | ||||||
|         }) | 				const { mode } = this; | ||||||
|  | 				const provider = providers[mode]; | ||||||
|  | 				hiprint.init({ | ||||||
|  | 					providers: [provider.f], | ||||||
|  | 				}); | ||||||
|  |  | ||||||
|         // $('#hiprint-printTemplate').empty() | 				// $('#hiprint-printTemplate').empty() | ||||||
|         // console.log(JSON.parse(this.modelData)) | 				// console.log(JSON.parse(this.modelData)) | ||||||
|         hiprint.setConfig() | 				hiprint.setConfig(); | ||||||
|         // 替换配置 | 				// 替换配置 | ||||||
|         hiprint.setConfig({ | 				hiprint.setConfig({ | ||||||
|           movingDistance: 2.5, | 					movingDistance: 2.5, | ||||||
|           text: { | 					text: { | ||||||
|             supportOptions: [ | 						supportOptions: [ | ||||||
|               { | 							{ | ||||||
|                 name: 'styler', | 								name: 'styler', | ||||||
|                 hidden: true | 								hidden: true, | ||||||
|               }, | 							}, | ||||||
|               { | 							{ | ||||||
|                 name: 'formatter', | 								name: 'formatter', | ||||||
|                 hidden: true | 								hidden: true, | ||||||
|               } | 							}, | ||||||
|             ] | 						], | ||||||
|           } | 					}, | ||||||
|         }) | 				}); | ||||||
|  |  | ||||||
|         // console.log(this.modelData) | 				// console.log(this.modelData) | ||||||
|         // console.log($('#hiprint-printTemplate').empty()) | 				// console.log($('#hiprint-printTemplate').empty()) | ||||||
|         // if () { | 				// if () { | ||||||
|           // console.log(this.modelData); | 				// console.log(this.modelData); | ||||||
|           // $('.hiprintEpContainer').empty() | 				// $('.hiprintEpContainer').empty() | ||||||
|           // hiprint.PrintElementTypeManager.build('.hiprintEpContainer', provider.value) | 				// hiprint.PrintElementTypeManager.build('.hiprintEpContainer', provider.value) | ||||||
|           // $('.hiprint-printTemplate').empty() | 				// $('.hiprint-printTemplate').empty() | ||||||
|           // hiprintTemplate = new hiprint.PrintTemplate({ | 				// hiprintTemplate = new hiprint.PrintTemplate({ | ||||||
|           //   template: JSON.parse(this.modelData), | 				//   template: JSON.parse(this.modelData), | ||||||
|           //   settingContainer: '#PrintElementOptionSetting', | 				//   settingContainer: '#PrintElementOptionSetting', | ||||||
|           //   paginationContainer: '.hiprint-printPagination' | 				//   paginationContainer: '.hiprint-printPagination' | ||||||
|           // }) | 				// }) | ||||||
|         // } else { | 				// } else { | ||||||
|           $('.hiprintEpContainer').empty() | 				$('.hiprintEpContainer').empty(); | ||||||
|           console.log(this.modelData || {}); | 				console.log(this.modelData || {}); | ||||||
|           hiprint.PrintElementTypeManager.build('.hiprintEpContainer', provider.value) | 				hiprint.PrintElementTypeManager.build( | ||||||
|           $('.hiprint-printTemplate').empty() | 					'.hiprintEpContainer', | ||||||
|           // const templates = this.$ls.get('KEY_TEMPLATES', {}) | 					provider.value | ||||||
|           const template = provider.value | 				); | ||||||
|         // console.log(template) | 				$('.hiprint-printTemplate').empty(); | ||||||
|         if (this.modelData) { | 				// const templates = this.$ls.get('KEY_TEMPLATES', {}) | ||||||
|           hiprintTemplate = new hiprint.PrintTemplate({ | 				const template = provider.value; | ||||||
|             template: JSON.parse(this.modelData), | 				// console.log(template) | ||||||
|             settingContainer: '#PrintElementOptionSetting', | 				if (this.modelData) { | ||||||
|             paginationContainer: '.hiprint-printPagination' | 					hiprintTemplate = new hiprint.PrintTemplate({ | ||||||
|           }) | 						template: JSON.parse(this.modelData), | ||||||
|         } else { | 						settingContainer: '#PrintElementOptionSetting', | ||||||
|           hiprintTemplate = new hiprint.PrintTemplate({ | 						paginationContainer: '.hiprint-printPagination', | ||||||
|             template:{}, | 					}); | ||||||
|             settingContainer: '#PrintElementOptionSetting', | 				} else { | ||||||
|             paginationContainer: '.hiprint-printPagination' | 					hiprintTemplate = new hiprint.PrintTemplate({ | ||||||
|           }) | 						template: {}, | ||||||
|           } | 						settingContainer: '#PrintElementOptionSetting', | ||||||
|         // } | 						paginationContainer: '.hiprint-printPagination', | ||||||
|         hiprintTemplate.design('#hiprint-printTemplate') | 					}); | ||||||
|         // console.log(hiprintTemplate) | 				} | ||||||
|         console.log(hiprintTemplate); | 				// } | ||||||
|         // hiprintTemplate.design('#hiprint-printTemplate', { grid: true }) | 				hiprintTemplate.design('#hiprint-printTemplate'); | ||||||
|         // 获取当前放大比例, 当zoom时传true 才会有 | 				// console.log(hiprintTemplate) | ||||||
|         this.scaleValue = hiprintTemplate.editingPanel.scale || 1 | 				console.log(hiprintTemplate); | ||||||
|         // this.scaleValue = hiprintTemplate.editingPanel.scale || 1 | 				// hiprintTemplate.design('#hiprint-printTemplate', { grid: true }) | ||||||
|       }) | 				// 获取当前放大比例, 当zoom时传true 才会有 | ||||||
|     }, | 				this.scaleValue = hiprintTemplate.editingPanel.scale || 1; | ||||||
|     /** | 				// this.scaleValue = hiprintTemplate.editingPanel.scale || 1 | ||||||
|      * 设置纸张大小 | 			}); | ||||||
|      * @param type [A3, A4, A5, B3, B4, B5, other] | 		}, | ||||||
|      * @param value {width,height} mm | 		/** | ||||||
|      */ | 		 * 设置纸张大小 | ||||||
|     setPaper(type, value) { | 		 * @param type [A3, A4, A5, B3, B4, B5, other] | ||||||
|       try { | 		 * @param value {width,height} mm | ||||||
|         if (Object.keys(this.paperTypes).includes(type)) { | 		 */ | ||||||
|           this.curPaper = { type: type, width: value.width, height: value.height } | 		setPaper(type, value) { | ||||||
|           hiprintTemplate.setPaper(value.width, value.height) | 			try { | ||||||
|         } else { | 				if (Object.keys(this.paperTypes).includes(type)) { | ||||||
|           this.curPaper = { type: 'other', width: value.width, height: value.height } | 					this.curPaper = { | ||||||
|           hiprintTemplate.setPaper(value.width, value.height) | 						type: type, | ||||||
|         } | 						width: value.width, | ||||||
|       } catch (error) { | 						height: value.height, | ||||||
|         this.$message.error(`操作失败: ${error}`) | 					}; | ||||||
|       } | 					hiprintTemplate.setPaper(value.width, value.height); | ||||||
|     }, | 				} else { | ||||||
|     changeScale(currentValue, oldValue) { | 					this.curPaper = { | ||||||
|       let big = false | 						type: 'other', | ||||||
|       currentValue <= oldValue ? big = false : big = true | 						width: value.width, | ||||||
|       let scaleValue = this.scaleValue | 						height: value.height, | ||||||
|       if (big) { | 					}; | ||||||
|         scaleValue += 0.1 | 					hiprintTemplate.setPaper(value.width, value.height); | ||||||
|         if (scaleValue > this.scaleMax) scaleValue = 5 | 				} | ||||||
|       } else { | 			} catch (error) { | ||||||
|         scaleValue -= 0.1 | 				this.$message.error(`操作失败: ${error}`); | ||||||
|         if (scaleValue < this.scaleMin) scaleValue = 0.5 | 			} | ||||||
|       } | 		}, | ||||||
|       if (hiprintTemplate) { | 		changeScale(currentValue, oldValue) { | ||||||
|         // scaleValue: 放大缩小值, false: 不保存(不传也一样), 如果传 true, 打印时也会放大 | 			let big = false; | ||||||
|         hiprintTemplate.zoom(scaleValue) | 			currentValue <= oldValue ? (big = false) : (big = true); | ||||||
|         this.scaleValue = scaleValue | 			let scaleValue = this.scaleValue; | ||||||
|       } | 			if (big) { | ||||||
|     }, | 				scaleValue += 0.1; | ||||||
|     clearPaper() { | 				if (scaleValue > this.scaleMax) scaleValue = 5; | ||||||
|       MessageBox.confirm('是否确认清空模板信息?', '警告', { | 			} else { | ||||||
|         confirmButtonText: '确定', | 				scaleValue -= 0.1; | ||||||
|         cancelButtonText: '取消', | 				if (scaleValue < this.scaleMin) scaleValue = 0.5; | ||||||
|         type: 'warning' | 			} | ||||||
|       }).then(() => { | 			if (hiprintTemplate) { | ||||||
|         try { | 				// scaleValue: 放大缩小值, false: 不保存(不传也一样), 如果传 true, 打印时也会放大 | ||||||
|           hiprintTemplate.clear() | 				hiprintTemplate.zoom(scaleValue); | ||||||
|         } catch (error) { | 				this.scaleValue = scaleValue; | ||||||
|           this.$message.error(`操作失败: ${error}`) | 			} | ||||||
|         } | 		}, | ||||||
|       }).catch((err) => { | 		clearPaper() { | ||||||
|         console.log(err) | 			MessageBox.confirm('是否确认清空模板信息?', '警告', { | ||||||
|       }) | 				confirmButtonText: '确定', | ||||||
|     }, | 				cancelButtonText: '取消', | ||||||
|     otherPaper() { | 				type: 'warning', | ||||||
|       const value = {} | 			}) | ||||||
|       value.width = this.paperWidth | 				.then(() => { | ||||||
|       value.height = this.paperHeight | 					try { | ||||||
|       this.paperPopVisible = false | 						hiprintTemplate.clear(); | ||||||
|       this.setPaper('other', value) | 					} catch (error) { | ||||||
|     }, | 						this.$message.error(`操作失败: ${error}`); | ||||||
|     rotatePaper() { | 					} | ||||||
|       if (hiprintTemplate) { | 				}) | ||||||
|         hiprintTemplate.rotatePaper() | 				.catch((err) => { | ||||||
|       } | 					console.log(err); | ||||||
|     }, | 				}); | ||||||
|     preView() { | 		}, | ||||||
|       const { width } = this.curPaper | 		otherPaper() { | ||||||
|       this.$refs.preView.show(hiprintTemplate, this.printData, width) | 			const value = {}; | ||||||
|     }, | 			value.width = this.paperWidth; | ||||||
|     print() { | 			value.height = this.paperHeight; | ||||||
|       // if (window.hiwebSocket.opened) { | 			this.paperPopVisible = false; | ||||||
|       const printerList = hiprintTemplate.getPrinterList() | 			this.setPaper('other', value); | ||||||
|       console.log(printerList) | 		}, | ||||||
|       hiprintTemplate.print2(this.printData, { printer: '', title: '预览打印' }) | 		rotatePaper() { | ||||||
|       // return | 			if (hiprintTemplate) { | ||||||
|       // } | 				hiprintTemplate.rotatePaper(); | ||||||
|       // this.$message.error('客户端未连接,无法直接打印') | 			} | ||||||
|     }, | 		}, | ||||||
|     save() { | 		preView() { | ||||||
|       // console.log(hiprintTemplate.getJson()) | 			const { width } = this.curPaper; | ||||||
|       const { mode } = this | 			this.$refs.preView.show(hiprintTemplate, this.printData, width); | ||||||
|       const provider = providers[mode] | 		}, | ||||||
|       // console.log(hiprintTemplate.getJson()) | 		print() { | ||||||
|       this.setTemplate({ | 			// if (window.hiwebSocket.opened) { | ||||||
|         name: provider.value, | 			const printerList = hiprintTemplate.getPrinterList(); | ||||||
|         json: hiprintTemplate.getJson() | 			console.log(printerList); | ||||||
|       }) | 			hiprintTemplate.print2(this.printData, { | ||||||
|     }, | 				printer: '', | ||||||
|     setTemplate(payload) { | 				title: '预览打印', | ||||||
|       // const templates = this.$ls.get('KEY_TEMPLATES', {}) | 			}); | ||||||
|       // console.log(payload.json) | 			// return | ||||||
|       // templates[payload.name] = payload.json | 			// } | ||||||
|       // this.$ls.set('KEY_TEMPLATES', templates) | 			// this.$message.error('客户端未连接,无法直接打印') | ||||||
|       this.$message.info('保存成功') | 		}, | ||||||
|       // console.log(JSON.stringify(payload.json)) | 		save() { | ||||||
|       this.drawer = false | 			// console.log(hiprintTemplate.getJson()) | ||||||
|       this.$emit('saveData', payload.json) | 			const { mode } = this; | ||||||
|       $('.hiprintEpContainer').empty() | 			const provider = providers[mode]; | ||||||
|       // this.$parent.$parent.getModelData(payload.json) | 			// console.log(hiprintTemplate.getJson()) | ||||||
|     } | 			this.setTemplate({ | ||||||
|   } | 				name: provider.value, | ||||||
| } | 				json: hiprintTemplate.getJson(), | ||||||
|  | 			}); | ||||||
|  | 		}, | ||||||
|  | 		setTemplate(payload) { | ||||||
|  | 			// const templates = this.$ls.get('KEY_TEMPLATES', {}) | ||||||
|  | 			// console.log(payload.json) | ||||||
|  | 			// templates[payload.name] = payload.json | ||||||
|  | 			// this.$ls.set('KEY_TEMPLATES', templates) | ||||||
|  | 			this.$message.info('保存成功'); | ||||||
|  | 			// console.log(JSON.stringify(payload.json)) | ||||||
|  | 			this.drawer = false; | ||||||
|  | 			this.$emit('saveData', payload.json); | ||||||
|  | 			$('.hiprintEpContainer').empty(); | ||||||
|  | 			// this.$parent.$parent.getModelData(payload.json) | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | }; | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| <style lang="scss" scoped> | <style lang="scss" scoped> | ||||||
| // build 拖拽 | // build 拖拽 | ||||||
| ::v-deep .hiprint-printElement-type >li>ul>li>a { | ::v-deep .hiprint-printElement-type > li > ul > li > a { | ||||||
|   padding: 4px 4px; | 	padding: 4px 4px; | ||||||
|   color: #1296db; | 	color: #1296db; | ||||||
|   line-height: 1; | 	line-height: 1; | ||||||
|   height: auto; | 	height: auto; | ||||||
|   text-overflow: ellipsis; | 	text-overflow: ellipsis; | ||||||
| } | } | ||||||
| // 设计容器 | // 设计容器 | ||||||
| .card-design { | .card-design { | ||||||
|   // overflow: hidden; | 	// overflow: hidden; | ||||||
|   overflow-x: auto; | 	overflow-x: auto; | ||||||
|   overflow-y: auto; | 	overflow-y: auto; | ||||||
| } | } | ||||||
|  |  | ||||||
| </style> | </style> | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  * @Author: zwq |  * @Author: zwq | ||||||
|  * @Date: 2021-11-18 14:16:25 |  * @Date: 2021-11-18 14:16:25 | ||||||
|  * @LastEditors: DY |  * @LastEditors: DY | ||||||
|  * @LastEditTime: 2024-03-21 15:21:32 |  * @LastEditTime: 2024-04-11 16:22:19 | ||||||
|  * @Description: |  * @Description: | ||||||
| --> | --> | ||||||
| <template> | <template> | ||||||
| @@ -121,15 +121,15 @@ | |||||||
| 					</el-row> | 					</el-row> | ||||||
| 				</el-form> | 				</el-form> | ||||||
| 			</div> | 			</div> | ||||||
| 			 |  | ||||||
| 			<div class="attr-list" v-if="idAttrShow"> | 			<div class="attr-list" v-if="idAttrShow && this.$auth.hasPermi('base:material-attr:query')"> | ||||||
| 				<small-title | 				<small-title | ||||||
| 					style="margin: 16px 0; padding-left: 8px" | 					style="margin: 16px 0; padding-left: 8px" | ||||||
| 					:no-padding="true"> | 					:no-padding="true"> | ||||||
| 					物料属性 | 					物料属性 | ||||||
| 				</small-title> | 				</small-title> | ||||||
|  |  | ||||||
| 				<div v-if="!isdetail" class="action_btn"> | 				<div v-if="!isdetail && this.$auth.hasPermi('base:material-attr:create')" class="action_btn"> | ||||||
|           <template> |           <template> | ||||||
|             <span style="display: inline-block;"> |             <span style="display: inline-block;"> | ||||||
|               <el-button type="text" @click="addNew()" icon="el-icon-plus">新增</el-button> |               <el-button type="text" @click="addNew()" icon="el-icon-plus">新增</el-button> | ||||||
| @@ -182,16 +182,23 @@ import { parseTime } from '../../core/mixins/code-filter'; | |||||||
| import attrAdd from './attr-add'; | import attrAdd from './attr-add'; | ||||||
| import { getDictDatas } from "@/utils/dict"; | import { getDictDatas } from "@/utils/dict"; | ||||||
|  |  | ||||||
| const tableBtn = [ | // const tableBtn = [ | ||||||
| 	{ | // 		this.$auth.hasPermiAnd([ | ||||||
| 		type: 'edit', | // 			'base:material-attr:create', | ||||||
| 		btnName: '编辑', | // 			'base:material-attr:update' | ||||||
| 	}, | // 		]) ? | ||||||
| 	{ | // 		{ | ||||||
| 		type: 'delete', | // 			type: 'edit', | ||||||
| 		btnName: '删除', | // 			btnName: '编辑', | ||||||
| 	}, | // 		} | ||||||
| ]; | // 		: undefined, | ||||||
|  | // 	this.$auth.hasPermi('base:material-attr:delete') ?  | ||||||
|  | // 		{ | ||||||
|  | // 			type: 'delete', | ||||||
|  | // 			btnName: '删除', | ||||||
|  | // 		} | ||||||
|  | // 	: undefined, | ||||||
|  | // ]; | ||||||
| const tableProps = [ | const tableProps = [ | ||||||
| 	{ | 	{ | ||||||
| 		prop: 'createTime', | 		prop: 'createTime', | ||||||
| @@ -213,7 +220,23 @@ export default { | |||||||
| 	components: { SmallTitle, attrAdd }, | 	components: { SmallTitle, attrAdd }, | ||||||
| 	data() { | 	data() { | ||||||
| 		return { | 		return { | ||||||
| 			tableBtn, | 			tableBtn: [ | ||||||
|  | 				this.$auth.hasPermiAnd([ | ||||||
|  | 					'base:material-attr:create', | ||||||
|  | 					'base:material-attr:update' | ||||||
|  | 				]) ? | ||||||
|  | 				{ | ||||||
|  | 					type: 'edit', | ||||||
|  | 					btnName: '编辑', | ||||||
|  | 				} | ||||||
|  | 				: undefined, | ||||||
|  | 			this.$auth.hasPermi('base:material-attr:delete') ?  | ||||||
|  | 				{ | ||||||
|  | 					type: 'delete', | ||||||
|  | 					btnName: '删除', | ||||||
|  | 				} | ||||||
|  | 			: undefined, | ||||||
|  | 			], | ||||||
| 			tableProps, | 			tableProps, | ||||||
| 			addOrUpdateVisible: false, | 			addOrUpdateVisible: false, | ||||||
| 			urlOptions: { | 			urlOptions: { | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user