联调初始代码

main
duxiaoning 2023-01-09 09:55:54 +08:00
commit ea0c788d90
85 changed files with 32397 additions and 0 deletions

3
.browserslistrc Normal file
View File

@ -0,0 +1,3 @@
> 1%
last 2 versions
not dead

7
.editorconfig Normal file
View File

@ -0,0 +1,7 @@
[*.{js,jsx,ts,tsx,vue}]
indent_style = space
indent_size = 4
end_of_line = crlf
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 100

9
.env.development Normal file
View File

@ -0,0 +1,9 @@
# just a flag
ENV = 'development'
# base api
VUE_APP_BASE_API = '/dev-api'
VUE_APP_REALITY_API = '/dev-reality-api'
VUE_APP_FILE_API = '/dev-file-api'

7
.env.production Normal file
View File

@ -0,0 +1,7 @@
# just a flag
ENV = 'production'
# base api
VUE_APP_BASE_API = '/prod-api'
VUE_APP_REALITY_API = '/prod-reality-api'
VUE_APP_FILE_API = '/prod-file-api'

11
.env.staging Normal file
View File

@ -0,0 +1,11 @@
NODE_ENV = production
# just a flag
ENV = 'staging'
# base api
VUE_APP_BASE_API = '/stage-api'
VUE_APP_REALITY_API = '/stage-reality-api'
VUE_APP_FILE_API = '/stage-file-api'

17
.eslintrc.js Normal file
View File

@ -0,0 +1,17 @@
module.exports = {
root: true,
env: {
node: true
},
'extends': [
'plugin:vue/essential',
'eslint:recommended'
],
parserOptions: {
parser: 'babel-eslint'
},
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
}
}

27
.gitignore vendored Normal file
View File

@ -0,0 +1,27 @@
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
*.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# idea
.idea
/*.lock

24
README.md Normal file
View File

@ -0,0 +1,24 @@
# microwave-project
# Project setup
```
yarn install
```
### Compiles and hot-reloads for development
```
yarn serve
```
### Compiles and minifies for production
```
yarn build
```
### Lints and fixes files
```
yarn lint
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).

10
babel.config.js Normal file
View File

@ -0,0 +1,10 @@
module.exports = {
presets: ['@vue/app'],
plugins: [
['import', {
libraryName: 'vant',
libraryDirectory: 'es',
style: true,
}, 'vant']
],
};

13066
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

47
package.json Normal file
View File

@ -0,0 +1,47 @@
{
"name": "vue-cesium-self",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"start": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"animate.css": "^4.1.1",
"axios": "^0.20.0",
"babel-plugin-component": "^1.1.1",
"babel-plugin-import": "^1.13.1",
"cesium": "1.68",
"cesium-navigation-es6": "^1.0.9",
"core-js": "^3.6.5",
"echarts": "^4.9.0",
"echarts-stat": "^1.2.0",
"element-ui": "^2.15.5",
"jquery": "^3.5.1",
"js-cookie": "^3.0.1",
"jszip": "^3.10.1",
"less": "^3.12.2",
"less-loader": "^7.0.2",
"moment": "^2.29.4",
"path-to-regexp": "2.4.0",
"terraformer-wkt-parser": "^1.2.1",
"vue": "^2.6.11",
"vue-pdf": "^4.3.0",
"vue-router": "^3.2.0",
"vuex": "^3.4.0",
"wellknown": "^0.5.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-plugin-router": "~4.5.0",
"@vue/cli-plugin-vuex": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
"vue-template-compiler": "^2.6.11"
}
}

13
public/index.html Normal file
View File

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover">
<link rel="icon" href="static/images/logo.png">
<title>微波</title>
</head>
<body>
<div id="app"></div>
</body>
</html>

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
<svg id="add" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="20" height="20" viewBox="0 0 24 24"
preserveAspectRatio="xMidYMid meet"
focusable="false"
role="none"
style="pointer-events: none; display: block;fill:currentColor;color:white">
<g>
<path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 371 B

View File

@ -0,0 +1,10 @@
<svg id="ctrlPageScale" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="20" height="20" viewBox="0 0 24 24"
preserveAspectRatio="xMidYMid meet"
focusable="false"
role="none"
style="pointer-events: none; display: block;fill:currentColor;color:white">
<g>
<path fill-rule="evenodd" clip-rule="evenodd" d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 10l3.01-4.5L15 10H9zm0 4h6l-2.99 4.5L9 14zm-6 5.01h18V4.99H3v14.02z"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 532 B

View File

@ -0,0 +1,10 @@
<svg id="download" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="20" height="20" viewBox="0 0 24 24"
preserveAspectRatio="xMidYMid meet"
focusable="false"
role="none"
style="pointer-events: none; display: block;fill:currentColor;color:white">
<g>
<path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 382 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,10 @@
<svg id="menu" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="24" height="24" viewBox="0 0 24 24"
preserveAspectRatio="xMidYMid meet"
focusable="false"
role="none"
style="pointer-events: none; display: block;fill:currentColor;color:white;text-align: center;">
<g>
<path d="M2 4h16v2H2zM2 9h16v2H2zM2 14h16v2H2z"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 394 B

View File

@ -0,0 +1,10 @@
<svg id="minus" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="20" height="20" viewBox="0 0 24 24"
preserveAspectRatio="xMidYMid meet"
focusable="false"
role="none"
style="pointer-events: none; display: block;fill:currentColor;color:white">
<g>
<path d="M19 13H5v-2h14v2z"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 355 B

View File

@ -0,0 +1,10 @@
<svg id="moreMenu" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="20" height="20" viewBox="0 0 24 24"
preserveAspectRatio="xMidYMid meet"
focusable="false"
role="none"
style="pointer-events: none; display: block;fill:currentColor;color:white">
<g>
<path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 486 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

View File

@ -0,0 +1,10 @@
<svg id="print" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="20" height="20" viewBox="0 0 24 24"
preserveAspectRatio="xMidYMid meet"
focusable="false"
role="none"
style="pointer-events: none; display: block;fill:currentColor;color:white">
<g>
<path d="M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 483 B

View File

@ -0,0 +1,11 @@
<svg id="rotate" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="20" height="20" viewBox="0 0 24 24"
preserveAspectRatio="xMidYMid meet"
focusable="false"
role="none"
style="pointer-events: none; display: block;fill:currentColor;color:white">
<g>
<path d="M0 0h24v24H0z" fill="none"></path>
<path d="M7.34 6.41L.86 12.9l6.49 6.48 6.49-6.48-6.5-6.49zM3.69 12.9l3.66-3.66L11 12.9l-3.66 3.66-3.65-3.66zm15.67-6.26C17.61 4.88 15.3 4 13 4V.76L8.76 5 13 9.24V6c1.79 0 3.58.68 4.95 2.05 2.73 2.73 2.73 7.17 0 9.9C16.58 19.32 14.79 20 13 20c-.97 0-1.94-.21-2.84-.61l-1.49 1.49C10.02 21.62 11.51 22 13 22c2.3 0 4.61-.88 6.36-2.64 3.52-3.51 3.52-9.21 0-12.72z"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 740 B

26
src/App.vue Normal file
View File

@ -0,0 +1,26 @@
<template>
<div id="app">
<router-view/>
</div>
</template>
<script>
export default {
created: function () {
// sessionStorage
sessionStorage.getItem('umeetCloudVuex') && this.$store.replaceState(Object.assign(this.$store.state, JSON.parse(sessionStorage.getItem('umeetCloudVuex'))));
// vuexsessionStorage
window.addEventListener('beforeunload', () => {
sessionStorage.setItem('umeetCloudVuex', JSON.stringify(this.$store.state))
})
}
}
</script>
<style>
html, body, #app{
width: 100%;
height: 100%;
font-size: 16px;
}
</style>

17
src/api/audit.js Normal file
View File

@ -0,0 +1,17 @@
import request from '@/lib/request'
// 提交审核信息
export function orderExamine(data){
return request({
url:'orderExamine/orderExamineMsg',
method:'post',
data
})
}
//获取订单审核信息
export function getExamineMsg(orderId){
return request({
url:'orderExamine/getExamineMsg?orderId='+orderId,
method:'get'
})
}

27
src/api/common.js Normal file
View File

@ -0,0 +1,27 @@
import request from "@/lib/request";
// 获取待检验产品订单列表
export function getOrderListByStatus(data) {
return request({
url: "orderStatus/getOrderListByStatus",
method: "post",
data
});
}
// 获取待检验产品订单列表
export function getOrderListOfPending(data) {
return request({
url: "orderStatus/getOrderListOfPending",
method: "post",
headers: { "Content-Type": "multipart/form-data" },
data
});
}
// 获取待检验产品产品值
export function getProductValue(data) {
return request({
url: "GetValue/GetProductValue",
method: "post",
headers: { "Content-Type": "multipart/form-data" },
data
});
}

43
src/api/creatOrder.js Normal file
View File

@ -0,0 +1,43 @@
import request from "@/lib/request";
// 添加产品并且进行数据发布
export function addProduct(data) {
return request({
url: "/productUpload/uploadProduct",
method: "post",
headers: { "Content-Type": "multipart/form-data" },
data
});
}
// 添加订单
export function getProductList(pscId, userId, page, limit) {
return request({
url:
"productUpload/getProductList?productSubclassId=" +
pscId +
"&userId=" +
userId +
"&page=" +
page +
"&limit=" +
limit,
method: "get"
});
}
// 更新产品的等级与时间
export function updateProduct(data) {
return request({
url: "/productUpload/updateProductMsg",
method: "post",
headers: { "Content-Type": "multipart/form-data" },
data
});
}
// 添加订单
export function addOrder(data) {
return request({
url: "/validationOrder/addOrder",
method: "post",
headers: { "Content-Type": "multipart/form-data" },
data
});
}

77
src/api/home.js Normal file
View File

@ -0,0 +1,77 @@
import request from '@/lib/request'
// 获取样本数据
export function getStarSamples(data){
return request({
url:'/readExcel/parseExcel',
method:'post',
data
})
}
// 获取lc样本数据
export function getLcSamples(data){
return request({
url:'/mockSample/getLcSample',
method:'post',
data
})
}
// 获取otg样本数据
export function getOtgSamples(data){
return request({
url:'/mockSample/getOtgSample',
method:'post',
data
})
}
// 获取sol样本数据
export function getSolSamples(data){
return request({
url:'/mockSample/getSolSample',
method:'post',
data
})
}
// 选中的样本数据入库
export function insertSampleList(data){
return request({
url:'/metaDataOrder/insertSampleList',
method:'post',
headers:{'Content-Type':'multipart/form-data'},
data
})
}
// 地表覆盖类型关联入库
export function addCoverType(data){
return request({
url:'/landCoverType/addCoverType',
method:'post',
headers:{'Content-Type':'multipart/form-data'},
data
})
}
// 地表覆盖类型关联批量入库
export function addCoverTypeBatch(data){
return request({
url:'/landCoverType/addCoverTypeBatch',
method:'post',
data
})
}
// 地表覆盖类型关联入库
export function initOrderStage(data){
return request({
url:'orderStatus/initOrderStage',
method:'post',
headers:{'Content-Type':'multipart/form-data'},
data
})
}

210
src/api/pendingOrder.js Normal file
View File

@ -0,0 +1,210 @@
import request from "@/lib/request";
import realityRequest from "@/lib/request-reality";
import fileRequest from "@/lib/request-file";
// 真实性校验方法
export function checkReality(data) {
return realityRequest({
url: "check/reality",
method: "post",
headers: { "Content-Type": "multipart/form-data" },
data
});
}
export function checkTest(data) {
return realityRequest({
url: "check/my",
method: "post",
headers: { "Content-Type": "multipart/form-data" },
data
});
}
// 获取元数据信息
export function getProductMetaMsg(data) {
return realityRequest({
url: "common/getMetadataInfo",
method: "post",
data
});
}
// 获取待检验产品订单列表
export function getPendingList(data) {
return request({
url: "validationOrder/getPendingList",
method: "post",
headers: { "Content-Type": "multipart/form-data" },
data
});
}
//更新订单信息
export function updateOrderMsg(data) {
return request({
url: "validationOrder/update",
method: "post",
data
});
}
// 获取订单信息
export function getProductMsg(data) {
return request({
url: "validationOrder/getOrderMsg",
method: "post",
data
});
}
//更新订单编辑状态
export function updateOrderStatus(orderId) {
return request({
url: "/validationOrder/updateTime?id=" + orderId,
method: "get"
});
}
//更新订单编辑状态
export function disOrderStatus(orderId) {
return request({
url: "/validationOrder/updateByIdTimeNull?id=" + orderId,
method: "get"
});
}
// 根据抽样算法获取抽样后样本数据
export function getSampleData(data) {
return realityRequest({
url: "sampleGet/getSampleData",
method: "post",
headers: { "Content-Type": "multipart/form-data" },
data
});
}
// 分层抽样获取样本数据
export function getSamplesByLayer(data) {
return realityRequest({
url: "sampleGet/getSamplesByLayer",
method: "post",
headers: { "Content-Type": "multipart/form-data" },
data
});
}
// 获取订单关联的所有样本数据
export function getOrderSamples(orderId, productType) {
return request({
url: "metaDataOrder/getOrderSamples?orderId=" + orderId + "&productType=" + productType,
method: "post"
});
}
// 根据样本ID删除订单样本数据
export function deleteOrderSamplesByID(sampleId, productType) {
return request({
url:
"metaDataOrder/deleteOrderSamplesByID?sampleId=" +
sampleId +
"&productType=" +
productType,
method: "post"
});
}
// 抽样后样本数据入库
export function addConnectSamples(data) {
return request({
url: "metaDataOrder/updateConnectSamples",
method: "post",
headers: { "Content-Type": "multipart/form-data" },
data
});
}
// 查询订单关联的地物映射关系
export function getCoverTypes(orderId) {
return request({
url: "landCoverType/getCoverType?orderId=" + orderId,
method: "post"
});
}
// 地表覆盖类型与空基类型关联
export function updateFeature(data) {
return request({
url: "landCoverType/updateCoverType",
method: "post",
headers: { "Content-Type": "multipart/form-data" },
data
});
}
// 订单反馈
export function orderFeedback(data) {
return request({
url: "ordersFeedback/orderFeedback",
method: "post",
headers: { "Content-Type": "multipart/form-data" },
data
});
}
// 订单状态更新
export function updateOrderStage(data) {
return request({
url: "orderStatus/updateOrderStage",
method: "post",
headers: { "Content-Type": "multipart/form-data" },
data
});
}
// 导出pdf模板
export function exportWord(data, pdfName, localTiffPath, httpTiffPath, productType) {
return fileRequest({
url:
"importPDF/importWordAndPDF?reportName=" +
pdfName +
"&localTiffPath=" +
localTiffPath +
"&httpTiffPath=" +
httpTiffPath +
"&productType=" +
productType,
method: "post",
// headers:{'Content-Type':'multipart/form-data'},
data
});
}
//下载PDF报告
export function downloadPdf(url) {
return request({
url: url,
responseType: "blob",
method: "GET"
});
}
// 添加报告信息
export function addReportMsg(data) {
return request({
url: "validationReport/addReportMsg",
headers: { "Content-Type": "multipart/form-data" },
method: "post",
data
});
}
// 查询报告信息
export function getReportMsg(orderId) {
return request({
url: "validationReport/getReportMsg?orderId=" + orderId,
method: "get"
});
}
//获取订单处理失败的信息
export function getFeedbackMsg(orderId) {
return request({
url: "ordersFeedback/getFeedbackMsg?orderId=" + orderId,
method: "get"
});
}

10
src/api/user.js Normal file
View File

@ -0,0 +1,10 @@
import request from '@/lib/request'
// 用户登录
export function login(data){
return request({
url:'user/login',
method:'post',
data
})
}

13
src/assets/css/global.css Normal file
View File

@ -0,0 +1,13 @@
* {
margin: 0;
padding: 0;
}
html,body,#app {
width: 100%;
height: 100%;
overflow:hidden;
}
.cesium-viewer-bottom{
display: none !important;
}

BIN
src/assets/images/close.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -0,0 +1,89 @@
<template>
<el-breadcrumb class="navbread" separator="/">
<transition-group name="breadcrumb">
<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>
<a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
</el-breadcrumb-item>
</transition-group>
</el-breadcrumb>
</template>
<script>
import pathToRegexp from 'path-to-regexp'
export default {
data() {
return {
levelList: null
}
},
watch: {
$route(route) {
// if you go to the redirect page, do not update the breadcrumbs
if (route.path.startsWith('/redirect/')) {
return
}
this.getBreadcrumb()
}
},
created() {
this.getBreadcrumb()
},
methods: {
getBreadcrumb() {
// only show routes with meta.title
let matched = this.$route.matched.filter(item => item.meta && item.meta.title)
const first = matched[0]
if (!this.isDashboard(first)) {
matched = [{ path: '/', meta: { title: '首页' }}].concat(matched)
}
this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
},
isDashboard(route) {
const name = route && route.name
if (!name) {
return false
}
return name.trim().toLocaleLowerCase() === '首页'.toLocaleLowerCase()
},
pathCompile(path) {
const { params } = this.$route
var toPath = pathToRegexp.compile(path)
return toPath(params)
},
handleLink(item) {
const { redirect, path } = item
if (redirect) {
this.$router.push(redirect)
return
}
this.$router.push(this.pathCompile(path))
}
}
}
</script>
<style scoped lang='less'>
.app-breadcrumb.el-breadcrumb {
display: inline-block;
font-size: 14px;
line-height: 50px;
margin-left: 8px;
.no-redirect {
color: #97a8be;
cursor: text;
}
}
// .navbread{
// display: inline-block;
// vertical-align: top;
// font-size: 16px;
// // font-weight: 400;
// position: relative;
// top: 2.5px;
// }
</style>

View File

@ -0,0 +1,101 @@
<template>
<div :class="{'hidden':hidden}" class="pagination-container">
<el-pagination
:background="background"
:current-page.sync="currentPage"
:page-size.sync="pageSize"
:layout="layout"
:page-sizes="pageSizes"
:total="total"
v-bind="$attrs"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</template>
<script>
import { scrollTo } from '@/lib/scroll-to'
export default {
name: 'Pagination',
props: {
total: {
required: true,
type: Number
},
page: {
type: Number,
default: 1
},
limit: {
type: Number,
default: 20
},
pageSizes: {
type: Array,
default() {
return [10, 20, 30, 50]
}
},
layout: {
type: String,
default: 'total, sizes, prev, pager, next, jumper'
},
background: {
type: Boolean,
default: true
},
autoScroll: {
type: Boolean,
default: true
},
hidden: {
type: Boolean,
default: false
}
},
computed: {
currentPage: {
get() {
return this.page
},
set(val) {
this.$emit('update:page', val)
}
},
pageSize: {
get() {
return this.limit
},
set(val) {
this.$emit('update:limit', val)
}
}
},
methods: {
handleSizeChange(val) {
this.$emit('pagination', { page: this.currentPage, limit: val })
if (this.autoScroll) {
scrollTo(0, 800)
}
},
handleCurrentChange(val) {
this.$emit('pagination', { page: val, limit: this.pageSize })
if (this.autoScroll) {
scrollTo(0, 800)
}
}
}
}
</script>
<style scoped>
.pagination-container {
background: #fff;
padding: 16px;
}
.pagination-container.hidden {
display: none;
}
</style>

View File

@ -0,0 +1,43 @@
<template>
<div id="qtReportEchart" ref="chart"></div>
</template>
<script>
export default {
name: "qtReportEchart",
props: {},
mounted() {
this.$nextTick(function() {
this.drawPie();
});
},
methods: {
drawPie() {
let myCharts = this.$echarts.init(this.$refs.chart);
let option = {
xAxis: {
type: 'category',
data: [820, 932, 901, 934, 1290, 1330, 1320]
},
yAxis: {
type: 'value'
},
series: [
{
data: [820, 932, 901, 934, 1290, 1330, 1320],
type: 'line',
smooth: true
}
]
};
option &&myCharts.setOption(option);
}
}
};
</script>
<style scoped>
#qtReportEchart {
width: 100%;
height: 100%;
position: relative;
}
</style>

View File

@ -0,0 +1,61 @@
<template>
<div id="rtReportEcharts" ref="chart"></div>
</template>
<script>
export default {
name: "rtReportEcharts",
props: {},
mounted() {
this.$nextTick(function() {
this.drawPie();
});
},
methods: {
drawPie() {
let myCharts = this.$echarts.init(this.$refs.chart);
let option = {
xAxis: {},
yAxis: {},
series: [
{
symbolSize: 20,
data: [
[10.0, 8.04],
[8.07, 6.95],
[13.0, 7.58],
[9.05, 8.81],
[11.0, 8.33],
[14.0, 7.66],
[13.4, 6.81],
[10.0, 6.33],
[14.0, 8.96],
[12.5, 6.82],
[9.15, 7.2],
[11.5, 7.2],
[3.03, 4.23],
[12.2, 7.83],
[2.02, 4.47],
[1.05, 3.33],
[4.05, 4.96],
[6.03, 7.24],
[12.0, 6.26],
[12.0, 8.84],
[7.08, 5.82],
[5.02, 5.68]
],
type: 'scatter'
}
]
};
option &&myCharts.setOption(option);
}
}
};
</script>
<style scoped>
#rtReportEcharts {
width: 100%;
height: 100%;
position: relative;
}
</style>

View File

@ -0,0 +1,37 @@
<template>
<div class="header">
<img src="/static/images/header.png" alt="#" style="height: 50px; margin-top: 5px" />
<i class="el-icon-user-solid userName">
<span>{{ userName }}</span>
</i>
</div>
</template>
<script>
export default {
methods: {},
computed: {
userName: function() {
return localStorage.getItem("userName");
}
}
};
</script>
<style>
.header {
background: white;
height: 60px;
}
.userName {
font-size: 20px;
color: #354595;
float: right;
margin-top: 30px;
margin-right: 20px;
}
.userName span {
color: #000;
margin-left: 10px;
}
</style>

View File

@ -0,0 +1,52 @@
<template>
<div class="iconbox" @click="daichuli" title="登录">
<div><span class="yuan"></span><span class="box"></span></div>
<div><span class="yuan"></span><span class="box"></span></div>
<div><span class="yuan"></span><span class="box"></span></div>
</div>
</template>
<script>
export default {
name: "iconBox",
components: {},
data() {
return {};
},
methods: {
daichuli() {
this.$router.push({ path: this.configration.path.login, query: {} });
},
},
};
</script>
<style scoped lang='less'>
.iconbox {
/* width: 80px; */
position: absolute;
left: 3px;
top: 70px;
background-color: transparent;
z-index: 1;
border-radius: 4px;
}
.iconbox div {
height: 10px;
}
.yuan {
display: inline-block;
width: 4px;
height: 4px;
background-color: white;
border-radius: 50%;
margin-left: 10px;
}
.box {
height: 5px;
width: 30px;
display: inline-block;
background-color: white;
margin-left: 3px;
}
</style>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,340 @@
<template>
<div>
<el-form
:model="searchForm"
class="demo-form-inline"
style="padding: 20px 0 0 30px; text-algin: center"
>
<el-row>
<el-col :span="8">
<el-form-item label="提交日期">
<el-date-picker
v-model="searchForm.submitDate"
type="datetimerange"
range-separator="~"
start-placeholder="开始日期"
end-placeholder="结束日期"
popper-class="date-style"
value-format=" yyyy-MM-dd HH:mm:ss"
format="yyyy-MM-dd HH:mm:ss"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="卫星类型">
<el-select
v-model="searchForm.satellite"
placeholder="请选择卫星"
@change="bindLoad"
>
<el-option
v-for="item in stlOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="载荷选择">
<el-select v-model="searchForm.load" placeholder="全部">
<el-option
v-for="item in loadOpt"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="产品大类">
<el-select
v-model="searchForm.category"
placeholder="全部"
@change="getCategory($event)"
>
<el-option
v-for="item in cgOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="产品小类">
<el-select v-model="searchForm.cldCategory" placeholder="全部">
<el-option
v-for="item in cldcgOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检验类型">
<el-select v-model="searchForm.checkoutFun" placeholder="全部">
<el-option
v-for="item in ckfOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="订单编号">
<el-input v-model="searchForm.orderCode"> </el-input>
</el-form-item>
</el-col>
<el-col :span="8" v-if="extSearch">
<el-form-item label="订单状态">
<el-select
v-model="searchForm.extOption"
placeholder="全部"
ref="test11"
>
<el-option
v-for="item in extOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="submitSearch">
<el-button type="primary" @click="search"></el-button>
</div>
</div>
</template>
<script>
let categorySele = [
{ value: "", label: "" },
{ value: 1, label: "几何产品" },
{ value: 2, label: "辐射产品" },
{ value: 3, label: "陆表产品" },
{ value: 4, label: "植被产品" },
];
let allCategory = [
{ pro: 1, label: "", value: "" },
{ pro: 2, label: "", value: "" },
{ pro: 3, label: "", value: "" },
{ pro: 4, label: "", value: "" },
{ pro: 1, label: "正射校正", value: 1 },
{ pro: 1, label: "高程产品", value: 2 },
{ pro: 2, label: "后向散射系数", value: 3 },
{ pro: 2, label: "大气延迟校正", value: 4 },
{ pro: 3, label: "地表粗糙度", value: 9 },
{ pro: 3, label: "地表覆盖类型", value: 6 },
{ pro: 3, label: "土壤水分", value: 7 },
{ pro: 3, label: "地表盐碱度", value: 8 },
{ pro: 3, label: "干涉测量形变产品", value: 5 },
{ pro: 4, label: "植被高度", value: 10 },
{ pro: 4, label: "叶面积指数", value: 11 },
{ pro: 4, label: "植被物候", value: 12 },
];
export default {
props: {
getOrderList: {
type: Function,
default: null,
},
extSearch: {},
},
data() {
return {
value1: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)],
searchForm: {
submitDate: "",
satellite: "",
load: "",
category: "",
cldCategory: "",
checkoutFun: "",
orderCode: "",
extOption: "",
},
stlOptions: [
{
value: "",
label: "",
},
{
value: "1米C-SAR卫星",
label: "1米C-SAR卫星",
},
{
value: "3米L-SAR卫星",
label: "3米L-SAR卫星",
},
{
value: "5米S-SAR卫星",
label: "5米S-SAR卫星",
},
{
value: "高轨20米SAR卫星",
label: "高轨20米SAR卫星",
},
],
loadOptions: [
{
value: "",
label: "",
},
{
value: "1米C-SAR",
label: "1米C-SAR",
},
{
value: "3米L-SAR",
label: "3米L-SAR",
},
{
value: "5米S-SAR",
label: "5米S-SAR",
},
{
value: "高轨20米SAR",
label: "高轨20米SAR",
},
],
loadOpt: [],
cgOptions: categorySele,
cldcgOptions: [],
ckfOptions: [
{
value: "",
label: "",
},
{
value: "directChk",
label: "直接检验",
},
],
extOptions: [
{ value: "", label: "" },
{ value: "2", label: "处理成功" },
{ value: "3", label: "处理失败" },
{ value: "6", label: "审核通过" },
{ value: "7", label: "审核未通过" },
],
};
},
methods: {
//
bindLoad(val) {
const item = this.loadOptions.filter(
(item) => item.value + "卫星" === val
);
if (item && item.length > 0) {
this.loadOpt = item;
this.searchForm.load = item[0].value;
} else {
this.loadOpt = [];
this.searchForm.load = "";
}
},
//
getCategory(prov) {
this.searchForm.cldCategory = "";
let roles = [];
this.cldcgOptions = [];
this.cldCategory = "";
for (var val of allCategory) {
if (prov === val.pro) {
roles.push({ label: val.label, value: val.value });
}
}
this.cldcgOptions = roles;
this.cldCategory = this.cldcgOptions[0].value;
},
//
search() {
//
this.$emit("initPage");
if (this.getOrderList) {
this.getOrderList();
}
},
},
};
</script>
<style scoped lang="less">
/deep/.el-date-editor--datetimerange.el-input,
.el-date-editor--datetimerange.el-input__inner {
width: 270px;
height: 35px;
line-height: 30px;
}
/deep/.el-range-editor.el-input__inner {
padding: 1px 10px;
}
/deep/ .el-input {
width: 270px;
}
.submitSearch {
text-align: center;
}
/deep/.submitSearch .el-button--primary {
width: 160px;
height: 35px;
// margin-top: 20px;
margin-bottom: 20px;
}
/deep/.el-button {
line-height: 0;
}
// /deep/.date-style .el-date-picker {
// width: 190px !important;
// height: 235px !important;
// // .el-picker-panel {
// line-height: 0px;
// // }
// .el-picker-panel__content {
// width: 155px !important;
// height: 180px !important;
// }
// table {
// font-size: 11px;
// }
// .el-date-picker__header {
// margin: 5px;
// }
// .el-date-picker__header-label {
// font-size: 11px;
// }
// .el-date-picker__header el-date-picker__header-label {
// font-size: 11px;
// }
// .el-date-table td, .el-date-table td div {
// height: 22px;
// }
// .el-month-table td .cell,
// .el-year-table td .cell,
// .el-date-table td .cell {
// width: 100%;
// }
// }
</style>

View File

@ -0,0 +1,55 @@
<template>
<div class="info">
<div class="box">
<el-checkbox
v-model="prodChecked"
@change="prodCheckChanged"
class="checkbox"
>待检验产品</el-checkbox
>
</div>
</div>
</template>
<script>
export default {
name: "otgProductInfo",
data() {
return {
prodChecked: true,
sampleChecked: true,
};
},
methods: {
prodCheckChanged() {
if (this.prodChecked) {
this.$emit("addLayer");
} else {
this.$emit("removeLayer");
}
},
},
};
</script>
<style scoped>
.info {
position: absolute;
/* left: 10px; */
right: 10px;
bottom: 10px;
background-color: transparent;
z-index: 2;
border-radius: 4px;
}
.iconbox div {
border-radius: 5px;
}
.box {
background-color: white;
margin-left: 3px;
border-radius: 5px;
align-items: center;
padding: 10px 15px;
}
</style>

View File

@ -0,0 +1,330 @@
<template>
<div class="pdfLoad">
<div class="pdfCtrl">
<div class="ctrlStart">
<!-- 缩略图菜单按钮 -->
<!-- <div class="viewMenu"></div> -->
<span class="pdfName">{{pdfName}}</span>
</div>
<div class="ctrlCenter">
<div class="pageCtrl" >
<div class="pageNum">
<el-input v-model="changePageNum" @change="changePage"></el-input>
</div>
<span style="margin:0 5px 0 5px">/</span>
<span>{{pageTotalNum}}</span>
</div>
<span class="halvingLine">|</span>
<div class="changeScale">
<div class="minus" @click="scaleSmall"></div>
<div class="csVal">
<el-input v-model="changeScaleVal"></el-input>
</div>
<div class="add" @click="scaleBig"></div>
</div>
<span class="halvingLine">|</span>
<div class="ctrlStyle">
<!-- 缩放适应宽度按钮 -->
<!-- <div class="ctrlPageScale"></div> -->
<div class="rotate" @click="counterClock"></div>
</div>
</div>
<div class="ctrlEnd">
<!-- <div class="ctrlEndMenu moreMenu"></div> -->
<div class="ctrlEndMenu print" @click="pdfPrintAll"></div>
<div class="ctrlEndMenu download" @click="pdfDownload"></div>
</div>
</div>
<div class="pdfDom">
<pdf
ref="pdf"
:src="pdfUrl"
:page="pageNum"
:rotate="pageRotate"
@progress="loadedRatio = $event"
@page-loaded="pageLoaded($event)"
@num-pages="pageTotalNum=$event"
@error="pdfError($event)"
@link-clicked="page = $event"
></pdf>
<!-- <pdf v-for="i in numPages" :key="i" :src="pdfsrc" :page="i"></pdf> -->
</div>
</div>
</template>
<script>
import pdf from 'vue-pdf'
export default {
components: {
pdf
},
mounted() {
// this.getNumPages(this.pdfUrl)
},
props:{
pdfPath:{
require:true
}
},
data(){
return{
pdfName:'DBFGLX_202108051103.pdf',
pdfUrl:'static/data/DBTRSF_202110201117536410.pdf',
pageNum: 1,
pageTotalNum: 1,
changePageNum:1,
pageRotate: 0,
//
loadedRatio: 0,
curPageNum: 0,
numPages:1,
changeScaleVal:"100%",
// pdfsrc:'',
pdfScale:100
}
},
created(){
this.init();
},
methods:{
init(){
const pos = this.pdfPath.lastIndexOf("/");
this.pdfName = this.pdfPath.substr(pos+1)
// this.pdfUrl = 'http://10.0.35.70:8085/microwaveData/pdf/'+this.pdfName;
this.pdfUrl = this.configration.urlprefix.pdfUrlPrefix+this.pdfName;
},
getNumPages(url) {
var loadingTask = pdf.createLoadingTask(url)
loadingTask.promise.then(pdf =>{
this.pdfsrc = loadingTask
this.numPages = pdf.numPages
this.pageTotalNum = pdf.numPages
}).catch((err) => {
console.error('pdf加载失败')
})
},
//
prePage() {
var page = this.pageNum
page = page > 1 ? page - 1 : this.pageTotalNum
this.pageNum = page
},
nextPage() {
var page = this.pageNum
page = page < this.pageTotalNum ? page + 1 : 1
this.pageNum = page
},
changePage(){
if(this.changePageNum <= 0 || this.changePageNum > this.pageTotalNum)return;
var page = Number(this.changePageNum)
this.pageNum = page
},
// 90
counterClock() {
this.pageRotate -= 90
},
// e
pageLoaded(e) {
this.curPageNum = e
},
//
pdfError(error) {
console.error(error)
},
scaleBig() {
this.pdfScale += 5;
this.$refs.pdf.$el.style.width = parseInt(this.pdfScale) + "%";
this.changeScaleVal = parseInt(this.pdfScale) + "%"
},
scaleSmall() {
this.pdfScale += -5;
this.$refs.pdf.$el.style.width = parseInt(this.pdfScale) + "%";
this.changeScaleVal = parseInt(this.pdfScale) + "%"
},
//PDF
pdfDownload () {
var url = this.pdfUrl
var tempLink = document.createElement('a')
tempLink.style.display = 'none'
tempLink.href = url
tempLink.setAttribute('download', 'my.pdf')
if (typeof tempLink.download === 'undefined') {
tempLink.setAttribute('target', '_blank')
}
document.body.appendChild(tempLink)
tempLink.click()
document.body.removeChild(tempLink)
},
pdfPrintAll() {
this.$refs.pdf.print()
},
}
}
</script>
<style scoped lang="less">
.padLoad{
width: 100%;
height: 100%;
}
.pdfCtrl{
// width: 100%;
height: 56px;
background-color: rgb(50,54,57);
color: white;
// padding: 0 16px;
font-size: 15px;
}
.ctrlStart {
width: 25%;
height: 100%;
float: left;
align-items: center;
display: flex;
overflow: hidden;
padding-inline-end: 20px;
vertical-align: middle;
.viewMenu{
width: 24px;
height: 24px;
margin:3px 0 0 3px;
background-image: url(/static/images/menu.svg);
cursor: pointer;
}
.pdfName {
font-size: 0.87rem;
font-weight: 500;
margin-inline-start: 16px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: gray;
}
}
.ctrlCenter{
width: 50%;
float: left;
height: inherit;
line-height: 56px;
text-align: center;
.pageCtrl{
float: left;
display: flex;
}
.changeScale{
float: left;
display: flex;
align-items: center;
vertical-align: middle;
.minus{
width: 20px;
height: 20px;
background-image: url(/static/images/minus.svg);
cursor: pointer;
}
.csVal{
margin: 0 4px 0 6px;
}
.add{
width: 20px;
height: 20px;
background-image: url(/static/images/add.svg);
cursor: pointer;
}
}
.ctrlStyle{
// width: calc(35% - 21px);
height: inherit;
float: left;
display: flex;
align-items: center;
vertical-align: middle;
.ctrlPageScale{
width: 20px;
height: 20px;
margin: 0 10px 0 10px;
background-image: url(/static/images/ctrlPageScale.svg);
cursor: pointer;
}
.rotate{
width: 20px;
height: 20px;
background-image: url(/static/images/rotate.svg);
cursor: pointer;
}
}
}
/deep/.csVal .el-input__inner {
background-color: #0e0e0e;
border-radius: 1px;
border: 1px solid rgb(50,54,57);
height: 26px;
line-height: 26px;
padding: 0;
width: 50px;
color: white;
text-align: center;
}
/deep/.pageNum .el-input__inner {
-webkit-appearance: none;
background-color: #0e0e0e;
background-image: none;
border-radius: 1px;
border: 1px solid rgb(50,54,57);
box-sizing: border-box;
font-size: inherit;
height: 26px;
line-height: 17px;
outline: 0;
padding: 0;
transition: border-color .2s cubic-bezier(.645,.045,.355,1);
width: 22px;
color: white;
text-align: center;
}
.ctrlEnd{
padding-inline-end: 20px;
// width: calc(25% - 40px);
height: inherit;
float: right;
line-height: 56px;
text-align: end;
i{
margin: 0 6px 0 6px;
font-size: 16px;
}
}
// 线
.halvingLine{
float:left;
margin: 0 10px 0 10px;
color: #c1bdbd;
width: 3px;
}
.ctrlEndMenu{
width: 20px;
height: 20px;
float: right;
margin: 18px 0 0 6px;
cursor: pointer;
}
.download{
background-image: url(/static/images/download.svg);
}
.print{
background-image: url(/static/images/print.svg);
}
.moreMenu{
background-image: url(/static/images/moreMenu.svg);
}
.pdfDom{
width: inherit;
height: 883px;
background-color: white;
overflow: hidden;
overflow-y: auto;
overflow-x: auto;
}
</style>

View File

@ -0,0 +1,73 @@
<template>
<div class="info">
<div class="box">
<el-checkbox
v-model="prodChecked"
@change="prodCheckChanged"
class="checkbox"
>待检验产品</el-checkbox
>
<el-checkbox
v-model="sampleChecked"
@change="sampleCheckChanged"
class="checkbox"
>样本点</el-checkbox
>
</div>
</div>
</template>
<script>
export default {
name: "productInfo",
data() {
return {
prodChecked: true,
sampleChecked: true,
};
},
methods: {
prodCheckChanged() {
if (this.prodChecked) {
this.$emit("addLayer");
} else {
this.$emit("removeLayer");
}
},
sampleCheckChanged() {
if (this.sampleChecked) {
this.$emit("addSample");
} else {
this.$emit("removeSample");
}
},
},
};
</script>
<style scoped>
.info {
margin-left: 10px;
display: inline-block;
position: relative;
left: 30px;
top: 30px;
background-color: transparent;
z-index: 999;
border-radius: 4px;
}
.iconbox div {
width: 160px;
height: 75px;
border-radius: 5px;
}
.box {
height: 55px;
width: 160px;
background-color: white;
margin-left: 3px;
border-radius: 5px;
align-items: center;
padding: 10px 15px;
}
</style>

View File

@ -0,0 +1,253 @@
<template>
<div class="qtReport">
<div class="realResult">
<div class="box1">
<span class="sp1"></span><span class="sp2">真实性检验结果</span>
</div>
<div class="resContent">
<div>
<el-tabs v-model="activeTabs">
<el-tab-pane label="误差矩阵" name="pixel">
<ReportTable
:errorMatrix="errorMatrix"
activeTabs="pixel"
></ReportTable>
</el-tab-pane>
<!-- <el-tab-pane label="百分比(%)" name="percentage">
<ReportTable
:errorMatrix="errorMatrix"
activeTabs="percentage"
></ReportTable>
</el-tab-pane> -->
<!-- <el-tab-pane label="精度评价" name="preEval">
<ReportTable :errorMatrix="errorMatrix" activeTabs="preEval"></ReportTable>
</el-tab-pane> -->
<el-tab-pane label="用户精度" name="userPre">
<ReportTable
:errorMatrix="errorMatrix"
:preResults="preResults['用户精度']"
activeTabs="userPre"
></ReportTable>
</el-tab-pane>
<el-tab-pane label="生产者精度" name="producerPre">
<ReportTable
:errorMatrix="errorMatrix"
:preResults="preResults['生产者精度']"
activeTabs="producerPre"
></ReportTable>
</el-tab-pane>
<el-tab-pane label="错分精度" name="errorPre">
<ReportTable
:errorMatrix="errorMatrix"
:preResults="preResults['错分误差']"
activeTabs="errorPre"
></ReportTable>
</el-tab-pane>
<el-tab-pane label="漏分精度" name="LeakagePre">
<ReportTable
:errorMatrix="errorMatrix"
:preResults="preResults['漏分误差']"
activeTabs="LeakagePre"
></ReportTable>
</el-tab-pane>
</el-tabs>
</div>
</div>
</div>
<div class="groudCoverType">
<div class="box1">
<span class="sp1"></span
><span class="sp2">{{ pdSubTypeName }}误差结果图</span>
</div>
<div class="gctContent">
<div id="qtReportEchart" ref="chart"></div>
</div>
</div>
</div>
</template>
<script>
import ReportTable from "@/components/reportTable";
import { productTypeMap } from "@/lib/variateMap";
export default {
components: {
ReportTable,
},
props: {
realRes: {
require: true,
},
pdSubType: {
require: true,
},
},
data() {
return {
activeTabs: "pixel",
pdSubTypeName: null,
myCharts: null,
errorMatrix: null,
preResults: null,
};
},
created() {
this.initParam();
},
mounted() {
this.myCharts = this.$echarts.init(this.$refs.chart);
if (this.realRes.rocCoordinateValues !== undefined)
this.drawPie(this.realRes.rocCoordinateValues);
},
methods: {
initParam() {
if (this.realRes !== undefined) {
this.pdSubTypeName = productTypeMap(this.pdSubType);
this.errorMatrix = this.realRes.report["" + 8 + ""]
? this.realRes.report["" + 8 + ""]
: [];
this.preResults = this.realRes.results ? this.realRes.results : {};
}
},
drawPie(rocVal) {
let allData = [];
for (let i in rocVal) {
let ad = [];
ad.push(
parseFloat(rocVal[i].cre_falseAlarmX.toFixed(3)),
parseFloat(rocVal[i].cre_reCallY.toFixed(3))
);
allData.push(ad);
}
let option = {
animation: false,
tooltip: {
formatter: "({c})",
},
xAxis: {
name: "漏分精度",
nameLocation: "middle",
nameTextStyle: {
lineHeight: 30,
height: 60,
fontWeight: "bold",
},
min: 0,
max: 1,
axisLabel: {
formatter: function (value) {
return Number(value).toFixed(1);
},
},
},
yAxis: {
name: "用户精度",
nameTextStyle: {
lineHeight: 30,
height: 60,
fontWeight: "bold",
},
min: 0,
max: 1,
axisLabel: {
formatter: function (value) {
return Number(value).toFixed(1);
},
},
},
series: [
{
symbolSize: 10,
data: allData,
type: "scatter",
},
],
};
option && this.myCharts.setOption(option);
},
},
};
</script>
<style scoped lang="less">
.qtReport {
width: 100%;
height: 100%;
}
.realResult {
width: 100%;
height: calc(55% - 5px);
background-color: white;
margin-bottom: 5px;
}
.groudCoverType {
width: 100%;
height: 45%;
background-color: white;
}
.resContent {
// border: 1px black solid;
height: calc(100% - 60px);
width: calc(100% - 20px);
margin: 10px;
font-size: 20px;
overflow-y: scroll;
.rptitle {
display: block;
float: left;
font-size: 16px;
span {
color: #354595;
font-weight: bold;
}
}
.sampling {
width: calc(40% - 6px);
text-align: start;
margin-left: 6px;
}
.pixelDeal {
width: calc(60% - 6px);
text-align: end;
margin-right: 6px;
}
}
/deep/.resContent .el-tabs__header {
margin: 0;
}
/deep/.resContent .el-tabs__item {
padding: 0 13px;
}
.gctContent {
border: 1px black solid;
height: calc(100% - 60px);
width: calc(100% - 20px);
margin: 10px;
}
#qtReportEchart {
width: 100%;
height: 100%;
position: relative;
}
.box1 {
height: 40px;
line-height: 40px;
border-bottom: 1px solid rgb(205, 205, 205, 0.5);
}
.sp1 {
display: inline-block;
width: 7px;
height: 26px;
background-color: #354595;
vertical-align: top;
margin-left: 20px;
margin-top: 8px;
}
.sp2 {
margin-left: 10px;
font-size: 20px;
font-weight: 700;
color: #354595;
vertical-align: top;
}
</style>

View File

@ -0,0 +1,671 @@
<template>
<div class="soilMositure">
<div class="otgCard">
<div class="box1">
<span class="sp1"></span><span class="sp2">样本库</span>
</div>
<div class="otgCardContent">
<el-form :inline="true" :model="simpleForm" class="demo-form-inline">
<el-form-item style="margin-left: 15px">
<!-- <el-select
v-model="simpleForm.sampleFun"
:disabled="sampleFun !== ''"
size="mini"
placeholder="请选择抽样方法"
@change="changeSampleFun"
>
<el-option label="" value=""></el-option>
<el-option label="随机抽样" value="0"></el-option>
<el-option label="分层抽样" value="1"></el-option>
<el-option label="等距抽样" value="2"></el-option>
</el-select> -->
<el-cascader
v-model="simpleForm.sampleFun"
:disabled="sampleFun !== ''"
:options="funcOpt"
size="mini"
placeholder="请选择抽样方法"
popper-class="cascader-popper"
@change="changeSampleFun"
clearable
:show-all-levels="false"
></el-cascader>
<el-button
v-if="isDeepSpace"
class="edit-btn"
plain
size="mini"
type="primary"
icon="el-icon-edit-outline"
@click="editDeepSpace"
></el-button>
</el-form-item>
<el-form-item>
<el-input
v-model="simpleForm.sampleNum"
size="mini"
placeholder="请输入样本个数"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="samplesCk"></el-button>
</el-form-item>
</el-form>
<el-table
ref="multipleTable"
v-loading="loading"
element-loading-text="拼命加载中"
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 0, 0, 0.8)"
:data="simpleData"
tooltip-effect="dark"
:header-cell-style="headerRowClass"
style="width: 98%; margin-left: 1%; margin-top: 15px"
highlight-current-row
@current-change="tableRowClk"
:stripe="true"
:cell-style="tableRowClassName"
height="370"
>
<el-table-column label width="35">
<template slot-scope="scope">
<el-radio :label="scope.row" v-model="radioClkMsg"></el-radio>
</template>
</el-table-column>
<el-table-column label="序号" type="index" width="70">
</el-table-column>
<el-table-column
prop="sampleId"
label="样本编号"
show-overflow-tooltip
>
</el-table-column>
<el-table-column label="纬度(°)" sortable show-overflow-tooltip>
<template slot-scope="scope">{{
scope.row.lat.toFixed(8)
}}</template>
</el-table-column>
<el-table-column label="经度(°)" sortable>
<template slot-scope="scope">{{
scope.row.lon.toFixed(8)
}}</template>
</el-table-column>
<!-- <el-table-column label="高程" sortable prop="alt"></el-table-column> -->
<el-table-column
label="采样时间"
sortable
prop="dataTime"
show-overflow-tooltip
>
</el-table-column>
<el-table-column label="选取点纬度" prop="sameLat"></el-table-column>
<el-table-column label="选取点经度" prop="sameLon"></el-table-column>
<!-- <el-table-column label="选取点高度" prop="sameAlt"></el-table-column> -->
<el-table-column label="操作">
<template slot-scope="scope"
><i
class="el-icon-delete"
@click="deleteSelected(scope.$index, simpleData)"
></i
></template>
</el-table-column>
</el-table>
<!-- <Pagination :page-sizes="[13, 26, 39]" v-show="total>0" :total="total" :page.sync="simpleForm.pageNum" :limit.sync="simpleForm.pageSize" @pagination="getSimpleList" /> -->
</div>
</div>
<div class="sceneShow">
<div class="box1">
<span class="sp1"></span><span class="sp2">同名点选取</span>
</div>
<div class="sscPre">
<div class="sscTitle">
<div class="sscCircle"></div>
<span>产品展示</span>
</div>
<div class="sscTitle">
<div class="sscCircle"></div>
<span>局部放大图</span>
</div>
<div class="sscTitle">
<div class="sscCircle"></div>
<span>辅助图像</span>
</div>
</div>
<div class="sscPre">
<div class="sceneShowContent" style="position: relative">
<otg-product-info
@removeLayer="removeLayer('far')"
@addLayer="addLayer('far')"
></otg-product-info>
<div
id="farViewer"
style="height: 100%; width: 100%"
@click="pickValueFar"
></div>
</div>
<div class="sceneShowContent" style="position: relative">
<div id="nearViewer" style="height: 100%; width: 100%"></div>
<otg-product-info
@removeLayer="removeLayer('near')"
@addLayer="addLayer('near')"
></otg-product-info>
<div class="poiCK">
<el-button type="primary" :disabled="ckPoint" @click="ckSamePoi"
>选取点</el-button
>
<el-button
type="primary"
style="margin: 5px 0px"
:disabled="savePoint"
@click="saveSamePoi"
>保存点</el-button
>
</div>
</div>
<div class="sceneShowContent" style="position: relative">
<div style="height: 100%">
<img
id="alImg"
src="static/images/otg3.png"
style="height: 100%; width: 100%"
alt="fzImg"
/>
</div>
<div class="imgCtrl">
<el-radio-group v-model="imgChoose" @change="changeImg">
<el-radio label="pointPs">点之记</el-radio><br />
<el-radio label="nearImg" style="margin: 5px 0 5px 0"
>近景</el-radio
><br />
<el-radio label="farImg">远景</el-radio>
</el-radio-group>
</div>
</div>
</div>
</div>
<SampleSetting
:stepSampling="stepSampling"
@handleStepSampling="handleStepSampling"
@handleDepthList="handleDepthList"
:sampleCldFun="sampleCldFun"
ref="sampleSettingPanel"
></SampleSetting>
</div>
</template>
<script>
import Pagination from "@/components/Pagination";
import OtgProductInfo from "@/components/otgProductInfo";
import {
getSampleData,
getOrderSamples,
getSamplesByLayer,
deleteOrderSamplesByID,
} from "@/api/pendingOrder";
import otgCesiumUtils from "@/lib/otgCesiumUtils";
import SampleSetting from "@/components/ration/sampleSetting/index.vue";
import WKT from "terraformer-wkt-parser";
import Formator from "@/mixins/formator";
import cu from "@/lib/cesiumUtils";
export default {
components: { Pagination, SampleSetting, OtgProductInfo },
mixins: [Formator],
props: {
sampleFun: {
require: true,
type: String,
},
sampleCldFun: {
require: false,
type: String,
},
pixelFun: {
require: true,
type: String,
},
geoWorkSpace: {
require: true,
type: String,
},
geoLayerName: {
require: true,
type: String,
},
geoLayerPos: {
require: true,
},
pixelNum: {
require: true,
},
orderId: {
require: true,
},
productSubType: {
require: true,
},
},
filters: {
formatDate(inputTime) {
if (!inputTime && typeof inputTime !== "number") {
return "";
}
var localTime = "";
inputTime = new Date(inputTime);
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
},
data() {
return {
simpleForm: {
sampleFun: "",
sampleNum: "",
pageNum: 1,
pageSize: 13,
},
simpleData: [],
loading: true,
allSampleData: [],
multipleSelection: [],
simpleDataTotal: 0,
total: 0,
radioClkMsg: "",
imgChoose: "pointPs",
ckPoint: true,
savePoint: true,
stepSampling: false,
collectPointSignPic: "static/images/otg3.png", //
measurePicClose: "static/images/otg2.png", //
measurePicDistant: "static/images/otg1.png", //
funcOpt: [],
isDeepSpace: false,
depthList: [],
};
},
// watch:{
// geoWorkSpace:function(value){
// otgCesiumUtils.addlayer(value,this.geoLayerName)
// }
// },
mounted() {
otgCesiumUtils.initCesium(["farViewer", "nearViewer"]);
otgCesiumUtils.addlayer(this.geoWorkSpace, this.geoLayerName);
const cLon = (
(Number(this.geoLayerPos[0]) + Number(this.geoLayerPos[2])) /
2
).toFixed(8);
const cLat = (
(Number(this.geoLayerPos[1]) + Number(this.geoLayerPos[3])) /
2
).toFixed(8);
otgCesiumUtils.flyToLayer(cLon, cLat);
},
created() {
this.funcOpt = this.configration.funcOpt;
this.getSplData();
this.initParam();
},
methods: {
handleStepSampling(newVal) {
this.stepSampling = newVal;
},
handleDepthList(newVal) {
// console.log('handleDepthList', newVal)
this.depthList = newVal;
},
editDeepSpace() {
this.stepSampling = true;
},
initParam() {
if (this.sampleCldFun) {
this.simpleForm.sampleFun = new Array(
this.sampleFun,
this.sampleCldFun
);
} else {
this.simpleForm.sampleFun = new Array(this.sampleFun);
}
const ssf = Number(this.simpleForm.sampleFun[0]);
if (
this.simpleForm.sampleFun.length >= 1 &&
ssf === 1 &&
Number(this.simpleForm.sampleFun[1]) === 0
) {
this.isDeepSpace = true;
} else {
this.isDeepSpace = false;
}
// this.stepSampling = this.sampleFun == "1" && this?.sampleCldFun == "0";
},
changeSampleFun(sfVal) {
if (Array.isArray(sfVal)) {
const ssf = Number(sfVal[0]);
if (sfVal.length >= 1 && ssf === 1 && Number(sfVal[1]) === 0) {
this.isDeepSpace = true;
} else {
this.isDeepSpace = false;
}
}
// const ssf = Number(sfVal);
// if (ssf === 1 && this.sampleCldFun !== '') this.stepSampling = true;
// else this.stepSampling = false;
},
samplesCk() {
const self = this;
if (self.simpleForm.sampleFun[0] === "") {
self.$message.error("请选择抽样方法");
return false;
}
const ssf = self.simpleForm.sampleFun,
st = self.simpleDataTotal,
ssn = self.simpleForm.sampleNum;
if (ssn == "") {
this.$message.error("请选择抽样个数");
this.getSplData();
return false;
}
if (ssn > st) {
this.$message.error("抽样数不可大于总样本数量");
return false;
}
if (ssn < 0) {
this.$message.error("样本个数不可为负数");
return false;
}
if (Number(ssf[0]) === 1) {
const stepSampParams = self.$refs.sampleSettingPanel;
// const hierarchyVal = stepSampParams.hierarchyVal;
const hierarchyVal = ssf[1];
if (hierarchyVal === "" || hierarchyVal === undefined) {
self.stepSampling = true;
return false;
}
const ssForm = new FormData();
ssForm.append("samplesList", JSON.stringify(this.allSampleData));
ssForm.append("stepType", Number(hierarchyVal));
ssForm.append("orderID", this.orderId);
// ssForm.append("productType",this.productSubType);
if (hierarchyVal === "0") {
// const depthList = stepSampParams.depthList;
const depthList = this.depthList;
// console.log('=====', depthList)
ssForm.append("condition", JSON.stringify(depthList));
} else if (hierarchyVal === "2") {
const jsonContent = JSON.parse(stepSampParams.jsonContent);
// const jsonContentWKT = WKT.convert(jsonContent.geometries[0]);
const jg = jsonContent.geometries;
const newPolygon = [];
for (let i in jg) {
const jsonContentWKT = WKT.convert(jg[i]);
newPolygon.push({ coordinates: jsonContentWKT });
}
ssForm.append("condition", JSON.stringify(newPolygon));
}
ssForm.append("splCount", ssn);
getSamplesByLayer(ssForm).then((res) => {
if (res.length === 0 || res === []) {
self.multipleSelection = self.simpleData = [];
cu.removePoint();
this.$message.error("当前分层设置返回列表为空");
return false;
} else {
const dl = [];
for (let i in res) {
const ri = res[i];
for (let j in ri) {
dl.push(ri[j]);
}
}
self.multipleSelection = self.simpleData = dl;
cu.removePoint();
for (let i in dl) {
cu.addPoint(dl[i].lon, dl[i].lat, dl[i].alt);
}
}
});
} else {
const spFrom = new FormData();
spFrom.append("sampleFun", Number(ssf[0])); //
spFrom.append("minNum", 0);
spFrom.append("MaxNum", st - 1); //
spFrom.append("splCount", ssn); //
getSampleData(spFrom).then((res) => {
const dl = [];
for (const i in res) {
dl.push(self.allSampleData[res[i]]);
}
self.multipleSelection = self.simpleData = dl;
});
}
},
headerRowClass() {
return "background:#E4E9F1; font-weight: bold;color: #645f5f;text-align:center";
},
tableRowClassName({ rowIndex }) {
if ((rowIndex + 1) % 2 !== 0) {
return "background:#F5F7FA;text-align:center";
} else {
return "background:#FFFFFF;text-align:center";
}
},
tableRowClk(row) {
this.radioClkMsg = row;
otgCesiumUtils.removePoint();
const lon = row.lon,
lat = row.lat,
alt = row.alt;
otgCesiumUtils.addPointToFarViewer(lon, lat, alt);
otgCesiumUtils.addPointToNearViewer(lon, lat, alt);
this.ckPoint = false;
const cus = this.configration.urlprefix.samePoiImgsUrl;
if (row.collectPointSignpic !== null) {
this.collectPointSignPic = cus + row.collectPointSignpic;
var alImgDom = document.getElementById("alImg");
alImgDom.src = this.collectPointSignPic;
}
if (row.measureClose !== null)
this.measurePicClose = cus + row.measureClose;
if (row.measureDistant !== null)
this.measurePicDistant = cus + row.measureDistant;
},
//
ckSamePoi() {
// console.log('');
otgCesiumUtils.drawPoint((point) => {
this.radioClkMsg.sameLon = Number(point[0]);
this.radioClkMsg.sameLat = Number(point[1]);
this.radioClkMsg.sameAlt = Number(point[2]);
});
this.savePoint = false;
},
//
saveSamePoi() {
// console.log("");
this.ckPoint = true;
this.savePoint = true;
otgCesiumUtils.stopDrowPoi();
},
changeImg(val) {
var alImgDom = document.getElementById("alImg");
switch (val) {
case "pointPs":
alImgDom.src = this.collectPointSignPic;
break;
case "nearImg":
alImgDom.src = this.measurePicClose;
break;
case "farImg":
alImgDom.src = this.measurePicDistant;
}
},
getSplData() {
getOrderSamples(this.orderId, this.productSubType).then((res) => {
// console.log(res)
if (res.code == 200) {
this.multipleSelection =
this.allSampleData =
this.simpleData =
res.data;
this.loading = false;
this.$refs.multipleTable.toggleAllSelection();
let min = Number.MAX_SAFE_INTEGER;
let max = Number.MIN_SAFE_INTEGER;
this.$store.commit("setAltRange", null);
this.allSampleData.forEach((k, v) => {
k.dataTime = this.formatDatetime(k.dataTime);
min = min > k.alt ? k.alt : min;
max = max < k.alt ? k.alt : max;
});
if (this.allSampleData.length > 0) {
this.$store.commit("setAltRange", min + "," + (max + 1));
}
this.simpleDataTotal = this.total = res.data.length;
}
});
},
deleteSelected(index, simpleData) {
simpleData.splice(index, 1);
// deleteOrderSamplesByID(sampleId, this.productSubType).then((res) => {
// if (res.code == 200) {
// this.getSplData();
// }
// });
},
pickValueFar() {
otgCesiumUtils.handleClickFar();
},
pickValueNear() {
otgCesiumUtils.handleClickNear();
},
addLayer(layerType) {
if (layerType === "far")
otgCesiumUtils.addFarlayer(this.geoWorkSpace, this.geoLayerName);
else if (layerType === "near")
otgCesiumUtils.addNearlayer(this.geoWorkSpace, this.geoLayerName);
},
removeLayer(layerType) {
if (layerType === "far") otgCesiumUtils.clearFarLayers();
else if (layerType === "near") otgCesiumUtils.clearNearLayers();
},
},
};
</script>
<style scoped lang="less">
.otgCard {
display: inline-block;
vertical-align: top;
width: 100%;
background-color: white;
font-size: 20px;
margin-top: 20px;
}
/deep/.otgCard .el-form-item {
margin-bottom: 0;
}
.otgCardContent {
margin: 15px;
height: 450px;
}
.sceneShow {
width: 100%;
background-color: white;
margin-top: 20px;
padding-bottom: 15px;
}
.sscPre {
display: flex;
align-items: center;
justify-content: center;
}
.sceneShowContent {
margin: 5px 15px 0 15px;
width: 33%;
height: 360px;
background-color: rgb(110, 110, 207);
}
.imgCtrl {
position: absolute;
bottom: 3px;
left: 3px;
width: 90px;
height: 70px;
background-color: #aaaaaa;
padding: 4px 0 0 10px;
}
.poiCK {
position: absolute;
bottom: 1px;
width: 90px;
height: 60px;
background-color: #aaaaaa;
padding: 4px 0 0 10px;
}
.sscTitle {
margin: 15px 15px 0 15px;
width: 33%;
height: 30px;
display: flex;
align-items: center;
font-weight: bold;
color: gray;
}
.sscCircle {
width: 14px;
height: 14px;
border-radius: 50%;
background-color: #0072e5;
margin: 0 4px 0 4px;
}
.box1 {
height: 40px;
line-height: 40px;
border-bottom: 1px solid rgb(205, 205, 205, 0.5);
}
.sp1 {
display: inline-block;
width: 7px;
height: 26px;
background-color: #354595;
vertical-align: top;
// position: absolute;
margin-left: 20px;
margin-top: 8px;
}
.sp2 {
margin-left: 10px;
font-size: 20px;
font-weight: 700;
color: #354595;
vertical-align: top;
}
//
/deep/.sampleFunParam .el-upload-dragger .el-icon-upload {
margin: 0;
line-height: 30px;
font-size: 20px;
color: black;
}
.sampleFunParam .upload-demo {
display: inline-block;
}
/deep/.sampleFunParam .el-upload-dragger {
width: 150px;
height: 35px;
margin-left: 15px;
margin-top: 20px;
border: 1px solid #d9d9d9;
}
/deep/.sampleFunParam .el-dialog__body {
padding: 20px 10px;
text-align: center;
}
.edit-btn {
margin-left: 15px;
}
</style>

View File

@ -0,0 +1,704 @@
<template>
<div class="qualitative">
<div class="featureMap">
<div class="box1">
<span class="sp1"></span
><span class="sp2">{{
productSubType == 6 ? "地表覆盖类型表" : "植被物候类型表"
}}</span>
</div>
<el-table
ref="featureMapMultipleTable"
:data="featureMapData"
tooltip-effect="dark"
:header-cell-style="headerRowClass"
style="width: 98%; margin-left: 1%; margin-top: 15px"
:stripe="true"
:cell-style="tableRowClassName"
height="230"
>
<el-table-column label="序号" type="index" width="70">
</el-table-column>
<el-table-column
prop="typeName"
:label="productSubType == 6 ? '地物类型名称' : '物候类型名称'"
show-overflow-tooltip
>
</el-table-column>
<el-table-column
prop="typeNameKg"
label="空基类型名称"
show-overflow-tooltip
v-if="false"
>
<template slot-scope="scope">
<el-select
v-model="scope.row.typeNameKg"
placeholder="请选择"
@change="selectRfName(scope.row)"
>
<el-option
v-for="item in rfNameOpt"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="用户类型实际值">
<template slot-scope="scope">{{ scope.row.typeId }}</template>
</el-table-column>
<el-table-column label="空基代码实际值">
<template slot-scope="scope">{{ scope.row.typeIdKg }}</template>
</el-table-column>
</el-table>
</div>
<div class="qualiteSample">
<div class="qsLeft">
<div class="smps">
<div class="box1">
<span class="sp1"></span><span class="sp2">样本库</span>
</div>
<div>
<el-form
:inline="true"
:model="simpleForm"
class="demo-form-inline"
>
<el-form-item>
<el-cascader
v-model="simpleForm.sampleFun"
:disabled="sampleFun !== ''"
:options="funcOpt"
size="mini"
placeholder="请选择抽样方法"
popper-class="cascader-popper"
@change="changeSampleFun"
clearable
:show-all-levels="false"
></el-cascader>
<el-button
v-if="isDeepSpace"
class="edit-btn"
plain
size="mini"
type="primary"
icon="el-icon-edit-outline"
@click="editDeepSpace"
></el-button>
</el-form-item>
<el-form-item>
<el-input
v-model="simpleForm.sampleNum"
size="mini"
placeholder="请输入样本个数"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="samplesCk"></el-button>
</el-form-item>
</el-form>
<el-table
ref="multipleTable"
v-loading="loading"
element-loading-text="拼命加载中"
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 0, 0, 0.8)"
:data="simpleData"
tooltip-effect="dark"
:header-cell-style="headerRowClass"
style="width: 98%; margin-left: 1%"
@selection-change="handleSelectionChange"
:stripe="true"
:cell-style="tableRowClassName"
height="400"
size="medium"
>
<el-table-column type="selection" width="55"> </el-table-column>
<el-table-column label="序号" type="index" width="70">
</el-table-column>
<el-table-column
prop="sampleId"
label="样本编号"
show-overflow-tooltip
>
</el-table-column>
<el-table-column
prop="lat"
label="纬度"
sortable
show-overflow-tooltip
>
</el-table-column>
<el-table-column
prop="lon"
label="经度"
sortable
show-overflow-tooltip
>
</el-table-column>
<el-table-column
prop="coverName"
label="类别"
show-overflow-tooltip
sortable
>
</el-table-column>
<el-table-column
prop="dataTime"
label="采样时间"
sortable
show-overflow-tooltip
min-width="120px;"
>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope"
><i
class="el-icon-delete"
@click="deleteSelected(scope.$index, simpleData)"
></i
></template>
</el-table-column>
</el-table>
</div>
</div>
<div class="pixelDeal" v-if="false">
<div class="box1">
<span class="sp1"></span><span class="sp2">像元级处理模型设置</span>
</div>
<div>
<span class="cardsp">目标分辨率{{ pixelNum }}</span>
<el-form
:inline="true"
:model="pixelFormData"
class="demo-form-inline"
>
<el-form-item label="像元级处理模型:">
<el-select
size="mini"
v-model="pixelFormData.pixelDealFun"
placeholder="选择像元级处理方法"
:disabled="pdShow"
>
<el-option label="" value=""></el-option>
<el-option label="均值法" value="0"></el-option>
<el-option label="最邻近法" value="1"></el-option>
<el-option label="克里格法" value="2"></el-option>
<el-option label="块克里格法" value="3"></el-option>
<el-option label="MSN法" value="4"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit"></el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
<div class="qsRight">
<div class="box1">
<span class="sp1"></span
><span class="sp2">待检验产品及样本分布结果</span>
</div>
<div
id="sceneShowContent"
@click="pickValue"
style="overflow: hidden; position: relative"
></div>
</div>
</div>
<SampleSetting
:stepSampling="stepSampling"
@handleStepSampling="handleStepSampling"
@handleDepthList="handleDepthList"
:sampleCldFun="sampleCldFun"
ref="sampleSettingPanel"
></SampleSetting>
</div>
</template>
<script>
import {
getCoverTypes,
getSampleData,
getOrderSamples,
getSamplesByLayer,
deleteOrderSamplesByID,
} from "@/api/pendingOrder";
import cu from "@/lib/cesiumUtils";
import SampleSetting from "@/components/ration/sampleSetting/index.vue";
import WKT from "terraformer-wkt-parser";
import Formator from "@/mixins/formator";
export default {
components: {
SampleSetting,
},
mixins: [Formator],
props: {
sampleFun: {
require: true,
type: String,
},
sampleCldFun: {
require: false,
type: String,
},
pixelFun: {
require: true,
type: String,
},
geoWorkSpace: {
require: true,
type: String,
},
geoLayerName: {
require: true,
type: String,
},
geoLayerPos: {
require: true,
},
pixelNum: {
require: true,
},
orderId: {
require: true,
},
productSubType: {
require: true,
},
},
filters: {
formatDate(inputTime) {
if (!inputTime && typeof inputTime !== "number") {
return "";
}
var localTime = "";
inputTime = new Date(inputTime);
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
},
data() {
return {
featureMapData: [],
rfNameOpt: [],
simpleForm: {
sampleFun: "",
sampleNum: "",
},
simpleData: [],
loading: true,
allSampleData: [],
simpleDataTotal: 0,
multipleSelection: [],
pixelFormData: {
pixelDealFun: "",
},
stepSampling: false,
funcOpt: [],
isDeepSpace: false,
depthList: [],
};
},
// watch:{
// geoWorkSpace:function(value){
// cu.addlayer(value,this.geoLayerName)
// cu.flyToLayer(this.geoLayerPos[0],this.geoLayerPos[1]);
// }
// },
mounted() {
cu.initCesium("sceneShowContent");
cu.handleClick();
cu.addlayer(this.geoWorkSpace, this.geoLayerName);
let gp = this.geoLayerPos;
cu.flyToLayerRect(gp[0], gp[1], gp[2], gp[3]);
},
created() {
if (this.productSubType === 6) {
this.rfNameOpt = this.configration.groTypeName;
} else if (this.productSubType === 12) {
this.rfNameOpt = this.configration.vegetationPhenologyGroTypeName;
}
this.funcOpt = this.configration.funcOpt;
this.getCoverType();
this.getSplData();
this.initParam();
},
methods: {
handleStepSampling(newVal) {
this.stepSampling = newVal;
},
handleDepthList(newVal) {
// console.log('handleDepthList', newVal)
this.depthList = newVal;
},
editDeepSpace() {
this.stepSampling = true;
},
initParam() {
if (this.pixelFun !== "") this.pdShow = true;
this.pixelFormData.pixelDealFun = this.pixelFun;
if (this.sampleCldFun) {
this.simpleForm.sampleFun = new Array(
this.sampleFun,
this.sampleCldFun
);
} else {
this.simpleForm.sampleFun = new Array(this.sampleFun);
}
const ssf = Number(this.simpleForm.sampleFun[0]);
if (
this.simpleForm.sampleFun.length >= 1 &&
ssf === 1 &&
Number(this.simpleForm.sampleFun[1]) === 0
) {
this.isDeepSpace = true;
} else {
this.isDeepSpace = false;
}
// this.stepSampling = this.sampleFun == "1" && this?.sampleCldFun == "0";
},
onSubmit() {},
tableRowClassName({ rowIndex }) {
if ((rowIndex + 1) % 2 !== 0) {
return "background:#F5F7FA;text-align:center";
} else {
return "background:#FFFFFF;text-align:center";
}
},
headerRowClass() {
return "background: #E4E9F1;text-align:center";
},
handleSelectionChange(val) {
cu.removePoint();
if (val.length !== 0) {
for (let i in val) {
cu.addPoint(val[i].lon, val[i].lat, val[i].alt);
}
}
this.multipleSelection = val;
},
selectRfName(row) {
const typeNameMap = {
城市: "01",
水体: "02",
森林: "03",
灌木地: "20",
草地: "10",
水域: "60",
山地: "80",
出芽期: "1",
分蘖期: "2",
越冬期: "3",
返青期: "4",
起身期: "5",
拔节期: "6",
孕穗期: "7",
抽穗期: "8",
扬花期: "9",
灌浆期: "10",
成熟期: "11",
};
row.typeIdKg = typeNameMap[row.typeNameKg];
},
getRealVal(name) {
const typeNameMap = {
城市: "01",
水体: "02",
森林: "03",
灌木地: "20",
草地: "10",
水域: "60",
山地: "80",
出芽期: "1",
分蘖期: "2",
越冬期: "3",
返青期: "4",
起身期: "5",
拔节期: "6",
孕穗期: "7",
抽穗期: "8",
扬花期: "9",
灌浆期: "10",
成熟期: "11",
};
return typeNameMap[name];
},
getCoverType() {
getCoverTypes(this.orderId).then((res) => {
if (res.msg === "操作成功" && res?.data) {
const rd = res.data;
if (rd.length > 0) {
for (let i = 0; i < rd.length; i++) {
rd[i].typeNameKg = rd[i].typeName;
rd[i].typeIdKg = this.getRealVal(rd[i].typeName);
}
}
this.featureMapData = rd;
}
});
},
getSplData() {
// console.log(this.productSubType)
getOrderSamples(this.orderId, this.productSubType).then((res) => {
if (res.code == 200) {
this.multipleSelection =
this.allSampleData =
this.simpleData =
res.data;
this.loading = false;
this.$refs.multipleTable.toggleAllSelection();
let min = Number.MAX_SAFE_INTEGER;
let max = Number.MIN_SAFE_INTEGER;
this.$store.commit("setAltRange", null);
this.allSampleData.forEach((k, v) => {
k.dataTime = this.formatDatetime(k.dataTime);
min = min > k.alt ? k.alt : min;
max = max < k.alt ? k.alt : max;
});
if (this.allSampleData.length > 0) {
this.$store.commit("setAltRange", min + "," + (max + 1));
}
this.simpleDataTotal = res.data.length;
}
});
},
changeSampleFun(sfVal) {
if (Array.isArray(sfVal)) {
const ssf = Number(sfVal[0]);
this.$store.commit("setSampleFun", sfVal.length === 0 ? null : ssf);
if (sfVal.length >= 1 && ssf === 1 && Number(sfVal[1]) === 0) {
this.isDeepSpace = true;
} else {
this.isDeepSpace = false;
}
}
},
samplesCk() {
const self = this;
if (self.simpleForm.sampleFun[0] === "") {
self.$message.error("请选择抽样方法");
return false;
}
const ssf = self.simpleForm.sampleFun,
st = self.simpleDataTotal,
ssn = self.simpleForm.sampleNum;
if (ssn == "") {
this.$message.error("请选择抽样个数");
this.getSplData();
return false;
}
if (ssn > st) {
this.$message.error("抽样数不可大于总样本数量");
return false;
}
if (ssn < 0) {
this.$message.error("样本个数不可为负数");
return false;
}
if (Number(ssf[0]) === 1) {
// self.stepSampling = true;
const stepSampParams = self.$refs.sampleSettingPanel;
// const hierarchyVal = stepSampParams.hierarchyVal;
const hierarchyVal = ssf[1];
if (hierarchyVal === "" || hierarchyVal === undefined) {
self.stepSampling = true;
return false;
}
const ssForm = new FormData();
ssForm.append("samplesList", JSON.stringify(this.allSampleData));
ssForm.append("stepType", Number(hierarchyVal));
ssForm.append("orderID", this.orderId);
// ssForm.append("productType",this.productSubType);
if (hierarchyVal === "0") {
// const depthList = stepSampParams.depthList;
const depthList = this.depthList;
// console.log('=====', depthList)
ssForm.append("condition", JSON.stringify(depthList));
} else if (hierarchyVal === "2") {
const jsonContent = JSON.parse(stepSampParams.jsonContent);
// const jsonContentWKT = WKT.convert(jsonContent.geometries[0]);
const jg = jsonContent.geometries;
const newPolygon = [];
for (let i in jg) {
const jsonContentWKT = WKT.convert(jg[i]);
newPolygon.push({ coordinates: jsonContentWKT });
}
ssForm.append("condition", JSON.stringify(newPolygon));
}
ssForm.append("splCount", ssn);
getSamplesByLayer(ssForm).then((res) => {
if (res.length === 0 || res === []) {
self.multipleSelection = self.simpleData = [];
cu.removePoint();
this.$message.error("当前分层设置返回列表为空");
return false;
} else {
const dl = [];
for (let i in res) {
const ri = res[i];
for (let j in ri) {
dl.push(ri[j]);
}
}
self.multipleSelection = self.simpleData = dl;
self.$refs.multipleTable.toggleAllSelection();
cu.removePoint();
for (let i in dl) {
cu.addPoint(dl[i].lon, dl[i].lat, dl[i].alt);
}
}
});
} else {
const spFrom = new FormData();
spFrom.append("sampleFun", Number(ssf[0])); //
spFrom.append("minNum", 0);
spFrom.append("MaxNum", st - 1); //
spFrom.append("splCount", ssn); //
getSampleData(spFrom).then((res) => {
const dl = [];
for (const i in res) {
dl.push(self.allSampleData[res[i]]);
}
self.multipleSelection = self.simpleData = dl;
self.$refs.multipleTable.toggleAllSelection();
cu.removePoint();
for (let i in dl) {
cu.addPoint(dl[i].lon, dl[i].lat, dl[i].alt);
}
});
}
},
deleteSelected(index, simpleData) {
simpleData.splice(index, 1);
// deleteOrderSamplesByID(sampleId, this.productSubType).then((res) => {
// if (res.code == 200) {
// this.getSplData();
// }
// });
},
pickValue() {
cu.handleClick();
},
},
};
</script>
<style scoped lang="less">
.featureMap {
width: 100%;
height: 300px;
background-color: white;
margin-top: 10px;
}
/deep/.featureMap .el-select .el-input__inner {
height: 35px;
}
.qualiteSample {
margin-top: 10px;
margin-bottom: 10px;
}
.qsLeft {
width: 56%;
height: 500px;
float: left;
margin-right: 4px;
}
.qsRight {
width: calc(44% - 4px);
height: 500px;
background-color: white;
float: left;
margin-bottom: 10px;
}
.smps {
height: 500px;
background-color: white;
margin-bottom: 5px;
}
/deep/.smps .el-form-item {
margin-left: 15px;
margin-bottom: 10px;
}
// /deep/.smps .el-table th > .cell {
// font-size: 15px;
// }
// /deep/.smps .el-table .cell {
// font-size: 13px;
// }
.pixelDeal {
height: 165px;
background-color: white;
}
/deep/.pixelDeal .el-form-item {
margin-left: 15px;
}
.cardsp {
display: block;
margin-left: 17px;
font-size: 15px;
color: #606266;
line-height: 40px;
}
#sceneShowContent {
margin: 10px;
height: calc(100% - 60px);
background-color: rgb(110, 110, 207);
}
.box1 {
height: 40px;
line-height: 40px;
border-bottom: 1px solid rgb(205, 205, 205, 0.5);
}
.sp1 {
display: inline-block;
width: 7px;
height: 26px;
background-color: #354595;
vertical-align: top;
margin-left: 20px;
margin-top: 8px;
}
.sp2 {
margin-left: 10px;
font-size: 20px;
font-weight: 700;
color: #354595;
vertical-align: top;
}
//
/deep/.sampleFunParam .el-upload-dragger .el-icon-upload {
margin: 0;
line-height: 30px;
font-size: 20px;
color: black;
}
.sampleFunParam .upload-demo {
display: inline-block;
}
/deep/.sampleFunParam .el-upload-dragger {
width: 150px;
height: 35px;
margin-left: 15px;
margin-top: 20px;
border: 1px solid #d9d9d9;
}
/deep/.sampleFunParam .el-dialog__body {
padding: 20px 10px;
text-align: center;
}
.edit-btn {
margin-left: 15px;
}
</style>

View File

@ -0,0 +1,265 @@
<template>
<div class="sampleFunParam">
<el-dialog title="深度空间分层抽样设置" :visible.sync="stepSampling" width="35%">
<!-- <el-select
v-model="hierarchyVal"
placeholder="分层选择"
@change="setHierarchy"
>
<el-option
v-for="item in hierarchyOpt"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select> -->
<div class="hint">
<!-- <span>{{ hierarchyVal === "0" ? altRangeText : "" }}</span> -->
<span>{{ altRangeText }}</span>
</div>
<div v-if="hierarchyVal === '2'">
<span class="sp3">范围数据上传</span>
<el-upload
class="upload-demo"
drag
multiple
accept=".json,.geoJson,.topoJson"
action="/"
:http-request="uploadJsonFile"
:show-file-list="false"
>
<i class="el-icon-upload"></i>上传geoJson
</el-upload>
</div>
<div class="cardtable">
<el-table :data="depthList" style="width: 66%; margin-left: 20%">
<el-table-column label="序号" width="60" align="center" type="index">
</el-table-column>
<el-table-column
prop="startDepth"
label="起始范围"
align="center"
width="80"
>
<template slot-scope="{ row, $index }">
<div
@click.stop="
{
{
changeNum($index, 'editStartDepthInput');
}
}
"
>
<el-input
v-if="editable[$index]"
v-model="row.startDepth"
size="mini"
class="editStartDepthInput"
></el-input>
<span v-else>{{ row.startDepth }}</span>
</div>
</template>
</el-table-column>
<el-table-column
prop="endDepth"
label="结束范围"
align="center"
width="80"
>
<template slot-scope="{ row, $index }">
<div
@click.stop="
{
{
changeNum($index, 'editEndDepthInput');
}
}
"
>
<el-input
v-if="editable[$index]"
v-model="row.endDepth"
size="mini"
class="editEndDepthInput"
></el-input>
<span v-else>{{ row.endDepth }}</span>
</div>
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button
style="height: 25px"
type="danger"
size="small"
icon="el-icon-plus"
@click="addDepthT(scope.$index, scope.row)"
></el-button>
<el-button
style="height: 25px"
type="danger"
size="small"
icon="el-icon-minus"
@click="removeDepthT(scope.$index, scope.row)"
></el-button>
</template>
</el-table-column>
</el-table>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="cancelSampleFunSet"></el-button>
<el-button type="primary" @click="submitSampleFunSet"></el-button>
</div>
</el-dialog>
</div>
</template>
<script>
export default {
props: {
stepSampling: {
require: true,
},
sampleCldFun: {
require: false,
},
},
data() {
return {
// stepShow: false,
hierarchyVal: "0",
hierarchyOpt: [
{
value: "0",
label: "深度空间分层",
},
{
value: "1",
label: "场站网空间分层",
},
// , {
// value: '2',
// label: ''
// }
],
depthList: [],
editable: [],
jsonContent: null,
depths: []
};
},
watch: {
stepSampling: function (value) {},
'$store.state.altRange': function(value) {
const temp = (value === null || value === "") ? [1, 5] : value.split(',');
this.depths = temp;
this.depthList = [{
startDepth: this.depths[0],
endDepth: this.depths[1],
}]
this.$emit('handleDepthList', this.depthList)
}
},
computed: {
altRangeText: function () {
return this.$store.state.altRange === null ||
this.$store.state.altRange === ""
? ""
: "分层深度区间不包括结束深度值;实际样本深度范围:[" +
this.$store.state.altRange +
")";
},
},
created() {},
mounted() {
this.initParams();
this.changeNum(0, 'editStartDepthInput');
this.changeNum(0, 'editEndDepthInput');
},
methods: {
initParams() {
this.depthList = [{
startDepth: this.depths[0],
endDepth: this.depths[1],
}];
this.$emit('handleDepthList', this.depthList);
},
//
changeNum(index, className) {
// tableList
this.editable = new Array(this.depthList.length);
this.editable[index] = true;
// this.saveItem = this.depthList[index];
this.$set(this.editable, index, true);
//input
this.$nextTick(function () {
var editInputList = document.getElementsByClassName(className);
editInputList[0]?.children[0]?.focus();
});
},
addDepthT() {
this.depthList.push({ startDepth: this.depths[0], endDepth: this.depths[1] });
},
removeDepthT(index) {
if(this.depthList.length === 1) return;
this.depthList.splice(index, 1);
},
setHierarchy(val) {
// console.log("", val);
if (val === "0") {
this.depthList = [
{
startDepth: "1",
endDepth: "5",
},
];
} else {
this.depthList = [];
}
},
uploadJsonFile(option) {
console.log(option.file);
const self = this;
//FileReader
const reader = new FileReader();
//
reader.readAsText(option.file, "UTF-8");
//
reader.onload = function (evt) {
//
const fileString = evt.target.result;
// console.log(fileString);
self.jsonContent = fileString;
};
},
submitSampleFunSet() {
// console.log(this.jsonContent)
if (this.hierarchyVal === "2" && this.jsonContent === null) {
this.$message.error("请上传深度JSON文件");
return false;
}
// this.stepShow = false;
this.$emit('handleStepSampling', false);
this.$emit('handleDepthList', this.depthList);
},
cancelSampleFunSet() {
// this.stepShow = false;
this.$emit('handleStepSampling', false);
},
},
};
</script>
<style>
.sp3 {
position: relative;
top: -13px;
margin-left: 10px;
}
.sampleFunParam .upload-demo {
display: inline-block;
}
.hint {
padding: 15px 0;
}
</style>

View File

@ -0,0 +1,562 @@
<template>
<div class="soilMositure">
<div class="smBodyLeft">
<div class="smps">
<div class="box1">
<span class="sp1"></span><span class="sp2">样本库</span>
</div>
<div>
<el-form :inline="true" :model="simpleForm" class="demo-form-inline">
<el-form-item>
<!-- <el-select
v-model="simpleForm.sampleFun"
:disabled="sampleFun !== ''"
size="mini"
placeholder="请选择抽样方法"
@change="changeSampleFun"
>
<el-option label="" value=""></el-option>
<el-option label="随机抽样" value="0"></el-option>
<el-option label="分层抽样" value="1"></el-option>
<el-option label="等距抽样" value="2"></el-option>
</el-select> -->
<el-cascader
v-model="simpleForm.sampleFun"
:disabled="sampleFun !== ''"
:options="funcOpt"
size="mini"
placeholder="请选择抽样方法"
popper-class="cascader-popper"
@change="changeSampleFun"
clearable
:show-all-levels="false"
></el-cascader>
<el-button
v-if="isDeepSpace"
class="edit-btn"
plain
size="mini"
type="primary"
icon="el-icon-edit-outline"
@click="editDeepSpace"
></el-button>
</el-form-item>
<el-form-item>
<el-input
v-model="simpleForm.sampleNum"
size="mini"
placeholder="请输入样本个数"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="samplesCk"></el-button>
</el-form-item>
</el-form>
<el-table
ref="multipleTable"
v-loading="loading"
element-loading-text="拼命加载中"
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 0, 0, 0.8)"
:data="simpleData"
tooltip-effect="dark"
:header-cell-style="headerRowClass"
style="width: 98%; margin-left: 1%"
@selection-change="handleSelectionChange"
:stripe="true"
:cell-style="tableRowClassName"
height="460"
>
<el-table-column type="selection" width="55"> </el-table-column>
<el-table-column label="序号" type="index" width="70">
</el-table-column>
<el-table-column
prop="sampleId"
label="样本编号"
show-overflow-tooltip
min-width="100px;"
>
</el-table-column>
<el-table-column
prop="lat"
label="纬度"
sortable
show-overflow-tooltip
>
</el-table-column>
<el-table-column
prop="lon"
label="经度"
sortable
show-overflow-tooltip
>
</el-table-column>
<el-table-column
prop="dataValue"
:label="productSubTypeName"
show-overflow-tooltip
sortable
min-width="150px;"
>
</el-table-column>
<el-table-column
prop="dataTime"
label="采样时间"
sortable
show-overflow-tooltip
min-width="120px;"
>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope"
><i
class="el-icon-delete"
@click="deleteSelected(scope.$index, simpleData)"
></i
></template>
</el-table-column>
</el-table>
</div>
</div>
</div>
<div class="smBodyRight">
<div class="box1">
<span class="sp1"></span
><span class="sp2">待检验产品及样本分布结果</span>
</div>
<div
class="sceneShowContent"
id="cesiumView"
@click="pickValue"
style="overflow: hidden; position: relative"
></div>
</div>
<SampleSetting
:stepSampling="stepSampling"
@handleStepSampling="handleStepSampling"
@handleDepthList="handleDepthList"
:sampleCldFun="sampleCldFun"
ref="sampleSettingPanel"
></SampleSetting>
</div>
</template>
<script>
import {
getSampleData,
getOrderSamples,
getSamplesByLayer,
deleteOrderSamplesByID,
} from "@/api/pendingOrder";
import cu from "@/lib/cesiumUtils";
import SampleSetting from "@/components/ration/sampleSetting/index.vue";
import WKT from "terraformer-wkt-parser";
import Formator from "@/mixins/formator";
export default {
components: {
SampleSetting,
},
mixins: [Formator],
props: {
sampleFun: {
require: true,
type: String,
},
sampleCldFun: {
require: false,
type: String,
},
pixelFun: {
require: true,
type: String,
},
geoWorkSpace: {
require: true,
type: String,
},
geoLayerName: {
require: true,
type: String,
},
geoLayerPos: {
require: true,
},
pixelNum: {
require: true,
},
orderId: {
require: true,
},
productSubType: {
require: true,
},
},
filters: {
formatDate(inputTime) {
if (!inputTime && typeof inputTime !== "number") {
return "";
}
var localTime = "";
inputTime = new Date(inputTime);
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
},
data() {
return {
simpleForm: {
sampleFun: "",
sampleNum: "",
},
simpleData: [],
loading: true,
allSampleData: [],
simpleDataTotal: 0,
smLabel: "土壤水分",
pixelFormData: {
pixelDealFun: "",
},
multipleSelection: [],
pdShow: false,
stepSampling: false,
funcOpt: [],
isDeepSpace: false,
depthList: [],
};
},
mounted() {
cu.initCesium("cesiumView");
cu.handleClick();
cu.addlayer(this.geoWorkSpace, this.geoLayerName);
let gp = this.geoLayerPos;
cu.flyToLayerRect(gp[0], gp[1], gp[2], gp[3]);
},
created() {
this.funcOpt = this.configration.funcOpt;
this.getSplData();
this.initParam();
},
methods: {
handleStepSampling(newVal) {
this.stepSampling = newVal;
},
handleDepthList(newVal) {
// console.log('handleDepthList', newVal)
this.depthList = newVal;
},
editDeepSpace() {
this.stepSampling = true;
},
initParam() {
if (this.sampleCldFun) {
this.simpleForm.sampleFun = new Array(
this.sampleFun,
this.sampleCldFun
);
} else {
this.simpleForm.sampleFun = new Array(this.sampleFun);
}
const ssf = Number(this.simpleForm.sampleFun[0]);
if (
this.simpleForm.sampleFun.length >= 1 &&
ssf === 1 &&
Number(this.simpleForm.sampleFun[1]) === 0
) {
this.isDeepSpace = true;
} else {
this.isDeepSpace = false;
}
// this.stepSampling = this.sampleFun == "1" && this?.sampleCldFun == "0";
},
pickValue() {
cu.handleClick();
},
changeSampleFun(sfVal) {
//
if (Array.isArray(sfVal)) {
const ssf = Number(sfVal[0]);
this.$store.commit("setSampleFun", sfVal.length === 0 ? null : ssf);
if (sfVal.length >= 1 && ssf === 1 && Number(sfVal[1]) === 0) {
this.isDeepSpace = true;
} else {
this.isDeepSpace = false;
}
}
},
samplesCk() {
const self = this;
if (self.simpleForm.sampleFun[0] === "") {
self.$message.error("请选择抽样方法");
return false;
}
const ssf = self.simpleForm.sampleFun,
st = self.simpleDataTotal,
ssn = self.simpleForm.sampleNum;
if (ssn == "") {
this.$message.error("请选择抽样个数");
this.getSplData();
return false;
}
if (ssn > st) {
this.$message.error("抽样数不可大于总样本数量");
return false;
}
if (ssn < 0) {
this.$message.error("样本个数不可为负数");
return false;
}
if (Number(ssf[0]) === 1) {
const stepSampParams = self.$refs.sampleSettingPanel;
// const hierarchyVal = stepSampParams.hierarchyVal;
const hierarchyVal = ssf[1];
if (hierarchyVal === "" || hierarchyVal === undefined) {
self.stepSampling = true;
return false;
}
const ssForm = new FormData();
ssForm.append("samplesList", JSON.stringify(self.allSampleData));
ssForm.append("stepType", Number(hierarchyVal));
ssForm.append("orderID", self.orderId);
// ssForm.append("productType",this.productSubType);
if (hierarchyVal === "0") {
// const depthList = stepSampParams.depthList;
const depthList = this.depthList;
// console.log('=====', depthList)
ssForm.append("condition", JSON.stringify(depthList));
} else if (hierarchyVal === "2") {
const jsonContent = JSON.parse(stepSampParams.jsonContent);
// const jsonContentWKT = WKT.convert(jsonContent.geometries[0]);
const jg = jsonContent.geometries;
const newPolygon = [];
for (let i in jg) {
const jsonContentWKT = WKT.convert(jg[i]);
newPolygon.push({ coordinates: jsonContentWKT });
}
ssForm.append("condition", JSON.stringify(newPolygon));
}
ssForm.append("splCount", ssn);
getSamplesByLayer(ssForm).then((res) => {
if (res.length === 0 || res === []) {
self.multipleSelection = self.simpleData = [];
cu.removePoint();
self.$message.error("当前分层设置返回列表为空");
return false;
} else {
const dl = [];
for (let i in res) {
const ri = res[i];
for (let j in ri) {
ri[j]["hierarchicalIdentification"] = i;
dl.push(ri[j]);
}
}
self.multipleSelection = self.simpleData = dl;
self.$refs.multipleTable.toggleAllSelection();
cu.removePoint();
for (let i in dl) {
cu.addPoint(dl[i].lon, dl[i].lat, dl[i].alt);
}
}
});
} else {
const spFrom = new FormData();
spFrom.append("sampleFun", Number(ssf[0])); //
spFrom.append("minNum", 0);
spFrom.append("MaxNum", st - 1); //
spFrom.append("splCount", ssn); //
getSampleData(spFrom).then((res) => {
const dl = [];
for (const i in res) {
let sri = self.allSampleData[res[i]];
sri["hierarchicalIdentification"] = "0";
dl.push(sri);
}
self.multipleSelection = self.simpleData = dl;
self.$refs.multipleTable.toggleAllSelection();
cu.removePoint();
for (let i in dl) {
cu.addPoint(dl[i].lon, dl[i].lat, dl[i].alt);
}
});
}
},
tableRowClassName({ rowIndex }) {
if ((rowIndex + 1) % 2 !== 0) {
return "background:#F5F7FA;text-align:center";
} else {
return "background:#FFFFFF;text-align:center";
}
},
headerRowClass() {
return "background: #E4E9F1;text-align:center";
},
handleSelectionChange(val) {
cu.removePoint();
if (val.length !== 0) {
for (let i in val) {
cu.addPoint(val[i].lon, val[i].lat, val[i].alt);
}
}
this.multipleSelection = val;
},
getSplData() {
getOrderSamples(this.orderId, this.productSubType).then((res) => {
if (res.code == 200) {
let rd = res.data;
for (const i in rd) {
rd[i]["hierarchicalIdentification"] = "0";
}
this.multipleSelection = this.allSampleData = this.simpleData = rd;
this.loading = false;
this.$refs.multipleTable.toggleAllSelection();
let min = Number.MAX_SAFE_INTEGER;
let max = Number.MIN_SAFE_INTEGER;
this.$store.commit("setAltRange", null);
this.allSampleData.forEach((k, v) => {
k.dataTime = this.formatDatetime(k.dataTime);
min = min > k.alt ? k.alt : min;
max = max < k.alt ? k.alt : max;
});
if (this.allSampleData.length > 0) {
this.$store.commit("setAltRange", min + "," + (max + 1));
}
this.simpleDataTotal = this.simpleForm.total = rd.length;
}
});
},
deleteSelected(index, simpleData) {
simpleData.splice(index, 1);
// deleteOrderSamplesByID(sampleId, this.productSubType).then((res) => {
// if (res.code == 200) {
// this.getSplData();
// }
// });
},
},
computed: {
productSubTypeName: function () {
return this.configration.subProductName[this.productSubType];
},
globalSampleFun: function () {
return this.$store.state.sampleFun;
},
globalPixelFun: function () {
return this.$store.state.pixelFun;
},
},
};
</script>
<style scoped lang="less">
.soilMositure {
margin-top: 10px;
margin-bottom: 10px;
}
.smBodyLeft {
width: 56%;
height: 570px;
float: left;
margin-right: 4px;
}
.smBodyRight {
width: calc(44% - 4px);
height: 570px;
background-color: white;
float: left;
margin-bottom: 10px;
}
.smps {
height: 570px;
background-color: white;
margin-bottom: 5px;
}
/deep/.smps .el-form-item {
margin-left: 15px;
margin-bottom: 10px;
}
/deep/.smps .el-table th > .cell {
font-size: 15px;
}
/deep/.smps .el-table .cell {
font-size: 13px;
}
.block .pagination-container {
padding: 0px;
margin-top: 6px;
text-align: center;
}
.pixelDeal {
height: 165px;
background-color: white;
}
/deep/.pixelDeal .el-form-item {
margin-left: 15px;
}
.cardsp {
display: block;
margin-left: 17px;
font-size: 15px;
color: #606266;
line-height: 40px;
}
.sceneShowContent {
margin: 10px;
height: calc(100% - 60px);
background-color: rgb(110, 110, 207);
}
.box1 {
height: 40px;
line-height: 40px;
border-bottom: 1px solid rgb(205, 205, 205, 0.5);
}
.sp1 {
display: inline-block;
width: 7px;
height: 26px;
background-color: #354595;
vertical-align: top;
margin-left: 20px;
margin-top: 8px;
}
.sp2 {
margin-left: 10px;
font-size: 20px;
font-weight: 700;
color: #354595;
vertical-align: top;
}
.sp3 {
position: relative;
top: -13px;
margin-left: 10px;
}
//
/deep/.sampleFunParam .el-upload-dragger .el-icon-upload {
margin: 0;
line-height: 30px;
font-size: 20px;
color: black;
}
.sampleFunParam .upload-demo {
display: inline-block;
}
/deep/.sampleFunParam .el-upload-dragger {
width: 150px;
height: 35px;
margin-left: 15px;
margin-top: 20px;
border: 1px solid #d9d9d9;
}
/deep/.sampleFunParam .el-dialog__body {
padding: 20px 10px;
text-align: center;
}
.edit-btn {
margin-left: 15px;
}
</style>

View File

@ -0,0 +1,279 @@
<template>
<div class="qtReportTable">
<el-table
:header-cell-style="headerRowClass"
:cell-style="tableRowClassName"
style="width: 100%"
:data="tData"
:stripe="true"
size="medium"
height="400"
>
<el-table-column
label="待检验地物类型"
property="待检验地物类型"
align="center"
width="160"
>
<el-table-column
label="样本真值"
property="样本真值"
align="center"
width="160"
>
</el-table-column>
</el-table-column>
<el-table-column
v-for="(item, index) in tHeader"
:key="index"
:label="item"
:property="item"
align="center"
>
<template slot-scope="scope">{{ scope.row[item] }}</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
props: {
errorMatrix: {
require: false,
},
preResults: {
require: false,
},
activeTabs: {
require: true,
},
},
data() {
return {
realCheckRes: [],
tableKey: [],
tData: [],
tHeader: [],
};
},
created() {
this.creatTableData();
},
methods: {
headerRowClass() {
return "background: #E4E9F1;text-align:center";
},
tableRowClassName({ rowIndex }) {
if ((rowIndex + 1) % 2 !== 0) {
return "background:#F5F7FA;text-align:center";
} else {
return "background:#FFFFFF;text-align:center";
}
},
creatTableData() {
if (this.errorMatrix[0]) {
const em = this.errorMatrix;
const at = this.activeTabs;
const pr = this.preResults;
let tes = null;
this.tHeader.push("样本真值");
let rowHeaderRaw = em[em[0].length];
for (let i = 0; i < rowHeaderRaw.length; i++) {
this.tHeader.push(rowHeaderRaw[i]);
}
switch (at) {
//count
case "pixel":
tes = "count";
this.tHeader.push("合计");
break;
// percentage()
// case "percentage":
// tes = "percentage";
// this.tHeader.push("");
// break;
// userViscosity()
case "userPre":
tes = "count";
this.tHeader.push("用户精度");
// tes = "userViscosity";
break;
// producerAccuracy()
case "producerPre":
tes = "count";
// tes = "producerAccuracy";
break;
// commissionErrors()
case "errorPre":
tes = "count";
this.tHeader.push("错分精度");
break;
// omissionErrors()
case "LeakagePre":
tes = "count";
this.tHeader.push("漏分精度");
// tes = "omissionErrors";
break;
}
let rows = [];
let colHeaderRaw = em[em[0].length + 1];
let rcr = [];
let all = 0;
for (let i = 0; i < em[0].length; i++) {
const ei = em[i];
let objR = new Object();
let tv = 0;
let rowJson = {};
rowJson[this.tHeader[0]] = colHeaderRaw[i];
for (let j = 0; j < em[i].length; j++) {
rowJson[this.tHeader[j + 1]] = parseFloat(ei[j][tes].toFixed(4));
objR[[j]] = ei[j][tes];
//
tv += ei[j][tes];
}
all += tv;
// if (pr !== undefined) {
if (at === "userPre" || at === "errorPre" || at === "LeakagePre")
rowJson[this.tHeader[em[i].length + 1]] = parseFloat(
pr[rowJson[this.tHeader[0]]].toFixed(3)
);
else rowJson[this.tHeader[em[i].length + 1]] = tv.toFixed(0);
// }
rows.push(rowJson);
rcr.push(objR);
}
const newRcr = this.verticalTotal(rcr);
newRcr.push(all);
let lastRow = {};
if (at === "pixel") {
lastRow[this.tHeader[0]] = "合计";
let m = 1;
for (let i in newRcr) {
lastRow[this.tHeader[m++]] = newRcr[i].toFixed(0);
}
rows.push(lastRow);
} else if (at === "producerPre") {
lastRow[this.tHeader[0]] = "生产者精度";
// if (pr !== undefined) {
for (var i in pr) {
lastRow[i] = parseFloat(pr[i].toFixed(3));
}
// }
rows.push(lastRow);
}
this.tHeader = this.tHeader.slice(1);
this.tData = rows;
}
},
// key
newMap(a1, a2, key) {
let ttt = [];
for (let i in a1) {
const rv = a1[i][key];
let newObj = {};
for (let j in a2) {
const rv2 = a2[j][key];
if (rv2 === rv) {
ttt.push(Object.assign(newObj, a1[i], a2[j]));
}
}
}
return ttt;
},
// key
deweight(arr, key) {
let ret = [];
arr.forEach((item) => {
let compare = [];
ret.forEach((retitem) => {
compare.push(retitem[key]);
});
if (compare.indexOf(item[key]) === -1) {
ret.push(item);
}
});
return ret;
},
verticalTotal(matrix) {
let result = [];
let len = matrix.length;
for (let i = 0; i < len; i++) {
let sum = 0;
for (let j = 0; j < len; j++) {
sum += matrix[j][i];
}
result.push(sum);
}
return result;
},
arrSum(a) {
let res = a.reduce((result, next) => {
if (!result) result = {};
Object.keys(next).forEach((key) => {
//
if (typeof next[key] == "number") {
result[key] = (result[key] ? result[key] : 0) + next[key];
}
//
if (next[key] instanceof Array) {
result[key] = (result[key] ? result[key] : []).concat(next[key]);
}
});
return result;
});
return res;
},
changeRowCodeToName(rowCode, rowCodeMap) {
if (rowCode == null) return null;
else return rowCodeMap[rowCode];
},
},
};
</script>
<style lang="less">
.qtReportTable {
.el-table thead.is-group th {
background: none;
padding: 0px;
}
.el-table thead.is-group tr:first-of-type th:first-of-type {
border-bottom: none;
}
.el-table thead.is-group tr:first-of-type th:first-of-type div.cell {
text-align: right;
}
.el-table thead.is-group tr:last-of-type th:first-of-type div.cell {
text-align: left;
}
.el-table thead.is-group tr:first-of-type th:first-of-type:before {
content: "";
position: absolute;
width: 2px;
height: 200px;
top: 0;
left: 0;
background-color: #000;
opacity: 0.3;
display: block;
transform: rotate(-73.5deg);
-webkit-transform-origin: top;
transform-origin: top;
}
.el-table thead.is-group tr:last-of-type th:first-of-type:before {
content: "";
position: absolute;
width: 2px;
height: 200px;
bottom: 0;
right: 0;
background-color: #000;
opacity: 0.3;
display: block;
transform: rotate(-74deg);
-webkit-transform-origin: bottom;
transform-origin: bottom;
}
}
</style>

View File

@ -0,0 +1,542 @@
<template>
<div class="rtReport">
<div class="realResult">
<div class="box1">
<span class="sp1"></span><span class="sp2">真实性检验结果</span>
</div>
<div class="resContent">
<el-table
:header-cell-style="headerRowClass"
:cell-style="tableRowClassName"
style="width: 100%"
:data="tDatas"
:stripe="true"
class="table-head-transparent"
size="medium"
>
<el-table-column
v-for="(item, index) in Object.keys(tData).slice(0, midValue)"
:key="index"
:label="item | truthFunFilter"
:property="item"
align="center"
>
<template slot-scope="scope">{{ scope.row[item] }}</template>
</el-table-column>
</el-table>
<el-table
:header-cell-style="headerRowClass"
:cell-style="tableRowClassName"
style="width: 100%; margin-top: 16px"
:data="tDatas"
:stripe="true"
class="table-head-transparent"
size="medium"
>
<el-table-column
v-for="(item, index) in Object.keys(tData).slice(midValue)"
:key="index"
:label="item | truthFunFilter"
:property="item"
align="center"
>
<template slot-scope="scope">{{ scope.row[item] }}</template>
</el-table-column>
</el-table>
<!--<span v-for="(item,index) in resMap" :key="index">{{item.name | truthFunFilter}}{{item.val}}</span>-->
<div v-if="meanError.length !== 0 && meanError !== []">
<el-table
:header-cell-style="headerRowClass"
:cell-style="tableRowClassName"
style="width: 100%"
:data="meanError"
:stripe="true"
size="medium"
>
<el-table-column
prop="3_0"
label="平均相对误差相对X轴误差"
align="center"
v-if="meanError[0]['3_0'] != null"
>
</el-table-column>
<el-table-column
prop="3_1"
label="平均相对误差相对Y轴误差"
align="center"
v-if="meanError[0]['3_1'] != null"
>
</el-table-column>
<el-table-column
prop="4_0"
label="平均绝对相对误差相对X轴误差"
align="center"
v-if="meanError[0]['4_0'] != null"
>
</el-table-column>
<el-table-column
prop="4_1"
label="平均绝对相对误差相对Y轴误差"
align="center"
v-if="meanError[0]['4_1'] != null"
>
</el-table-column>
</el-table>
</div>
<!--<span>相对误差</span>-->
<!-- <div v-if="relativeError.length !== 0 && relativeError !== []">
<el-table
:data="relativeError"
size="medium"
>
<el-table-column
prop="cre_orthoXRelativeError"
label="相对误差相对X轴误差"
align="center">
</el-table-column>
<el-table-column
prop="cre_orthoYRelativeError"
label="相对误差相对Y轴误差"
align="center">
</el-table-column>
</el-table>
</div> -->
</div>
</div>
<div class="errorGraph">
<div class="box1">
<span class="sp1"></span
><span class="sp2">{{ pdSubTypeName }}误差结果图</span>
</div>
<div class="errContent">
<div id="rtReportEcharts" ref="chart"></div>
<div class="legend" v-if="pdSubType === 1">
<div class="line">
<span class="circle"></span>
<span>样本点</span>
</div>
<div class="line">
<span class="circle_2"></span>
<span>选取点</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { productTypeMap } from "@/lib/variateMap";
import { truthFunVal, productSubTypeVal } from "@/lib/contract";
export default {
props: {
realRes: {
require: true,
},
pdSubType: {
require: true,
},
},
filters: {
truthFunFilter(truthFun) {
const truthFunMap = {
0: "平均误差",
1: "平均绝对误差",
2: "相对误差",
3: "平均相对误差",
4: "平均绝对相对误差",
5: "均方根误差",
6: "平面中误差",
7: "相关系数",
8: "误差矩阵",
9: "总体分类精度",
10: "Kappa系数",
};
return truthFunMap[truthFun];
},
},
data() {
return {
resMap: [],
myCharts: null,
relativeError: [],
meanError: [],
pdSubTypeName: "",
tData: {},
tDatas: null,
midValue: 10,
};
},
created() {
this.initParam();
},
mounted() {
this.myCharts = this.$echarts.init(this.$refs.chart);
if (this.pdSubType === 1) {
this.drawOtgEchart(this.realRes.otgVal);
let da = {};
let dae = {};
for (let i = 0; i < this.resMap.length; i++) {
const o = this.resMap[i];
if (typeof o.val === "number" || typeof o.val === "string") {
da[o.name] = o.val;
} else if (Number(o.name) === truthFunVal.ACM_MEANRELATIVEERROR) {
dae[o.name + "_0"] = o.val.X轴平均相对误差;
dae[o.name + "_1"] = o.val.Y轴平均相对误差;
} else if (
Number(o.name) === truthFunVal.ACM_MEANABSOLUTERELATIVEERROR
) {
dae[o.name + "_0"] = o.val.X轴平均相对绝对误差;
dae[o.name + "_1"] = o.val.Y轴平均相对绝对误差;
}
}
if (Object.keys(dae).length !== 0) {
this.meanError = [dae];
}
this.tData = da;
this.tDatas = [da];
} else {
this.drawPie(this.realRes.errorImageValue);
let da = {};
this.midValue =
this.resMap.length - 1 >= 3
? Math.ceil((this.resMap.length - 1) / 2)
: this.resMap.length;
for (let i = 0; i < this.resMap.length; i++) {
const o = this.resMap[i];
if (
Number(o.name) === truthFunVal.ACM_RELATIVEERROR ||
Number(o.name) === truthFunVal.ACM_REALVALLIST
)
continue; //
da[o.name] =
typeof o.val === "number" || typeof o.val === "string"
? o.val
: o.val[0];
}
this.tDatas = [da];
this.tData = da;
}
},
methods: {
headerRowClass() {
return "background: #E4E9F1;text-align:center";
},
tableRowClassName({ rowIndex }) {
if ((rowIndex + 1) % 2 !== 0) {
return "background:#F5F7FA;text-align:center";
} else {
return "background:#FFFFFF;text-align:center";
}
},
getProductDes() {
let prodDes = null;
switch (this.pdSubType) {
case 2:
prodDes = "高程值,单位:米";
break;
case 3:
prodDes = "后向散射系数,单位dB";
break;
case 4:
prodDes = "延迟相位值";
break;
case 5:
prodDes = "形变量,单位:米";
break;
case 7:
prodDes = "土壤含水量";
break;
case 8:
prodDes = "土壤盐碱度";
break;
case 9:
prodDes = "地表粗糙度";
break;
case 10:
prodDes = "植被高度值,单位:米";
break;
case 11:
prodDes = "叶面积指数";
break;
}
return prodDes;
},
initParam() {
// console.log('',this.realRes)
if (this.realRes !== undefined) {
this.pdSubTypeName = productTypeMap(this.pdSubType);
const rr = this.realRes.report;
if (this.pdSubType === productSubTypeVal.ACS_ORTHOPHOTO) {
for (var i in rr) {
let rVal = rr[i];
switch (Number(i)) {
case truthFunVal.ACM_RELATIVEERROR: //
this.relativeError = rVal;
break;
case truthFunVal.ACM_MEANRELATIVEERROR: //
const objMap1 = {
cre_orthoXMeanRelativeError: "X轴平均相对误差",
cre_orthoYMeanRelativeError: "Y轴平均相对误差",
};
rVal = Object.fromEntries(
Object.entries(rVal).map(([k, v]) => [objMap1[k] || k, v])
);
this.resMap.push({ name: i, val: rVal });
break;
case truthFunVal.ACM_MEANABSOLUTERELATIVEERROR: //
const objMap2 = {
cre_orthoXMeanAbsoluteRelativeError: "X轴平均相对绝对误差",
cre_orthoYMeanAbsoluteRelativeError: "Y轴平均相对绝对误差",
};
rVal = Object.fromEntries(
Object.entries(rVal).map(([k, v]) => [objMap2[k] || k, v])
);
this.resMap.push({ name: i, val: rVal });
break;
default:
this.resMap.push({ name: i, val: rVal });
}
}
} else {
for (var i in rr) {
let rVal = rr[i];
this.resMap.push({ name: i, val: rVal });
}
}
}
},
drawPie(errorVala) {
let data = [];
let xArr = [];
for (let i in errorVala) {
const a = [errorVala[i].cre_imageValue, errorVala[i].cre_deviation];
xArr.push(errorVala[i].cre_imageValue);
data.push(a);
}
const x_limit = Math.abs(Math.max(...xArr) / xArr.length);
//
// var myRegression = this.$ecstat.regression("polynomial", data, 3);
let myRegression = this.$ecstat.regression("linear", data);
myRegression.points.sort(function (a, b) {
return a[0] - b[0];
});
var option = {
animation: false,
xAxis: {
name: "像元值(" + this.getProductDes() + "",
nameLocation: "middle",
min: (Math.min(...xArr) - x_limit).toFixed(5),
max: (Math.max(...xArr) + x_limit).toFixed(5),
nameTextStyle: {
lineHeight: 30,
height: 60,
fontWeight: "bold",
},
},
yAxis: {
name: "误差",
nameTextStyle: {
lineHeight: 30,
height: 60,
fontWeight: "bold",
},
},
series: [
{
symbolSize: 10,
type: "scatter",
data: data,
},
{
type: "line",
smooth: true,
showSymbol: false,
data: myRegression.points,
itemStyle: {
normal: {
color: "#91cc75",
lineStyle: {
width: 3,
},
},
},
},
],
};
option && this.myCharts.setOption(option);
},
drawOtgEchart(otgVal) {
let xl = [];
let yl = [];
let allData = [];
for (let i in otgVal) {
xl.push(otgVal[i].x);
yl.push(otgVal[i].y);
let ad = [];
ad.push(otgVal[i].x, otgVal[i].y);
allData.push(ad);
const j = Number(i) + 1;
if (Number.isInteger(j / 2)) {
allData.push("-");
}
}
let xMax = Math.max(...xl),
xMin = Math.min(...xl);
let yMax = Math.max(...yl),
yMin = Math.min(...yl);
const avgxVal = (xMax - xMin) / 8;
const avgyVal = (yMax - yMin) / 8;
let option = {
grid: {
left: "14%",
},
animation: false,
xAxis: {
name: "经度(°)",
nameLocation: "middle",
nameTextStyle: {
lineHeight: 30,
height: 60,
fontWeight: "bold",
},
min: Number(xMin - avgxVal * 2).toFixed(4),
max: Number(xMax + avgxVal * 2).toFixed(4),
axisLabel: {
formatter: function (value) {
return Number(value);
},
},
},
yAxis: {
name: "纬度(°)",
nameTextStyle: {
lineHeight: 30,
height: 60,
fontWeight: "bold",
},
min: Number(yMin - avgyVal * 2).toFixed(4),
max: Number(yMax + avgyVal * 2).toFixed(4),
axisLabel: {
formatter: function (value) {
return Number(value);
},
},
},
series: [
{
symbolSize: 8,
data: allData,
type: "line",
itemStyle: {
color: function (params) {
if ((params.dataIndex + 1) % 3 === 2) return "#0000CD";
},
},
},
],
};
option && this.myCharts.setOption(option);
},
},
};
</script>
<style scoped lang="less">
.rtReport {
width: 100%;
height: 100%;
}
.realResult {
width: 100%;
height: calc(55% - 5px);
background-color: white;
margin-bottom: 5px;
}
.errorGraph {
width: 100%;
height: 45%;
background-color: white;
}
.resContent {
border: 1px black solid;
height: calc(100% - 60px);
width: calc(100% - 20px);
margin: 10px;
font-size: 20px;
overflow-y: scroll;
span {
display: block;
margin: 10px;
}
}
.errContent {
border: 1px black solid;
height: calc(100% - 60px);
width: calc(100% - 20px);
margin: 10px;
position: relative;
}
#rtReportEcharts {
width: 100%;
height: 100%;
position: relative;
}
.box1 {
height: 40px;
line-height: 40px;
border-bottom: 1px solid rgb(205, 205, 205, 0.5);
}
.sp1 {
display: inline-block;
width: 7px;
height: 26px;
background-color: #354595;
vertical-align: top;
margin-left: 20px;
margin-top: 8px;
}
.sp2 {
margin-left: 10px;
font-size: 20px;
font-weight: 700;
color: #354595;
vertical-align: top;
}
.legend {
position: absolute;
top: 20px;
right: 20px;
background-color: transparent;
text-align: center;
display: flex;
justify-content: center;
align-items: center;
.line {
height: 20px;
line-height: 20px;
margin: 0 5px;
.circle {
display: inline-block;
width: 7px;
height: 7px;
border: 1px solid rgb(194, 53, 49);
border-radius: 50%;
margin-right: 5px;
}
.circle_2 {
display: inline-block;
width: 7px;
height: 7px;
border-radius: 50%;
margin-right: 5px;
border: 1px solid #0000cd;
}
}
}
</style>

122
src/config/config copy.js Normal file
View File

@ -0,0 +1,122 @@
const path = {
daichuli: "/daichuli", //待处理订单列表
orderUnprocessed: "/orderUnprocessed", //订单反馈
inspection: "/inspection", //检验处理
report: "/report", //报告生成
yichuli: "/yichuli",
daishenhe: "/daishenhe",
yishenhe: "/yishenhe",
login: "/"
};
const url = {
otgSamplesPath:
"/home/estar/eStarProject/webProject/microwave-project/microwaveData/sampleData/otgSamples.xlsx", //正射1
lcSamplesPath:
"/home/estar/eStarProject/webProject/microwave-project/microwaveData/sampleData/lcSamples.xlsx", //地表覆盖6
solSamplesPath:
"/home/estar/eStarProject/webProject/microwave-project/microwaveData/sampleData/solSamples.xlsx", //土壤水分7
adcSamplePath:
"/home/estar/eStarProject/webProject/microwave-project/microwaveData/sampleData/Atmospheric_Delay_Correction_Sample.xlsx", //干涉测量大气延迟校正4
bscSamplePath:
"/home/estar/eStarProject/webProject/microwave-project/microwaveData/sampleData/Back_Scattering_Coefficient_Sample.xlsx", // 后向散射系数3
dSamplePath:
"/home/estar/eStarProject/webProject/microwave-project/microwaveData/sampleData/Deformation_Sample.xlsx", // 干涉测量形变5
glaiSamplePath:
"/home/estar/eStarProject/webProject/microwave-project/microwaveData/sampleData/Ground_Leaf_Area_Index_Sample.xlsx", // 叶面积指数11
gvhSamplePath:
"/home/estar/eStarProject/webProject/microwave-project/microwaveData/sampleData/Ground_Vegetation_Height_Sample.xlsx", // 植被高度10
demSamplePath:
"/home/estar/eStarProject/webProject/microwave-project/microwaveData/sampleData/demSample.xlsx", // 高程产品2
ssiSamplePath:
"/home/estar/eStarProject/webProject/microwave-project/microwaveData/sampleData/Soil_Salinity_Inversion_Sample.xlsx", // 土壤盐碱度8
srSamplePath:
"/home/estar/eStarProject/webProject/microwave-project/microwaveData/sampleData/Surface_Roughness_Sample.xlsx", // 地表粗糙度9
vpSamplePath:
"/home/estar/eStarProject/webProject/microwave-project/microwaveData/sampleData/Vegetation_Phenology_Sample.xlsx" //Vegetation_Phenology_Sample.xlsx',// 植被物候12
};
const urlprefix = {
pdfUrlPrefix: "http://10.0.36.121:8085/microwaveData/pdf/", ///192.168.106.132
geoserverUrl: "http://10.0.36.121:8087/geoserver/gwc/service/wmts",
otgGeoServerUrl: "http://10.0.36.121:8087/geoserver/gwc/service/wmts"
};
const subProductName = [
"", //0
"正射校正", //1
"高程产品", //2
"后向散射系数", //3
"大气延迟校正", //4
"干涉测量形变", //5
"地表覆盖类型", //6
"土壤水分", //7
"土壤盐碱度", //8
"地表粗糙度", //9
"植被高度", //10
"叶面积指数", //11
"植被物候" //12
];
// 地物类型名称
const groTypeName = [
{
value: "城市",
label: "城市"
},
{
value: "水体",
label: "水体"
},
{
value: "森林",
label: "森林"
},
{
value: "灌木地",
label: "灌木地"
},
{
value: "草地",
label: "草地"
},
{
value: "林地",
label: "林地"
},
{
value: "湖泊",
label: "湖泊"
},
{
value: "大棚旱地",
label: "大棚旱地"
},
{
value: "水域",
label: "水域"
},
{
value: "有林地阔叶林",
label: "有林地阔叶林"
},
{
value: "城镇用地",
label: "城镇用地"
},
{
value: "道路交通",
label: "道路交通"
},
{
value: "出芽期",
label: "出芽期"
}
];
export default {
path,
url,
urlprefix,
subProductName,
groTypeName
};

223
src/config/config.js Normal file
View File

@ -0,0 +1,223 @@
const path = {
daichuli: "/daichuli", //待处理订单列表
orderUnprocessed: "/orderUnprocessed", //订单反馈
inspection: "/inspection", //检验处理
report: "/report", //报告生成
yichuli: "/yichuli",
daishenhe: "/daishenhe",
yishenhe: "/yishenhe",
login: "/"
};
const prefix = "D:/deveEnvironment/nginx-1.18.0/html/microwaveData/sampleExcel";
// const newPrefix = "/home/estar/eStarProject/webProject/microwave-project/microwaveData/sampleData";
const newPrefix = "D:/deveEnvironment/nginx-1.18.0/html/microwaveData/sampleExcelNew";
const url = {
otgSamplesPath: `${newPrefix}/otgSamples.xlsx`, //正射1
lcSamplesPath: `${newPrefix}/lcSamples.xlsx`, //地表覆盖6
solSamplesPath: `${newPrefix}/solSamples.xlsx`, //土壤水分7
adcSamplePath: `${newPrefix}/Atmospheric_Delay_Correction_Sample.xlsx`, //干涉测量大气延迟校正4
bscSamplePath: `${newPrefix}/Back_Scattering_Coefficient_Sample.xlsx`, // 后向散射系数3
dSamplePath: `${newPrefix}/Deformation_Sample.xlsx`, // 干涉测量形变5
glaiSamplePath: `${newPrefix}/Ground_Leaf_Area_Index_Sample.xlsx`, // 叶面积指数11
gvhSamplePath: `${newPrefix}/Ground_Vegetation_Height_Sample.xlsx`, // 植被高度10
demSamplePath: `${newPrefix}/demSample.xlsx`, // 高程产品2
ssiSamplePath: `${newPrefix}/Soil_Salinity_Inversion_Sample.xlsx`, // 土壤盐碱度8
srSamplePath: `${newPrefix}/Surface_Roughness_Sample.xlsx`, // 地表粗糙度9
vpSamplePath: `${newPrefix}/Vegetation_Phenology_Sample.xlsx` //Vegetation_Phenology_Sample.xlsx,// 植被物候12
};
// const serverUrl = "http://10.0.36.121";
const serverUrl = "http://192.168.1.104";
// const serverUrl = "http://211.157.180.211";
const urlprefix = {
pdfUrlPrefix: `${serverUrl}:18085/microwaveData/pdf/`,
samePoiImgsUrl: `${serverUrl}:18085/microwaveData/samePoiImgs/`,
geoserverUrl: `${serverUrl}:8087/geoserver/gwc/service/wmts`,
otgGeoServerUrl: `${serverUrl}:8087/geoserver/gwc/service/wmts`
};
const subProductName = [
"", //0
"正射校正", //1
"高程产品", //2
"后向散射系数", //3
"大气延迟校正", //4
"干涉测量形变", //5
"地表覆盖类型", //6
"土壤水分", //7
"土壤盐碱度", //8
"地表粗糙度", //9
"植被高度", //10
"叶面积指数", //11
"植被物候" //12
];
// 地物类型名称
const groTypeName = [
{
value: "城市",
label: "城市"
},
{
value: "水体",
label: "水体"
},
{
value: "森林",
label: "森林"
},
{
value: "灌木地",
label: "灌木地"
},
{
value: "草地",
label: "草地"
},
{
value: "水域",
label: "水域"
},
{
value: "山地",
label: "山地"
}
];
// 植被物候地物类型名称
const vegetationPhenologyGroTypeName = [
{
value: "出芽期",
label: "出芽期"
},
{
value: "分蘖期",
label: "分蘖期"
},
{
value: "越冬期",
label: "越冬期"
},
{
value: "返青期",
label: "返青期"
},
{
value: "起身期",
label: "起身期"
},
{
value: "拔节期",
label: "拔节期"
},
{
value: "孕穗期",
label: "孕穗期"
},
{
value: "抽穗期",
label: "抽穗期"
},
{
value: "扬花期",
label: "扬花期"
},
{
value: "灌浆期",
label: "灌浆期"
},
{
value: "成熟期",
label: "成熟期"
}
];
// 抽样方法
const funcOpt = [
{
name: "随机抽样",
label: "随机抽样",
value: "0",
pixelDealFun: [
{
name: "均值法",
value: "0"
},
{
name: "最邻近法",
value: "1"
},
{
name: "克里格法",
value: "2"
},
{
name: "块克里格法",
value: "3"
},
{
name: "MSN法",
value: "4"
}
]
},
{
name: "分层抽样",
label: "分层抽样",
value: "1",
pixelDealFun: [
{
name: "MSN法",
value: "4"
}
],
children: [
{
value: "0",
label: "深度空间分层"
},
{
value: "1",
label: "场站网空间分层"
}
]
},
{
name: "等距抽样",
label: "等距抽样",
value: "2",
pixelDealFun: [
{
name: "均值法",
value: "0"
},
{
name: "最邻近法",
value: "1"
},
{
name: "克里格法",
value: "2"
},
{
name: "块克里格法",
value: "3"
},
{
name: "MSN法",
value: "4"
}
]
}
];
export default {
path,
url,
urlprefix,
subProductName,
groTypeName,
vegetationPhenologyGroTypeName,
funcOpt
};

15
src/lib/auth.js Normal file
View File

@ -0,0 +1,15 @@
import Cookies from 'js-cookie'
const TokenKey = 'microwave_check_token'
export function getToken() {
return Cookies.get(TokenKey)
}
export function setToken(token) {
return Cookies.set(TokenKey, token)
}
export function removeToken() {
return Cookies.remove(TokenKey)
}

287
src/lib/cesiumUtils.js Normal file
View File

@ -0,0 +1,287 @@
import CesiumNavigation from "cesium-navigation-es6";
import configValue from "../config/config.js";
import { getProductValue } from "@/api/common";
const iconClose = require("@/assets/images/close.png");
class CesiumUtils {
//初始化地图
static initCesium(divMapId) {
let Cesium = window.Cesium;
this.Cesium = Cesium;
let options = {
selectionIndicator: false,
homeButton: false, //主页按钮默认true
// scene3DOnly: true, // 每个几何实例仅以3D渲染以节省GPU内存
animation: false, //动画控制默认true
baseLayerPicker: false, //是否显示图层选择控件
geocoder: false, //地名查找,默认true
timeline: false, //时间线,默认true
navigationHelpButton: false, //导航帮助说明,默认true
sceneModePicker: false, //是否显示投影方式控件
infoBox: false, //点击要素之后显示的信息,默认true
fullscreenButton: false, //全屏按钮,默认显示true
navigationInstructionsInitiallyVisible: false,
mapMode2D: Cesium.MapMode2D.INFINITE_SCROLL,
imageryProvider: new Cesium.WebMapTileServiceImageryProvider({
url:
"http://{s}.tianditu.gov.cn/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=d7648495378ad7ebe74327207dfc09a8",
layer: "tdtBasicLayer",
style: "default",
maximumLevel: 18,
format: "image/jpeg",
tileMatrixSetID: "GoogleMapsCompatible",
show: true,
subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"]
})
};
let viewer = new Cesium.Viewer(divMapId, options);
window.selfDefine.viewer = viewer;
this.viewer = viewer;
viewer.scene.globe.depthTestAgainstTerrain = false;
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(105.973421, 38.757527, 7000000.0),
duration: 4
});
var optionsNav = {};
// 用于在使用重置导航重置地图视图时设置默认视图控制。接受的值是Cesium.Cartographic 和 Cesium.Rectangle.
optionsNav.defaultResetView = new Cesium.Cartographic.fromDegrees(
105.973421,
38.757527,
7000000
);
// 用于启用或禁用罗盘。true是启用罗盘false是禁用罗盘。默认值为true。如果将选项设置为false则罗盘将不会添加到地图中。
optionsNav.enableCompass = true;
// 用于启用或禁用缩放控件。true是启用false是禁用。默认值为true。如果将选项设置为false则缩放控件将不会添加到地图中。
optionsNav.enableZoomControls = true;
// 用于启用或禁用距离图例。true是启用false是禁用。默认值为true。如果将选项设置为false距离图例将不会添加到地图中。
optionsNav.enableDistanceLegend = true;
// 用于启用或禁用指南针外环。true是启用false是禁用。默认值为true。如果将选项设置为false则该环将可见但无效。
optionsNav.enableCompassOuterRing = false;
// console.log('CesiumNavigation:', CesiumNavigation);
CesiumNavigation(viewer, optionsNav);
}
//添加wms
static addlayer(geoWorkspace, layerName) {
let matrixIds = [
"EPSG:4326:0",
"EPSG:4326:1",
"EPSG:4326:2",
"EPSG:4326:3",
"EPSG:4326:4",
"EPSG:4326:5",
"EPSG:4326:6",
"EPSG:4326:7",
"EPSG:4326:8",
"EPSG:4326:9",
"EPSG:4326:10",
"EPSG:4326:11",
"EPSG:4326:12",
"EPSG:4326:13",
"EPSG:4326:14",
"EPSG:4326:15",
"EPSG:4326:16",
"EPSG:4326:17",
"EPSG:4326:18",
"EPSG:4326:19",
"EPSG:4326:20",
"EPSG:4326:21"
];
let privide = new Cesium.WebMapTileServiceImageryProvider({
url: configValue.urlprefix.geoserverUrl,
// url: 'http://39.105.100.186:8087/geoserver/gwc/service/wmts',
layer: geoWorkspace + ":" + layerName,
style: "",
format: "image/png",
tileMatrixSetID: "EPSG:4326",
tileMatrixLabels: matrixIds,
tilingScheme: new Cesium.GeographicTilingScheme({
numberOfLevelZeroTilesX: 2,
numberOfLevelZeroTilesY: 1
})
});
let layer1 = new this.Cesium.ImageryLayer(privide);
this.privide = layer1;
//wms服务
this.viewer.imageryLayers.add(layer1);
// this.viewer.camera.flyTo({
// destination: Cesium.Cartesian3.fromDegrees(113.3706577887299, 22.99824617654343, 300000.0)
// });
}
// 定位到tif影像处
static flyToLayer(cLon, cLat) {
this.viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(cLon, cLat, 30000)
});
}
static flyToLayerRect(minLon, minLat, maxLon, maxLat) {
minLon = Number(minLon);
minLat = Number(minLat);
maxLon = Number(maxLon);
maxLat = Number(maxLat);
const ctLon = ((minLon + maxLon) / 2).toFixed(8);
const ctLat = ((minLat + maxLat) / 2).toFixed(8);
const west = minLon * 2 - ctLon;
const south = minLat * 2 - ctLat;
const east = maxLon * 2 - ctLon;
const north = maxLat * 2 - ctLat;
const rectangle = Cesium.Rectangle.fromDegrees(west, south, east, north);
this.viewer.camera.flyTo({
destination: rectangle
});
}
static clearLayers() {
for (var i = this.viewer.imageryLayers.length - 1; i >= 0; --i) {
if (!this.viewer.imageryLayers.get(i).isBaseLayer()) {
this.viewer.imageryLayers.remove(this.viewer.imageryLayers.get(i));
}
}
}
//删除wms
static closelayer() {
//wms服务
this.viewer.imageryLayers.remove(this.privide);
}
static addPoint(pLon, pLat, pAlt) {
var pointEntity = this.viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(pLon, pLat, pAlt),
point: {
pixelSize: 10,
color: Cesium.Color.YELLOW
}
});
}
static removePoint() {
this.viewer.entities.removeAll();
}
//鼠标点击
static handleClick() {
var scene = this.viewer.scene;
var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
const that = this;
handler.setInputAction(function(movement) {
// 清除历史单击点
handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
// movement.position 像素的x、y坐标
var cartesian = that.viewer.camera.pickEllipsoid(
movement.position,
scene.globe.ellipsoid
);
if (cartesian) {
var cartographic = Cesium.Cartographic.fromCartesian(cartesian); // 转弧度
// 将弧度转换为度数
var longitudeString = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
var latitudeString = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
}
// 取回像元值
let pValue = 0;
const of = new FormData();
of.append("dataPath", sessionStorage.getItem("tifPath"));
of.append("lon", longitudeString);
of.append("lat", latitudeString);
getProductValue(of).then(res => {
pValue = res;
// 清空容器
const pendPreview =
document.getElementById("PendPreview") ||
document.getElementById("cesium_container") ||
document.getElementById("cesiumView") ||
document.getElementById("auditPreview") ||
document.getElementById("checkedPreview") ||
document.getElementById("sceneShowContent");
const closeIcon = document.getElementsByClassName("close-icon");
if (closeIcon.length > 0) {
for (let i = 0; i < closeIcon.length; i++) {
pendPreview.removeChild(closeIcon[i]);
}
}
const closeDom = document.createElement("div");
closeDom.classList.add("close-icon");
closeDom.style.cssText = `display: none;`;
closeDom.innerHTML = `
<div style='padding: 20px; border-radius: 10px; background: white; font-family: sans-serif; font-size: 20px;'>
<div style=''>像素值:${pValue}</div>
<img class='closeIcon' src='${iconClose}' style='cursor: pointer; width: 20px; height: 20px; position: absolute; top: 3px; right: 3px;' />
</div>
`;
that.viewer.container.append(closeDom);
scene.postRender.addEventListener(() => {
const windowCoord = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
that.viewer.scene,
Cesium.Cartesian3.fromDegrees(
Number(longitudeString),
Number(latitudeString),
50
)
);
// const x = windowCoord.x - closeDom.offsetWidth / 2
// const y = windowCoord.y - closeDom.offsetHeight
const x = windowCoord.x;
const y = windowCoord.y;
closeDom.style.cssText = `
position: absolute;
top: 0;
left: 0;
transform: translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0);
display: inline-block;
`;
});
const close = document.getElementsByClassName("closeIcon")[0];
close.addEventListener(
"click",
() => {
const pendPreview =
document.getElementById("PendPreview") ||
document.getElementById("cesium_container") ||
document.getElementById("cesiumView") ||
document.getElementById("auditPreview") ||
document.getElementById("checkedPreview") ||
document.getElementById("sceneShowContent");
const closeIcon = document.getElementsByClassName("close-icon");
if (closeIcon.length > 0) {
for (let i = 0; i < closeIcon.length; i++) {
pendPreview.removeChild(closeIcon[i]);
}
}
},
false
);
// pValue = res;
// dataSource.entities.add({
// position: new Cesium.Cartesian3.fromDegrees(
// Number(longitudeString),
// Number(latitudeString),
// 50
// ),
// label: {
// text: "像素值:" + pValue,
// font: "20px sans-serif",
// showBackground: true,
// eyeOffset: new Cesium.Cartesian3(0, 3.5, 0),
// fillColor: Cesium.Color.BLACK, //字体颜色
// backgroundColor: Cesium.Color.WHITE, //背景颜色
// style: Cesium.LabelStyle.FILL, //label样式
// outlineWidth: 2,
// verticalOrigin: Cesium.VerticalOrigin.CENTER, //垂直位置
// horizontalOrigin: Cesium.HorizontalOrigin.CENTER, //水平位置
// pixelOffset: new Cesium.Cartesian2(0, -20) //偏移
// }
// });
// that.viewer.dataSources.add(dataSource);
});
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}
}
export default CesiumUtils;

36
src/lib/contract.js Normal file
View File

@ -0,0 +1,36 @@
export const productSubTypeVal = {
ACS_ORTHOPHOTO: 1, // 正射产品校验
ACS_DEM: 2, // 高程产品校验
ACS_BACKSCATTERINGCOEFFICIENT: 3, // 后向散射系数产品校验
ACS_ATMOSPHERICDELAYCORRECTION: 4, // 大气延迟校正产品校验
ACS_DEFORMATION: 5, // 干涉测量形变产品校验
ACS_TYPESOFLANDCOVER: 6, // 地表覆盖类型产品校验
ACS_SOILMOISTURE: 7, // 土壤水分产品校验
ACS_SOILSALINITYINVERSION: 8, // 土壤盐碱度产品校验
ACS_SURFACEROUGHNESS: 9, // 地表粗糙度产品校验
ACS_GROUNDVEGETATIONHEIGHT: 10, // 植被高度产品校验
ACS_GROUNDLEAFAREAINDEX: 11, // 叶面积指数产品校验
ACS_VEGETATIONPHENOLOGY: 12 // 植被物候产品校验
};
export const pixelFunVal = {
PHM_AVERAGING: 0, // 均值法
PHM_NEIGHBOR: 1, // 最邻近法
PHM_POINTKRIGING: 2, // 克里格法
PHM_BLOCKKRIGING: 3, // 块克里格法
PHM_MSN: 4 // MSN法
};
export const truthFunVal = {
ACM_MEANERROR: 0, // 平均误差
ACM_MEANABSOLUTEERROR: 1, // 平均绝对误差
ACM_RELATIVEERROR: 2, // 相对误差
ACM_MEANRELATIVEERROR: 3, // 平均相对误差
ACM_ROOTMANSQUAREERROR: 5, // 均方根误差
ACM_CORRELATIONCOEFFICIENT: 7, // 相关系数
ACM_ERRORMATRIX: 8, // 误差矩阵(混淆矩阵)
ACM_OVERALLACCURACY: 9, // 总体分类精度
ACM_KAPPA: 10, // Kappa系数
ACM_MEANABSOLUTERELATIVEERROR: 4, // 平均绝对相对误差
ACM_PLANENESSERROR: 6, // 平面中误差
ACM_REALVALLIST: 11, //真值数组记录
ACM_OTGERROR:12, //正射误差记录
};

311
src/lib/otgCesiumUtils.js Normal file
View File

@ -0,0 +1,311 @@
import configValue from "../config/config.js";
import { getProductValue } from "@/api/common";
class otgCesiumUtils {
//初始化地图
static initCesium(divMapId) {
let Cesium = window.Cesium;
this.Cesium = Cesium;
let options = {
selectionIndicator: false,
homeButton: false, //主页按钮默认true
// scene3DOnly: true, // 每个几何实例仅以3D渲染以节省GPU内存
animation: false, //动画控制默认true
baseLayerPicker: false, //是否显示图层选择控件
geocoder: false, //地名查找,默认true
timeline: false, //时间线,默认true
navigationHelpButton: false, //导航帮助说明,默认true
sceneModePicker: false, //是否显示投影方式控件
infoBox: false, //点击要素之后显示的信息,默认true
fullscreenButton: false, //全屏按钮,默认显示true
navigationInstructionsInitiallyVisible: false,
mapMode2D: Cesium.MapMode2D.INFINITE_SCROLL,
imageryProvider: new Cesium.WebMapTileServiceImageryProvider({
url:
"http://{s}.tianditu.gov.cn/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=d7648495378ad7ebe74327207dfc09a8",
layer: "tdtBasicLayer",
style: "default",
maximumLevel: 18,
format: "image/jpeg",
tileMatrixSetID: "GoogleMapsCompatible",
show: true,
subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"]
})
};
let farViewer = new Cesium.Viewer(divMapId[0], options);
let nearViewer = new Cesium.Viewer(divMapId[1], options);
window.selfDefine.farViewer = farViewer;
window.selfDefine.nearViewer = nearViewer;
this.farViewer = farViewer;
this.nearViewer = nearViewer;
farViewer.scene.globe.depthTestAgainstTerrain = false;
nearViewer.scene.globe.depthTestAgainstTerrain = false;
}
//添加wms
static addlayer(geoWorkspace, layerName) {
// let privide2 = new Cesium.WebMapServiceImageryProvider({
// url: "http://127.0.0.1:8087/geoserver/microwave/wms", //服务地址
// layers: geoWorkspace+':'+layerName, //服务图层,需要修改成你自己发布的名称
// parameters: {
// service: "WMS",
// format: "image/png",
// transparent: true
// }
// });
// let layer2= new this.Cesium.ImageryLayer(privide2)
// this.privide2=layer2
let privide1 = this.creatTwoViewerLayer(geoWorkspace, layerName);
let layer1 = new Cesium.ImageryLayer(privide1);
let privide2 = this.creatTwoViewerLayer(geoWorkspace, layerName);
let layer2 = new Cesium.ImageryLayer(privide2);
this.nearViewer.imageryLayers.add(layer1);
this.farViewer.imageryLayers.add(layer2);
}
//切换添加产品展示图层
static addFarlayer(geoWorkspace, layerName) {
let privide2 = this.creatTwoViewerLayer(geoWorkspace, layerName);
let layer2 = new Cesium.ImageryLayer(privide2);
this.farViewer.imageryLayers.add(layer2);
}
//切换添加局部放大图图层
static addNearlayer(geoWorkspace, layerName) {
let privide1 = this.creatTwoViewerLayer(geoWorkspace, layerName);
let layer1 = new Cesium.ImageryLayer(privide1);
this.nearViewer.imageryLayers.add(layer1);
}
static creatTwoViewerLayer(geoWorkspace, layerName) {
let matrixIds = [
"EPSG:4326:0",
"EPSG:4326:1",
"EPSG:4326:2",
"EPSG:4326:3",
"EPSG:4326:4",
"EPSG:4326:5",
"EPSG:4326:6",
"EPSG:4326:7",
"EPSG:4326:8",
"EPSG:4326:9",
"EPSG:4326:10",
"EPSG:4326:11",
"EPSG:4326:12",
"EPSG:4326:13",
"EPSG:4326:14",
"EPSG:4326:15",
"EPSG:4326:16",
"EPSG:4326:17",
"EPSG:4326:18",
"EPSG:4326:19",
"EPSG:4326:20",
"EPSG:4326:21"
];
return new Cesium.WebMapTileServiceImageryProvider({
url: configValue.urlprefix.otgGeoServerUrl,
// url: 'http://39.105.100.186:8087/geoserver/gwc/service/wmts',
layer: geoWorkspace + ":" + layerName,
style: "",
format: "image/png",
tileMatrixSetID: "EPSG:4326",
tileMatrixLabels: matrixIds,
tilingScheme: new Cesium.GeographicTilingScheme({
numberOfLevelZeroTilesX: 2,
numberOfLevelZeroTilesY: 1
})
});
}
// 定位到tif影像处
static flyToLayer(cLon, cLat) {
this.farViewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(cLon, cLat, 50000.0)
});
this.nearViewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(cLon, cLat, 30000.0)
});
}
//删除wms
static closelayer() {
//wms服务
this.farViewer.imageryLayers.remove(this.privide);
this.nearViewer.imageryLayers.remove(this.privide);
}
static clearFarLayers() {
for (var i = this.farViewer.imageryLayers.length - 1; i >= 0; --i) {
if (!this.farViewer.imageryLayers.get(i).isBaseLayer()) {
this.farViewer.imageryLayers.remove(this.farViewer.imageryLayers.get(i));
}
}
}
static clearNearLayers() {
for (var i = this.nearViewer.imageryLayers.length - 1; i >= 0; --i) {
if (!this.nearViewer.imageryLayers.get(i).isBaseLayer()) {
this.nearViewer.imageryLayers.remove(this.nearViewer.imageryLayers.get(i));
}
}
}
static addPointToFarViewer(pLon, pLat, pAlt) {
var peOfFarViewer = this.farViewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(pLon, pLat, pAlt),
point: {
pixelSize: 10,
color: Cesium.Color.YELLOW
}
});
this.farViewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(pLon, pLat, 5000)
});
}
static addPointToNearViewer(pLon, pLat, pAlt) {
var peOfNearViewer = this.nearViewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(pLon, pLat, pAlt),
point: {
pixelSize: 10,
color: Cesium.Color.YELLOW
}
});
this.nearViewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(pLon, pLat, 1000)
});
}
static removePoint() {
this.farViewer.entities.removeAll();
this.nearViewer.entities.removeAll();
}
static drawPoint(callback) {
let self = this;
//坐标存储
// let positions,newPoi;
this.handler = new Cesium.ScreenSpaceEventHandler(self.nearViewer.scene.canvas);
let ellipsoid = self.nearViewer.scene.globe.ellipsoid;
//单击鼠标左键画点
this.handler.setInputAction(function(movement) {
let cartesian = self.nearViewer.scene.camera.pickEllipsoid(
movement.position,
self.nearViewer.scene.globe.ellipsoid
);
let c = ellipsoid.cartesianToCartographic(cartesian);
let spLon = Cesium.Math.toDegrees(c.longitude).toFixed(8);
let spLat = Cesium.Math.toDegrees(c.latitude).toFixed(8);
let spAlt = c.height.toFixed(2);
const positions = [spLon, spLat, spAlt];
self.nearViewer.entities.removeById("theSamePoint");
const newPoi = self.nearViewer.entities.add({
id: "theSamePoint",
position: cartesian,
point: {
color: Cesium.Color.RED,
pixelSize: 10
// heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
}
});
callback(positions);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}
static stopDrowPoi() {
this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
}
//Far viewer 鼠标点击
static handleClickFar() {
var scene = this.farViewer.scene;
var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
const that = this;
handler.setInputAction(function onLeftClick(movement) {
//清除历史单击点
handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
var cartesian = that.farViewer.camera.pickEllipsoid(
movement.position,
scene.globe.ellipsoid
);
if (cartesian) {
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
var longitudeString = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
var latitudeString = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
}
//取回像元值
let pValue = 0;
that.farViewer.dataSources.removeAll();
const dataSource = new Cesium.CustomDataSource("textPoint");
const of = new FormData();
of.append("dataPath", sessionStorage.getItem("tifPath"));
of.append("lon", longitudeString);
of.append("lat", latitudeString);
getProductValue(of).then(res => {
pValue = res;
dataSource.entities.add({
position: new Cesium.Cartesian3.fromDegrees(
Number(longitudeString),
Number(latitudeString),
50
),
label: {
text: "像素值:" + pValue,
font: "20px sans-serif",
showBackground: true,
eyeOffset: new Cesium.Cartesian3(0, 3.5, 0),
fillColor: Cesium.Color.BLACK, //字体颜色
backgroundColor: Cesium.Color.WHITE, //背景颜色
style: Cesium.LabelStyle.FILL, //label样式
outlineWidth: 2,
verticalOrigin: Cesium.VerticalOrigin.CENTER, //垂直位置
horizontalOrigin: Cesium.HorizontalOrigin.CENTER, //水平位置
pixelOffset: new Cesium.Cartesian2(0, -20) //偏移
}
});
that.farViewer.dataSources.add(dataSource);
});
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}
//Near viewer 鼠标点击
static handleClickNear() {
var scene = this.nearViewer.scene;
var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
const that = this;
handler.setInputAction(function onLeftClick(movement) {
//清除历史单击点
handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
var cartesian = that.nearViewer.camera.pickEllipsoid(
movement.position,
scene.globe.ellipsoid
);
if (cartesian) {
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
var longitudeString = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
var latitudeString = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
}
//取回像元值
let pValue = 0;
that.nearViewer.dataSources.removeAll();
const dataSource = new Cesium.CustomDataSource("textPoint");
const of = new FormData();
of.append("dataPath", sessionStorage.getItem("tifPath"));
of.append("lon", longitudeString);
of.append("lat", latitudeString);
getProductValue(of).then(res => {
dataSource.entities.add({
position: new Cesium.Cartesian3.fromDegrees(
Number(longitudeString),
Number(latitudeString),
50
),
label: {
text: "像素值:" + pValue,
font: "20px sans-serif",
showBackground: true,
eyeOffset: new Cesium.Cartesian3(0, 3.5, 0),
fillColor: Cesium.Color.BLACK, //字体颜色
backgroundColor: Cesium.Color.WHITE, //背景颜色
style: Cesium.LabelStyle.FILL, //label样式
outlineWidth: 2,
verticalOrigin: Cesium.VerticalOrigin.CENTER, //垂直位置
horizontalOrigin: Cesium.HorizontalOrigin.CENTER, //水平位置
pixelOffset: new Cesium.Cartesian2(0, -20) //偏移
}
});
that.nearViewer.dataSources.add(dataSource);
});
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}
}
export default otgCesiumUtils;

60
src/lib/request-file.js Normal file
View File

@ -0,0 +1,60 @@
import axios from 'axios'
import { Message } from 'element-ui'
// create an axios instance
const service = axios.create({
baseURL: process.env.VUE_APP_FILE_API, // url = base url + request url
// withCredentials: true, // send cookies when cross-domain requests
timeout: 5000000 // request timeout
})
// request interceptor
service.interceptors.request.use(
config => {
// do something before request is sent
// if (store.getters.token) {
// config.headers['X-Token'] = getToken()
// }
return config
},
error => {
// do something with request error
console.log(error) // for debug
return Promise.reject(error)
}
)
// response interceptor
service.interceptors.response.use(
response => {
const res = response.data
// if the custom code is not 20000, it is judged as an error.
// if (res.code !== 200) {
// if(res.code === 500){
// return res
// }
// Message({
// message: res.message || 'Error',
// type: 'error',
// duration: 5 * 1000
// })
// // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
// if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
// return Promise.reject(new Error(res.message || 'Error'))
// }
// } else {
return res
// }
},
error => {
console.log('err' + error) // for debug
Message({
message: error.message,
type: 'error',
duration: 5 * 1000
})
return Promise.reject(error)
}
)
export default service

View File

@ -0,0 +1,60 @@
import axios from 'axios'
import { Message } from 'element-ui'
// create an axios instance
const service = axios.create({
baseURL: process.env.VUE_APP_REALITY_API, // url = base url + request url
// withCredentials: true, // send cookies when cross-domain requests
timeout: 5000000 // request timeout
})
// request interceptor
service.interceptors.request.use(
config => {
// do something before request is sent
// if (store.getters.token) {
// config.headers['X-Token'] = getToken()
// }
return config
},
error => {
// do something with request error
console.log(error) // for debug
return Promise.reject(error)
}
)
// response interceptor
service.interceptors.response.use(
response => {
const res = response.data
// if the custom code is not 20000, it is judged as an error.
// if (res.code !== 200) {
// if(res.code === 500){
// return res
// }
// Message({
// message: res.message || 'Error',
// type: 'error',
// duration: 5 * 1000
// })
// // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
// if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
// return Promise.reject(new Error(res.message || 'Error'))
// }
// } else {
return res
// }
},
error => {
console.log('err' + error) // for debug
Message({
message: error.message,
type: 'error',
duration: 5 * 1000
})
return Promise.reject(error)
}
)
export default service

60
src/lib/request.js Normal file
View File

@ -0,0 +1,60 @@
import axios from 'axios'
import { Message } from 'element-ui'
// create an axios instance
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
// withCredentials: true, // send cookies when cross-domain requests
timeout: 5000000 // request timeout
})
// request interceptor
service.interceptors.request.use(
config => {
// do something before request is sent
// if (store.getters.token) {
// config.headers['X-Token'] = getToken()
// }
return config
},
error => {
// do something with request error
console.log(error) // for debug
return Promise.reject(error)
}
)
// response interceptor
service.interceptors.response.use(
response => {
const res = response.data
// if the custom code is not 20000, it is judged as an error.
// if (res.code !== 200) {
// if(res.code === 500){
// return res
// }
// Message({
// message: res.message || 'Error',
// type: 'error',
// duration: 5 * 1000
// })
// // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
// if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
// return Promise.reject(new Error(res.message || 'Error'))
// }
// } else {
return res
// }
},
error => {
console.log('err' + error) // for debug
Message({
message: error.message,
type: 'error',
duration: 5 * 1000
})
return Promise.reject(error)
}
)
export default service

58
src/lib/scroll-to.js Normal file
View File

@ -0,0 +1,58 @@
Math.easeInOutQuad = function(t, b, c, d) {
t /= d / 2
if (t < 1) {
return c / 2 * t * t + b
}
t--
return -c / 2 * (t * (t - 2) - 1) + b
}
// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts
var requestAnimFrame = (function() {
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) }
})()
/**
* Because it's so fucking difficult to detect the scrolling element, just move them all
* @param {number} amount
*/
function move(amount) {
document.documentElement.scrollTop = amount
document.body.parentNode.scrollTop = amount
document.body.scrollTop = amount
}
function position() {
return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop
}
/**
* @param {number} to
* @param {number} duration
* @param {Function} callback
*/
export function scrollTo(to, duration, callback) {
const start = position()
const change = to - start
const increment = 20
let currentTime = 0
duration = (typeof (duration) === 'undefined') ? 500 : duration
var animateScroll = function() {
// increment the time
currentTime += increment
// find the value with the quadratic in-out easing function
var val = Math.easeInOutQuad(currentTime, start, change, duration)
// move the document.body
move(val)
// do the animation unless its over
if (currentTime < duration) {
requestAnimFrame(animateScroll)
} else {
if (callback && typeof (callback) === 'function') {
// the animation is done so lets callback
callback()
}
}
}
animateScroll()
}

106
src/lib/variateMap.js Normal file
View File

@ -0,0 +1,106 @@
//产品枚举映射
export function productTypeMap(pdtype) {
const pdtypeMap = {
1: "正射产品",
2: "高程产品",
3: "后向散射系数产品",
4: "大气延迟校正产品",
5: "干涉测量形变产品",
6: "地表覆盖类型产品",
7: "土壤水分产品",
8: "土壤盐碱度产品",
9: "地表粗糙度产品",
10: "植被高度产品",
11: "叶面积指数产品",
12: "植被物候产品"
};
if (pdtype == null) return null;
else return pdtypeMap[pdtype];
}
//产品--样本类型映射
export function productTypeSplMap(pdtype) {
const pdtypeMap = {
1: "正射样本",
2: "高程样本",
3: "后向散射系数样本",
4: "大气延迟校正样本",
5: "干涉测量形变样本",
6: "地表覆盖类型样本",
7: "土壤水分样本",
8: "土壤盐碱度样本",
9: "地表粗糙度样本",
10: "植被高度样本",
11: "叶面积指数样本",
12: "植被物候样本"
};
if (pdtype == null) return null;
else return pdtypeMap[pdtype];
}
//真实性检验方法映射
export function truthFunctionsMap(truthFun) {
const truthFunMap = {
0: "平均误差",
1: "平均绝对误差",
2: "相对误差",
3: "平均相对误差",
4: "平均绝对相对误差",
5: "均方根误差",
6: "平面中误差",
7: "相关系数",
8: "误差矩阵",
9: "总体分类精度",
10: "Kappa系数",
11: "产品真值",
12: "正射误差列表"
};
if (truthFun == null) return null;
else return truthFunMap[truthFun];
}
// 抽样方法枚举转换
export function transformSlp(sampleFun) {
const sampleFunMap = {
"0": "随机抽样",
"1": "分层抽样",
"2": "等距抽样"
};
if (sampleFun == null) return null;
else return sampleFunMap[sampleFun];
}
// 像元级方法枚举转换
export function transformPcMethod(pixelDealFun) {
const pixelDealFunMap = {
"0": "均值法",
"1": "最邻近法",
"2": "克里格法",
"3": "块克里格法",
"4": "MSN法"
};
if (pixelDealFun == null) return null;
else return pixelDealFunMap[pixelDealFun];
}
export const PIXELDEALFUNOPTION = [
{
value: "0",
label: "均值法"
},
{
value: "1",
label: "最邻近法"
},
{
value: "2",
label: "克里格法"
},
{
value: "3",
label: "块克里格法"
},
{
value: "4",
label: "MSN法"
}
];

41
src/main.js Normal file
View File

@ -0,0 +1,41 @@
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import moment from 'moment'
import "animate.css"
import "./assets/css/global.css";
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import 'element-ui/lib/theme-chalk/base.css';
import config from './config/config.js'
Vue.use(ElementUI)
import '../node_modules/cesium/Build/Cesium/Widgets/widgets.css';
import * as Cesium from "../node_modules/cesium/Build/Cesium/Cesium.js";
window.Cesium = Cesium;
//全局bus 组件传值
Vue.prototype.bus=new Vue();
// 加入moment所有的组件
Vue.prototype.$moment = moment;
// echarts
import echarts from 'echarts' //引入echarts
import ecstat from 'echarts-stat'/*echarts统计组件*/
Vue.prototype.$ecstat = ecstat /*echarts统计组件*/
Vue.prototype.$echarts = echarts; //引入组件
Vue.prototype.configration = config;
Vue.config.productionTip = false
window.selfDefine = {
viewer: null
};
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')

18
src/mixins/formator.js Normal file
View File

@ -0,0 +1,18 @@
export default {
methods:{
formatDatetime(inputTime){
//如果为空值则返回空字符串
if(!inputTime ){//&& typeof inputTime !== 'number'){
return '';
}
var localTime = '';
//获取毫秒数
inputTime = new Date(inputTime).getTime();
const offset = (new Date()).getTimezoneOffset();
localTime = (new Date(inputTime - offset * 60000)).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf('.'));
localTime = localTime.replace('T', ' ');
return localTime;
}
}
}

143
src/router/index.js Normal file
View File

@ -0,0 +1,143 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
import Login from '../views/Login.vue'
Vue.use(VueRouter)
import about from "../views/About.vue"
import daichuli from "../views/Daichuli/index.vue"
import yichuli from "../views/Yichuli/index.vue"
import daishenhe from "../views/Daishenhe/index.vue"
import yishenhe from "../views/Yishenhe/index.vue"
import orderUnprocessed from '../views/Daichuli/Feedback/index.vue'
import AuditDsh from '../views/Daishenhe/Audit/index.vue'
import feedbackYcl from '../views/Yichuli/Feedback/index.vue'
import feedbackYsh from '../views/Yishenhe/Feedback/index.vue'
import Inspection from '../views/Daichuli/Feedback/Inspection/index.vue'
import Report from '../views/Daichuli/Feedback/Inspection/Report/index.vue'
const routes = [
{
path: '/',
name: 'Login',
component: Login,
meta: { title: "首页" }
},
{
path: '/home',
name: 'Home',
component: Home,
meta: { title: "首页" }
},
{
path: '/about',
component: about,
children: [
{
path: '/daichuli',
component: daichuli,
name: '待处理的检验订单',
meta: {
requireAuth: true,
}
},
{
path: '/orderUnprocessed',
component: orderUnprocessed,
name: '订单反馈',
meta: {
requireAuth: true,
breadNumber: 2
}
},
{
path: '/inspection',
component: Inspection,
name: '检验处理',
meta: {
requireAuth: true,
breadNumber: 3
}
},
{
path: '/report',
component: Report,
name: '报告生成',
meta: {
requireAuth: true,
breadNumber: 4
}
},
{
path: '/yichuli',
component: yichuli,
name: '已处理检验订单',
meta: {
requireAuth: true,
}
},
{
path: '/feedbackycl',
component: feedbackYcl,
name: '订单处理信息',
meta: {
requireAuth: true,
breadNumber: 2
}
},
{
path: '/daishenhe',
component: daishenhe,
name: '待审核检验订单',
meta: {
requireAuth: true,
}
},
{
path: '/auditdsh',
component: AuditDsh,
name: '订单审核',
meta: {
requireAuth: true,
breadNumber: 2
}
},
{
path: '/yishenhe',
component: yishenhe,
name: '已审核检验订单',
meta: {
requireAuth: true,
}
},
{
path: '/feedbackysh',
component: feedbackYsh,
name: '已审核订单信息',
meta: {
requireAuth: true,
breadNumber: 2
}
}
]
}
]
//获取原型对象上的push函数
const originalPush = VueRouter.prototype.push
//修改原型对象中的push方法
VueRouter.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => err)
}
const router = new VueRouter({
mode:'history',
routes
})
router.beforeEach((to, from, next) => {
sessionStorage.setItem('prePage',from.path)
next()
})
export default router

28
src/store/index.js Normal file
View File

@ -0,0 +1,28 @@
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
const state = {
breadListState: [], // 面包屑列表数据
pixelFun:null,
sampleFun:null,
altRange:null
};
export default new Vuex.Store({
state,
mutations: {
breadListMutations (getters, list) {
getters.breadListState = list;
},
setPixelFun(getters, val){
getters.pixelFun=val;
},
setSampleFun(getters, val){
getters.sampleFun=val
},
setAltRange(getters, val){
getters.altRange=val
}
}
});

298
src/views/About.vue Normal file
View File

@ -0,0 +1,298 @@
<template>
<div class="layout">
<el-container>
<!-- 侧边栏 -->
<div style="max-width: 300px; height: 100%; background-color: #061278">
<el-menu
:default-active="activeMenu"
class="el-menu-vertical-demo"
background-color="#061278"
text-color="#fff"
active-text-color="#ffd04b"
:router="true"
:collapse="isCollapse"
>
<el-menu-item index="/daichuli" v-show="userType === '2'">
<i class="el-icon-s-order"></i>
<span slot="title">待处理的检验订单</span>
</el-menu-item>
<el-menu-item index="/yichuli" v-show="userType === '2'">
<i class="el-icon-s-claim"></i>
<span slot="title">已处理的检验订单</span>
</el-menu-item>
<el-menu-item index="/daishenhe" v-show="userType === '3'">
<i class="el-icon-s-open"></i>
<span slot="title">待审核的检验订单</span>
</el-menu-item>
<el-menu-item index="/yishenhe" v-show="userType === '3'">
<i class="el-icon-s-check"></i>
<span slot="title">已审核的检验订单</span>
</el-menu-item>
<el-menu-item index="/" class="toHome">
<i class="el-icon-s-home"></i>
<span slot="title">返回首页</span>
</el-menu-item>
</el-menu>
</div>
<el-container>
<!-- 页码头部标题 -->
<el-header>
<vheader></vheader>
</el-header>
<div class="lline">
<!-- 导航折叠按钮 -->
<el-radio-group
v-model="isCollapse"
style="margin-bottom: 20px"
@change="btnClick"
class="navbtn"
>
<el-radio-button :label="false" class="icon1" v-show="btn1Show">
<i class="el-icon-s-unfold"></i>
</el-radio-button>
<el-radio-button :label="true" class="icon2" v-show="btn2Show">
<i class="el-icon-s-fold"></i>
</el-radio-button>
</el-radio-group>
<!--面包屑列表-->
<el-breadcrumb class="navbread" separator="/">
<el-breadcrumb-item
v-for="(item, index) in breadList"
:key="index"
@click.native="breadcrumbClick(item)"
:v-if="item.name"
style="cursor: pointer"
>
{{ item.name }}
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<!-- 主页 -->
<el-main>
<!-- 路由组件 -->
<transition name="Fade" mode="out-in">
<router-view></router-view>
</transition>
</el-main>
</el-container>
</el-container>
</div>
</template>
<script>
import vheader from "../components/home/header/index.vue";
export default {
// name:'nav',
components: { vheader },
data() {
return {
breadList: [],
isCollapse: false,
btn1Show: false,
btn2Show: true,
activeMenu: "/daichuli",
userType: null,
};
},
watch: {
$route() {
this.getBreadcrumb();
},
},
created() {
this.getBreadcrumb();
this.userType = localStorage.userType;
this.activeMenu = this.$route.path;
},
methods: {
btnClick() {
this.btn1Show = !this.btn1Show;
this.btn2Show = !this.btn1Show;
},
//
getBreadcrumb() {
let that = this;
// breadNumber = 1breadNumber
let breadNumber =
typeof this.$route.meta.breadNumber !== "undefined"
? this.$route.meta.breadNumber
: 1;
//
let newBread = { name: this.$route.name, path: this.$route.fullPath };
let vuexBreadList = []; //
if (breadNumber !== 1) {
// breadNumber1vuex
vuexBreadList = that.$store.state.breadListState; // breadList
}
if (breadNumber < vuexBreadList.length) {
// "退"----breadNumbervuexBreadList
vuexBreadList.splice(
breadNumber - vuexBreadList.length,
vuexBreadList.length - breadNumber
);
}
if (breadNumber > vuexBreadList.length) {
// ----breadNumbervuexBreadList
vuexBreadList.push(newBread);
}
// vuex
that.$store.commit("breadListMutations", vuexBreadList);
//
that.breadList = vuexBreadList;
},
//
breadcrumbClick(item) {
this.$router.push({
path: item.path,
});
},
},
};
</script>
<style scoped lang='less'>
.Fade-enter,
.Fade-leave-to {
opacity: 0;
}
.Fade-enter-to,
.Fade-leave {
opacity: 1;
}
.Fade-enter-active,
.Fade-leave-active {
transition: all 0.4s;
}
.lline {
padding-left: 20px;
padding-top: 15px;
height: 30px;
line-height: 30px;
// background-color: gainsboro;
background-color: #e4e8f1;
padding-bottom: 10px;
}
/deep/.el-breadcrumb__inner.is-link:hover {
color: #303133;
}
/deep/.el-menu {
border-right: 0;
}
/deep/.el-breadcrumb__inner.is-link {
font-size: 20px;
font-weight: 400;
}
.navbtn {
display: inline-block;
vertical-align: top;
}
.navbread {
display: inline-block;
vertical-align: top;
font-size: 20px;
// font-weight: 400;
position: relative;
top: 2.5px;
}
.icon1 {
position: relative;
left: 0px;
}
.icon2 {
position: relative;
left: 0px;
}
/deep/.el-radio-button__inner:hover {
color: #333;
}
/deep/.el-radio-button__orig-radio:checked + .el-radio-button__inner {
border-color: #e4ebf1;
// border-color:gainsboro;
box-shadow: -1px 0 0 0 #e4ebf1;
}
/deep/.el-radio-button__inner {
font-size: 25px;
padding: 0 10px 0 0;
}
/deep/.el-radio-button__orig-radio:checked + .el-radio-button__inner {
background-color: #e4ebf1;
}
/deep/.el-radio-button__inner {
background-color: #e4ebf1;
}
.el-menu-vertical-demo:not(.el-menu--collapse) {
width: 260px;
height: 100%;
}
.el-menu-item {
font-size: 20px;
font-family: "PingFangSC-Medium";
position: relative;
top: 60px;
}
.el-menu-item,
.el-submenu__title {
height: 60px;
line-height: 60px;
text-align: center;
}
.el-menu-item.is-active {
background-color: #409eff !important;
color: white !important;
}
.layout .el-container {
height: 100vh;
}
.el-header {
background-color: white;
color: #333;
}
.el-aside {
background-color: #354595;
color: #333;
line-height: 200px;
}
.el-main {
// background-color: gainsboro;
background-color: #e4e8f1;
color: #333;
padding-top: 0px;
}
.el-breadcrumb {
margin-left: 15px;
}
body > .el-container {
margin-bottom: 40px;
}
.el-container:nth-child(5) .el-aside,
.el-container:nth-child(6) .el-aside {
line-height: 260px;
}
.el-container:nth-child(7) .el-aside {
line-height: 320px;
}
h1 {
height: 60px;
line-height: 60px;
font-size: 20px;
color: white;
text-align: center;
}
.el-menu .toHome {
position: absolute;
top: unset;
bottom: 0px;
width: 100%;
}
.el-menu--collapse {
height: 100%;
}
</style>

View File

@ -0,0 +1,693 @@
<template>
<div class="report">
<div class="rpHeader">
<div class="rphLeft">
<QtReport
ref="reportQT"
:realRes="realRes"
:pdSubType="pdSubType"
v-if="pdSubType === 6 || pdSubType === 12"
></QtReport>
<RtReport
ref="reportRT"
:realRes="realRes"
:pdSubType="pdSubType"
v-else
></RtReport>
</div>
<div class="rphRight">
<div class="box1">
<span class="sp1"></span><span class="sp2">产品检验报告PDF</span>
</div>
<div
class="pdfContent"
v-loading="pdfLoading"
element-loading-text="PDF生成中..."
element-loading-spinner="el-icon-loading"
>
<!-- <PdfLoad :pdfPath="pdfPath" v-if="pdfLoading === false"></PdfLoad> -->
<iframe
class="pdfPage"
:src="pdfPath"
frameborder="0"
v-if="pdfLoading === false"
></iframe>
</div>
</div>
</div>
<div class="rpShow">
<el-tabs type="card">
<el-tab-pane label="查看待检验产品">
<div
class="earth"
id="cesiumView"
@click="pickValue"
style="overflow: hidden; position: relative"
></div>
<div class="cstop">
<el-form
:inline="true"
:model="rpDataMsg"
class="demo-form-inline"
:disabled="true"
>
<el-form-item label="卫星" class="ysjMsg">
<el-input
class="ysjMsgMrg"
v-model="rpDataMsg.satellite"
placeholder="采样卫星"
></el-input>
</el-form-item>
<el-form-item label="载荷名称" class="ysjMsg">
<el-input
v-model="rpDataMsg.load"
placeholder="载荷方式"
></el-input>
</el-form-item>
<el-form-item label="空间分辨率" class="ysjMsg2">
<el-input
v-model="rpDataMsg.spatialRes"
placeholder="空间分辨率"
></el-input>
</el-form-item>
<el-form-item label="时间" class="ysjMsg">
<el-input
class="ysjMsgMrg"
v-model="formatDateStr"
placeholder="采样时间"
></el-input>
</el-form-item>
<el-form-item label="级别" prop="resource" class="ysjMsg2">
<el-radio-group v-model="rpDataMsg.level">
<el-radio label="3"></el-radio>
<el-radio label="4"></el-radio>
<el-radio label="5"></el-radio>
<!-- <el-radio label="其他"></el-radio> -->
</el-radio-group> </el-form-item
><br />
<el-form-item label="坐标系统" class="ysjMsg">
<el-input
v-model="rpDataMsg.coordinateSys"
placeholder="坐标系统"
></el-input>
</el-form-item>
<el-form-item label="最小纬度" class="ysjMsg">
<el-input
v-model="rpDataMsg.minLat"
placeholder="最小纬度"
></el-input>
</el-form-item>
<el-form-item label="最大纬度" class="ysjMsg2">
<el-input
style="margin-left: 6px"
v-model="rpDataMsg.maxLat"
placeholder="最大纬度"
></el-input>
</el-form-item>
<el-form-item label="最小经度" class="ysjMsg">
<el-input
v-model="rpDataMsg.minLon"
placeholder="最小经度"
></el-input>
</el-form-item>
<el-form-item label="最大经度" class="ysjMsg2">
<el-input
v-model="rpDataMsg.maxLon"
placeholder="最大经度"
></el-input>
</el-form-item>
</el-form>
</div>
</el-tab-pane>
<el-tab-pane label="查看样本数据">
<el-table
:header-cell-style="headerRowClass"
:cell-style="tableRowClassName"
style="width: 98%; margin-left: 1%; margin-top: 15px"
:data="sampleData"
:stripe="true"
height="520"
>
<el-table-column type="index" label="序号" width="80">
</el-table-column>
<el-table-column prop="sampleId" label="样本编号" sortable>
</el-table-column>
<el-table-column prop="lon" label="经度"></el-table-column>
<el-table-column prop="lat" label="纬度"></el-table-column>
<el-table-column prop="alt" label="高度"></el-table-column>
<el-table-column prop="dataTime" label="采样日期" sortable>
<template slot-scope="scope">
{{ scope.row.dataTime | formatDate }}
</template>
</el-table-column>
<el-table-column
prop="addTime"
label="预处理时间"
sortable
align="center"
>
<template slot-scope="scope">
{{ scope.row.addTime | formatDate }}
</template>
</el-table-column>
<el-table-column
prop="dataValue"
label="可信度"
sortable
align="center"
></el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
</div>
<div class="rpBottom">
<el-button type="primary" @click="downloadReport">PDF</el-button>
<el-button type="primary" @click="submitReport"></el-button>
<el-button type="primary" @click="reExamine"></el-button>
</div>
</div>
</template>
<script>
import RtReport from "@/components/rtReport";
import QtReport from "@/components/qtReport";
import PdfLoad from "@/components/pdfLoad";
import cu from "@/lib/cesiumUtils";
import {
downloadPdf,
updateOrderStage,
updateOrderMsg,
disOrderStatus,
addReportMsg,
exportWord,
} from "@/api/pendingOrder";
import { productSubTypeVal, truthFunVal } from "@/lib/contract.js";
import {
truthFunctionsMap,
productTypeMap,
productTypeSplMap,
} from "@/lib/variateMap";
export default {
components: {
RtReport,
QtReport,
PdfLoad,
},
filters: {
formatDate(inputTime) {
if (!inputTime && typeof inputTime !== "number") {
return "";
}
var localTime = "";
inputTime = new Date(inputTime);
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
},
data() {
return {
queryParams: null,
reportMsg: "",
pdSubType: undefined,
pdfLoading: true,
pdfPath: "", // pdf
sampleData: [],
rpDataMsg: {
user: "",
satellite: "5米光学卫星",
load: "可见/近红外相机",
spatialRes: "0.00000307°",
date: "2021-08-03 16:52:40",
level: "3",
coordinateSys: "WGS84",
centerPoint: "POINT(118.32,34.7)",
minLat: "116.13622332",
maxLat: "118.3422222",
minLon: "34.211234",
maxLon: "35.3455667",
},
realRes: undefined,
base64Data: null,
};
},
mounted() {
cu.initCesium("cesiumView");
const geoWS = this.reportMsg.geoWS;
const geoLN = this.reportMsg.geoLN;
cu.addlayer(geoWS, geoLN);
const gp = this.reportMsg.geoLayerPos;
cu.flyToLayerRect(gp[0], gp[1], gp[2], gp[3]);
const sd = this.sampleData;
for (let i in sd) {
cu.addPoint(sd[i].lon, sd[i].lat, sd[i].alt);
}
if (this.pdSubType === 6 || this.pdSubType === 12) {
this.base64Data = this.$refs.reportQT.myCharts.getDataURL();
} else {
this.base64Data = this.$refs.reportRT.myCharts.getDataURL();
}
this.exportPdf(this.reportMsg);
},
created() {
if (
Object.keys(this.$route.params).length > 0 &&
sessionStorage.getItem("prePage") === this.configration.path.inspection
) {
this.queryParams = this.$route.params;
} else {
this.queryParams = JSON.parse(
localStorage.getItem(this.configration.path.inspection)
);
}
document.body.scrollTop = 0;
this.init();
},
methods: {
tableRowClassName({ rowIndex }) {
if ((rowIndex + 1) % 2 !== 0) {
return "background:#F5F7FA;text-align:center";
} else {
return "background:#FFFFFF;text-align:center";
}
},
headerRowClass() {
return "background: #E4E9F1;text-align:center";
},
init() {
const self = this;
const rpm = (self.reportMsg = this.queryParams);
// console.log('sendMsg',rpm);
self.realRes = rpm.reportResult;
self.pdSubType = rpm.pdSubType;
const rsl = (self.sampleData = rpm.sampleList);
//
if (rpm.pdSubType === productSubTypeVal.ACS_ORTHOPHOTO) {
let otgVal = [];
for (let i in rsl) {
if (rsl[i].sameLon !== null) {
otgVal.push({ name: "mPoint", x: rsl[i].lon, y: rsl[i].lat });
otgVal.push({
name: "sPoint",
x: rsl[i].sameLon,
y: rsl[i].sameLat,
});
}
}
self.realRes.otgVal = otgVal;
}
const md = rpm.metaData;
self.rpDataMsg = {
satellite: md.satellite,
load: md.load,
spatialRes: md.resRatio,
date: md.producedDate,
level: md.proLevel,
coordinateSys: md.coordinateSys,
minLat: md.minLat,
maxLat: md.maxLat,
minLon: md.minLon,
maxLon: md.maxLon,
centerPoint: "POINT(" + md.centerLon + "," + md.centerLat + ")",
};
},
//
exportPdf(rpm) {
const self = this;
const asmo = rpm.orderMsg;
const asmp = rpm.productMsg;
const asmm = rpm.metaData;
//
const rpVal = rpm.reportResult.report;
const crTime = rpm.reportResult.time;
let iat = "";
let iatResArr = [];
const psId = self.pdSubType;
const psVal = productSubTypeVal;
let errorList = [];
let realList = [];
let otgError = [];
for (let i in rpVal) {
let ri = rpVal[i];
const ni = Number(i);
// 823
if (
ni === truthFunVal.ACM_ERRORMATRIX ||
ni === truthFunVal.ACM_RELATIVEERROR ||
ni === truthFunVal.ACM_REALVALLIST
) {
ri = JSON.stringify(rpVal[i]);
}
if (
(ni === truthFunVal.ACM_MEANABSOLUTERELATIVEERROR ||
ni === truthFunVal.ACM_MEANRELATIVEERROR) &&
psId === psVal.ACS_ORTHOPHOTO
) {
ri = JSON.stringify(rpVal[i]);
}
if (ni === truthFunVal.ACM_RELATIVEERROR) errorList = rpVal[i];
if (ni === truthFunVal.ACM_REALVALLIST) realList = rpVal[i];
if (ni === truthFunVal.ACM_OTGERROR) otgError = rpVal[i];
iatResArr.push(truthFunctionsMap(i) + ":" + ri);
if (
ni !== truthFunVal.ACM_OTGERROR &&
ni !== truthFunVal.ACM_REALVALLIST
)
iat += truthFunctionsMap(i) + ",";
}
if (iat.length > 0) iat = iat.substr(0, iat.length - 1);
//
let category = undefined;
if (psId === psVal.ACS_ORTHOPHOTO || psId === psVal.ACS_DEM)
category = "几何";
else if (
psId === psVal.ACS_BACKSCATTERINGCOEFFICIENT ||
psId === psVal.ACS_ATMOSPHERICDELAYCORRECTION
)
category = "辐射";
else if (
psId === psVal.ACS_GROUNDLEAFAREAINDEX ||
psId === psVal.ACS_VEGETATIONPHENOLOGY ||
psId === psVal.ACS_GROUNDVEGETATIONHEIGHT
)
category = "植被";
else category = "陆表";
const pdfMsg = {
category: category,
categoryType: productTypeSplMap(self.pdSubType),
product: productTypeMap(self.pdSubType),
orderID: asmo.order_code,
reportMaker: localStorage.userName,
orderCreateTime: asmo.create_date,
orderStartTime: crTime.startTime,
orderEndTime: crTime.endTime,
reportCreateTime: asmo.create_date,
inspectorName: localStorage.userName,
productFileName: asmp.fileName,
resolution: asmm.resRatio + "",
productCreateTime: asmp.productDate,
coordinatSeystem: asmm.coordinateSys,
sampleTimeRequest:
asmo.simple_start_time + " - " + asmo.simple_end_time,
sampleType: "点",
sampleCount: rpm.sampleList.length + "",
// areaLeftUp: asmm.minLon + "," + asmm.maxLat,
// areaRightDown: asmm.maxLon + "," + asmm.minLat,
minLon: asmm.minLon,
maxLon: asmm.maxLon,
minLat: asmm.minLat,
maxLat: asmm.maxLat,
inspectionAlgorithm: iat,
sampleList: JSON.stringify(rpm.sampleList),
inspectionResultList: iatResArr,
imgData: this.base64Data,
errorList: errorList,
realList: realList,
otgError: otgError,
};
const pdfName = productTypeMap(self.pdSubType) + "报告";
const localTiffPath = rpm.tifPath;
const httpTiffPath = null;
// console.log("1111111", pdfMsg);
exportWord(pdfMsg, pdfName, localTiffPath, httpTiffPath, psId).then(
(res) => {
if (res.msg === "success") {
const ru = res.pdfUrl;
const pos = ru.lastIndexOf("/");
const pdfName = ru.substr(pos + 1);
self.pdfPath = this.configration.urlprefix.pdfUrlPrefix + pdfName;
self.pdfLoading = false;
}
}
);
},
//
downloadReport() {
const pdfPath = this.pdfPath;
if (pdfPath !== null || pdfPath !== undefined) {
const pdfName = pdfPath.substr(pdfPath.lastIndexOf("/") + 1); //
downloadPdf(pdfPath).then((res) => {
if (res.size > 0) {
const content = res;
const blob = new Blob([content]);
const fileName = pdfName;
if ("download" in document.createElement("a")) {
// IE
const elink = document.createElement("a");
elink.download = fileName;
elink.style.display = "none";
elink.href = URL.createObjectURL(blob);
document.body.appendChild(elink);
elink.click();
URL.revokeObjectURL(elink.href); // URL
document.body.removeChild(elink);
} else {
// IE10+
navigator.msSaveBlob(blob, fileName);
}
}
});
}
},
//
submitReport() {
//
const os = 2; //
this.updateOrder(os);
//
const rpm = this.reportMsg;
const pp = this.pdfPath;
if (pp !== null || pp !== undefined) {
const pos = pp.lastIndexOf("/");
const pdfName = pp.substr(pos + 1);
const rf = new FormData();
rf.append("orderId", rpm.orderId);
rf.append("reportName", pdfName);
rf.append("reportPath", pp);
addReportMsg(rf).then((res) => {
// console.log(res);
if (res.code === 200) {
this.$message({
type: "success",
message: "订单处理成功",
});
updateOrderMsg({
id: rpm.orderId,
auditId: rpm.userId,
auditName: localStorage.userName,
});
disOrderStatus(rpm.orderId);
this.$router.push({ name: "待处理的检验订单" });
}
});
}
},
//
reExamine() {
const os = 8;
this.updateOrder(os);
this.$router.push({ name: "待处理的检验订单" });
},
//
updateOrder(orderStatus) {
const rpm = this.reportMsg;
const up = new FormData();
up.append("orderId", rpm.orderId);
up.append("orderStatus", orderStatus);
up.append("userId", rpm.userId);
updateOrderStage(up);
},
pickValue() {
cu.handleClick();
},
},
computed: {
formatDateStr: function () {
let inputTime = this.rpDataMsg.date;
if (!inputTime) {
//&& typeof inputTime !== 'number'){
return "";
}
var localTime = "";
inputTime = new Date(inputTime).getTime();
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
},
};
</script>
<style scoped lang="less">
.rpHeader {
height: 1000px;
margin-bottom: 10px;
}
.rphLeft {
width: calc(50% - 5px);
height: 100%;
float: left;
margin-right: 5px;
}
.rphRight {
width: 50%;
height: 100%;
float: left;
background-color: white;
}
.pdfContent {
background-color: #343537;
height: calc(100% - 60px);
margin: 10px;
border: 1px solid #343537;
.pdfPage {
width: 100%;
height: 100%;
}
}
.rpShow {
padding-top: 20px;
background-color: white;
width: 100%;
height: 650px;
.earth {
width: 98%;
height: 400px;
background-color: darkblue;
margin-left: 1%;
margin-bottom: 10px;
}
}
.rpBottom {
position: relative;
display: block;
margin-top: 20px;
text-align: center;
}
/deep/.rpBottom {
.el-button--primary {
width: 170px;
height: 35px;
margin-bottom: 20px;
background-color: #354595;
margin-left: 10px;
border-color: #354595;
}
}
.box1 {
height: 40px;
line-height: 40px;
border-bottom: 1px solid rgb(205, 205, 205, 0.5);
}
.sp1 {
display: inline-block;
width: 7px;
height: 26px;
background-color: #354595;
vertical-align: top;
margin-left: 20px;
margin-top: 8px;
}
.sp2 {
margin-left: 10px;
font-size: 20px;
font-weight: 700;
color: #354595;
vertical-align: top;
}
.cstop {
margin-top: 20px;
margin-bottom: 0;
position: relative;
text-align: center;
}
.ysjMsg {
width: 18%;
}
.ysjMsgMrg {
margin-left: 14px;
}
.ysjMsg2 {
width: 20%;
}
/deep/.cstop .el-input.is-disabled .el-input__inner {
width: 140px;
height: 33px;
}
/deep/.cstop .el-form--inline .el-form-item__label {
text-align: justify;
// text-align-last: justify;
font-size: 15px;
}
/deep/.cstop .el-radio {
margin-right: 10px;
}
/deep/.cstop .el-radio__inner::after {
background-color: #354595;
}
/deep/.cstop .el-radio__input.is-checked .el-radio__inner {
border-color: #354595;
background: white;
}
/deep/.cstop .el-radio__input.is-disabled .el-radio__inner {
border-color: #354595;
}
/deep/.cstop .el-radio__input.is-disabled.is-checked .el-radio__inner::after {
background-color: #354595;
}
/deep/.cstop .el-radio__input.is-checked + .el-radio__label {
color: #606266;
}
/deep/.cstop .el-radio__inner {
border: 2px solid #354595;
}
// /deep/.el-input.is-disabled .el-input__inner {
// width: 120px;
// }
// /deep/.el-form--inline .el-form-item__label {
// // width: 90px;
// text-align: justify;
// // text-align-last: justify;
// font-size: 14px;
// margin-left: 15px;
// padding: 0 5px 0 0;
// }
/deep/.el-tabs__item:hover {
color: black;
}
/deep/.el-tabs--card > .el-tabs__header .el-tabs__item.is-active {
color: white;
background-color: #409eff;
border-color: #409eff;
}
/deep/.el-tabs__nav-scroll {
text-align: center;
margin-bottom: 10px;
// display: block;
}
/deep/.el-tabs--card > .el-tabs__header .el-tabs__nav {
display: block;
left: 41.5%;
// transform: translateX(-50%);
// margin: 0 auto;
// text-align: center;
position: relative;
}
/deep/.el-tabs--card > .el-tabs__header {
border-bottom: 0;
// border-bottom: 1px solid #E4E7ED;
}
/deep/.el-tabs--card > .el-tabs__header .el-tabs__nav {
border-bottom: 1px solid #e4e7ed;
}
</style>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,963 @@
<template>
<div>
<div>
<transition name="Fade" mode="out-in">
<router-view></router-view>
</transition>
</div>
<div class="page" v-show="pageshow">
<div class="daichuli">
<div class="box1">
<span class="sp1"></span><span class="sp2">订单信息</span>
</div>
<el-table
:data="orderData"
:header-cell-style="{ background: '#E4E9F1' }"
:cell-style="tableRowClassName"
style="width: 98%; margin-left: 1%; margin-top: 15px"
:default-sort="{ prop: 'date', order: 'descending' }"
>
<el-table-column
prop="orderCode"
label="订单编号"
width="180"
align="center"
>
</el-table-column>
<el-table-column
prop="orderSource"
label="订单来源"
width="180"
align="center"
>
<template slot-scope="scope">
{{ scope.row.orderSource | orderSourceFilter }}
</template>
</el-table-column>
<el-table-column prop="uploadDate" label="提交时间" align="center">
<template slot-scope="scope">
{{ scope.row.uploadDate | formatDate }}
</template>
</el-table-column>
<el-table-column prop="fileName" label="文件名" align="center">
</el-table-column>
<el-table-column
prop="fileSize"
label="文件大小"
sortable
align="center"
>
<template slot-scope="scope">
{{ scope.row.fileSize | transformByte }}
</template>
</el-table-column>
<el-table-column
prop="fileFormat"
label="文件格式"
sortable
align="center"
>
</el-table-column>
<el-table-column label="元数据" align="center">
<el-button type="primary" @click="changePage"></el-button>
</el-table-column>
</el-table>
</div>
<div class="daichuli2" v-show="isShow">
<div class="box1">
<span class="sp1"></span><span class="sp2">元数据查看</span>
</div>
<div class="cstop">
<el-form
:inline="true"
:model="formInline"
class="demo-form-inline"
:disabled="true"
>
<el-form-item label="卫星" class="ysjMsg">
<el-input
class="ysjMsgMrg"
v-model="formInline.satellite"
placeholder="卫星名称"
></el-input>
</el-form-item>
<el-form-item label="载荷名称" class="ysjMsg">
<el-input
v-model="formInline.load"
placeholder="载荷方式"
></el-input>
</el-form-item>
<el-form-item label="空间分辨率" class="ysjMsg2">
<el-input
v-model="formInline.resRatio"
placeholder="空间分辨率"
></el-input>
</el-form-item>
<el-form-item label="时间" class="ysjMsg" prop="producedDate">
<el-input
class="ysjMsgMrg"
v-model="formatDateStr"
placeholder="生产时间"
></el-input>
</el-form-item>
<el-form-item label="级别" prop="resource" class="ysjMsg2">
<el-radio-group v-model="formInline.proLevel">
<el-radio label="3"></el-radio>
<el-radio label="4"></el-radio>
<el-radio label="5"></el-radio>
<!-- <el-radio label="其他"></el-radio> -->
</el-radio-group> </el-form-item
><br />
<el-form-item label="坐标系统" class="ysjMsg">
<el-input
v-model="formInline.coordinateSys"
placeholder="坐标系统"
></el-input>
</el-form-item>
<el-form-item label="最小纬度" class="ysjMsg">
<el-input
v-model="formInline.minLat"
placeholder="最小纬度"
></el-input>
</el-form-item>
<el-form-item label="最大纬度" class="ysjMsg2">
<el-input
style="margin-left: 6px"
v-model="formInline.maxLat"
placeholder="最大纬度"
></el-input>
</el-form-item>
<el-form-item label="最小经度" class="ysjMsg">
<el-input
v-model="formInline.minLon"
placeholder="最小经度"
></el-input>
</el-form-item>
<el-form-item label="最大经度" class="ysjMsg2">
<el-input
v-model="formInline.maxLon"
placeholder="最大经度"
></el-input>
</el-form-item>
</el-form>
</div>
</div>
<div class="daichuli1">
<div class="box1">
<span class="sp1"></span><span class="sp2">待检验产品预览</span
><el-button type="primary" size="small" @click="downLoadPro"
>下载</el-button
>
</div>
<product-info
@removeLayer="removeLayer"
@addLayer="addLayer"
@removeSample="removeSplData"
@addSample="getSplData"
></product-info>
<div class="preview">
<div
id="PendPreview"
@click="pickValue"
style="overflow: hidden; position: relative"
></div>
<!-- <div v-if="shadeIsShow" class="shade" @click="enterPreview">
<svg aria-hidden="true" width="22" height="22" focusable="false" data-prefix="fas" data-icon="hand-pointer" class="svg-inline--fa fa-hand-pointer fa-w-14 fa-lg " role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<path fill="currentColor" d="M448 240v96c0 3.084-.356 6.159-1.063 9.162l-32 136C410.686 499.23 394.562 512 376 512H168a40.004 40.004 0 0 1-32.35-16.473l-127.997-176c-12.993-17.866-9.043-42.883 8.822-55.876 17.867-12.994 42.884-9.043 55.877 8.823L104 315.992V40c0-22.091 17.908-40 40-40s40 17.909 40 40v200h8v-40c0-22.091 17.908-40 40-40s40 17.909 40 40v40h8v-24c0-22.091 17.908-40 40-40s40 17.909 40 40v24h8c0-22.091 17.908-40 40-40s40 17.909 40 40zm-256 80h-8v96h8v-96zm88 0h-8v96h8v-96zm88 0h-8v96h8v-96z"></path>
</svg>
点击进入
</div> -->
</div>
</div>
<div class="daichuli1" v-if="groudClassShow">
<div class="box1">
<span class="sp1"></span
><span class="sp2">{{
orderMsg.product_subclass_id == 6
? "地表覆盖类型表"
: "植被物候类型表"
}}</span>
</div>
<el-table
:data="groudClassData"
:header-cell-style="{ background: '#E4E9F1' }"
:cell-style="tableRowClassName"
style="width: 98%; margin-left: 1%; margin-top: 15px"
height="200"
>
<el-table-column label="序号" align="center" type="index" width="100">
</el-table-column>
<el-table-column
prop="typeName"
label="地物类型名称"
align="center"
></el-table-column>
<el-table-column
prop="typeId"
label="像素实际值"
align="center"
></el-table-column>
</el-table>
</div>
<div class="dealGrp">
<el-button type="primary" @click="inspection"></el-button>
<el-button type="primary" @click="dialogFormVisible = true"
>无法处理</el-button
>
<el-button type="primary" @click="todaichuli"></el-button>
</div>
<!-- 无法处理弹窗 -->
<div class="unableDeal">
<el-dialog title="" :visible.sync="dialogFormVisible" width="35%">
<div class="box1">
<span class="sp1"></span><span class="sp2">反馈信息</span>
</div>
<el-form
:inline="true"
:model="unDeal"
class="demo-form-inline"
ref="feedbackForm"
label-width="100px"
>
<el-form-item label="反馈结果">
<el-radio-group v-model="unDeal.udMsg">
<el-radio label="无法处理"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label="原因"
prop="udReason"
:rules="[{ message: ' ', required: true }]"
>
<el-select v-model="unDeal.udReason" placeholder="选择原因">
<el-option
v-for="item in udrOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="图片上传">
<div class="tupian">
<el-upload
class="upload-demo"
action="/"
accept=".jpg,.jpeg,.png"
:before-upload="beforeUpload"
:http-request="uploadImgFile"
:on-remove="removeUploadFile"
list-type="picture"
>
<el-button size="small" type="white"
><i class="el-icon-upload"></i>上传图片</el-button
>
</el-upload>
</div>
</el-form-item>
<div class="beizhu">
<el-form-item label="备注">
<el-input
type="textarea"
v-model="unDeal.remark"
style="margin-left: -40px"
></el-input>
</el-form-item>
</div>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="subFeedback"></el-button>
<el-button type="primary" @click="dialogFormVisible = false"
> </el-button
>
</div>
</el-dialog>
</div>
</div>
</div>
</template>
<script>
import cu from "@/lib/cesiumUtils";
import {
getProductMsg,
getProductMetaMsg,
getCoverTypes,
orderFeedback,
updateOrderMsg,
disOrderStatus,
updateOrderStage,
getOrderSamples,
downloadPdf,
} from "@/api/pendingOrder";
import qs from "qs";
import ProductInfo from "../../../components/productInfo/index";
export default {
components: {
ProductInfo,
},
mounted() {
cu.initCesium("PendPreview");
cu.handleClick();
},
created() {
if (
Object.keys(this.$route.params).length > 0 &&
sessionStorage.getItem("prePage") === this.configration.path.daichuli
) {
this.queryParams = this.$route.params;
} else {
this.queryParams = JSON.parse(
localStorage.getItem(this.configration.path.daichuli)
);
}
document.body.scrollTop = 0;
this.initOrderMsg();
this.getSplData();
},
filters: {
orderSourceFilter(orderSource) {
const orderSourceMap = {
0: "用户上传",
1: "历史上传",
2: "平台共享",
};
return orderSourceMap[orderSource];
},
transformByte(size) {
if (!size) {
return "0B";
}
var num = 1024.0;
if (size < num) {
return size + "B";
}
if (size < Math.pow(num, 2)) {
return (size / num).toFixed(2) + "K";
}
if (size < Math.pow(num, 3)) {
return (size / Math.pow(num, 2)).toFixed(2) + "M";
}
if (size < Math.pow(num, 4)) {
return (size / Math.pow(num, 3)).toFixed(2) + "G";
}
return (size / Math.pow(num, 4)).toFixed(2) + "T"; // T
},
formatDate(inputTime) {
if (!inputTime && typeof inputTime !== "number") {
return "";
}
var localTime = "";
inputTime = new Date(inputTime);
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
},
data() {
return {
queryParams: null,
orderMsg: "",
userId: null,
productMsg: "",
pageshow: true,
isShow: false,
formInline: {
satellite: "", //
load: "", //
resRatio: "0.000307", //
producedDate: "",
proLevel: "4", //
coordinateSys: "WGS84", //
minLat: "116.13622332", //
maxLat: "118.342222", //
minLon: "34.211234", //
maxLon: "35.3455666", //
centerLon: "",
centerLat: "",
},
orderData: [
{
orderCode: "219088784675",
orderSource: "本地上传",
uploadDate: "2021-05-24",
fileName: "XXXXX产品.zip",
fileSize: "1.0GB",
fileFormat: "geotiff",
},
],
tifPath: "",
unDeal: {
udMsg: "无法处理",
udReason: "",
remark: "",
},
udrOptions: [
{
value: "待检验产品格式不支持",
label: "待检验产品格式不支持",
},
{
value: "缺少地面实测数据",
label: "缺少地面实测数据",
},
{
value: "添加样本分布不均匀",
label: "添加样本分布不均匀",
},
{
value: "实测数据样本数量不满足要求",
label: "实测数据样本数量不满足要求",
},
{
value: "其他",
label: "其他",
},
],
feedbackImg: null,
imgLocalUrl: null,
imgFileList: [],
dialogTableVisible: false,
dialogFormVisible: false,
groudClassShow: false,
groudClassData: [
{
groClaName: "林地",
pixelNum: "10",
},
{
groClaName: "草地",
pixelNum: "02",
},
],
workSpace: null,
layerName: null,
shadeIsShow: true,
tempPos: null,
};
},
computed: {
formatDateStr: function () {
let inputTime = this.formInline.producedDate;
if (!inputTime) {
//&& typeof inputTime !== 'number'){
return "";
}
var localTime = "";
inputTime = new Date(inputTime).getTime();
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
},
methods: {
enterPreview() {
// cu.initCesium("PendPreview");
// this.initOrderMsg();
const res = this.tempPos;
cu.flyToLayerRect(
res.boundBoxMinX,
res.boundBoxMinY,
res.boundingBoxMaxX,
res.boundBoxMaxY
);
this.getSplData();
this.shadeIsShow = false;
},
initOrderMsg() {
const self = this;
const om = (self.orderMsg = this.queryParams);
// console.log("11111111", om);
this.userId = Number(localStorage.userId);
const orderId = self.orderMsg.id,
pdType = self.orderMsg.product_subclass_id,
pdUId = self.orderMsg.product_upload_id;
getProductMsg(qs.stringify({ productId: pdUId })).then((res) => {
// console.log(res[0])
if (res || res.length !== 0) {
const r = res[0];
this.tifPath = r.tifPath;
sessionStorage.setItem("tifPath", r.tifPath);
self.productMsg = r;
self.orderData = [];
self.orderData.push({
orderCode: om.order_code,
orderSource: om.order_resource,
uploadDate: om.create_date,
fileName: r.fileName,
fileSize: r.fileSize,
fileFormat: r.fileFormat,
});
getProductMetaMsg(qs.stringify({ dataPath: r.tifPath })).then(
(res) => {
if (res !== null) {
self.formInline = {
satellite: om.satellite_name,
load: om.satellite_load_name,
resRatio:
res.imageResolution > 0.01
? res.imageResolution
: (res.imageResolution * 111194.926).toFixed(2) + "米",
coordinateSys: res.coordinateSystem,
minLat: res.boundBoxMinY.toFixed(8),
maxLat: res.boundBoxMaxY.toFixed(8),
minLon: res.boundBoxMinX.toFixed(8),
maxLon: res.boundingBoxMaxX.toFixed(8),
centerLon: res.centerPosition.x,
centerLat: res.centerPosition.y,
producedDate: r.productDate,
proLevel: r.productLevel + "",
};
//cu.flyToLayer(res.centerPosition.x,res.centerPosition.y)
// this.tempPos = res;
cu.flyToLayerRect(
res.boundBoxMinX,
res.boundBoxMinY,
res.boundingBoxMaxX,
res.boundBoxMaxY
);
}
}
);
const geoWS = r.geoWorkspace;
const geoLN = r.layerName;
this.workSpace = geoWS;
this.layerName = geoLN;
cu.addlayer(geoWS, geoLN);
}
});
if (pdType === 6 || pdType === 12) {
self.groudClassShow = true;
getCoverTypes(orderId).then((res) => {
if (res.msg === "操作成功") {
self.groudClassData = res.data;
}
});
}
},
inspection() {
// this.pageshow=false
let param = {
userId: this.userId,
orderMsg: this.orderMsg,
productMsg: this.productMsg,
orderData: this.orderData,
metaMsg: this.formInline,
};
localStorage.setItem(
this.configration.path.orderUnprocessed,
JSON.stringify(param)
);
this.$router.push({ name: "检验处理", params: param });
},
changePage() {
this.isShow = !this.isShow;
},
todaichuli() {
this.$router.push(this.configration.path.daichuli);
},
backpage() {
this.$router.go(-1);
this.bus.$emit("aaaa", true);
},
tableRowClassName({ rowIndex }) {
if ((rowIndex + 1) % 2 !== 0) {
return "background:#F5F7FA";
} else {
return "background:#FFFFFF";
}
},
uploadImgFile(option) {
this.feedbackImg = option.file;
},
beforeUpload(file) {
if (this.imgFileList.length > 0) {
this.$message({
message: "只能保存一张图片,请删除后再次上传!",
type: "warning",
});
return false;
}
this.imgFileList.push(file);
this.imgLocalUrl = window.URL.createObjectURL(file);
},
removeUploadFile(file) {
this.imgFileList.pop(file);
},
//
subFeedback() {
this.$refs["feedbackForm"].validate((valid) => {
if (valid) {
const fb = new FormData();
fb.append("orderId", this.orderMsg.id);
fb.append("userId", this.userId);
fb.append("feedbackResult", this.unDeal.udMsg);
fb.append("feedbackReason", this.unDeal.udReason);
fb.append("feedbackContext", this.unDeal.remark);
fb.append("imgFile", this.feedbackImg);
orderFeedback(fb).then((res) => {
if (res.code === 200 || res.message === "反馈成功") {
this.$message({
type: "success",
message: "反馈成功",
});
this.imgLocalUrl = null;
this.dialogFormVisible = false;
updateOrderMsg({
id: this.orderMsg.id,
auditId: this.userId,
auditName: localStorage.userName,
});
disOrderStatus(this.orderMsg.id);
const up = new FormData();
up.append("orderId", this.orderMsg.id);
up.append("orderStatus", 3);
up.append("userId", this.orderMsg.user_id);
updateOrderStage(up).then((res) => {
if (res.code === 200)
this.$router.push({ name: "待处理的检验订单" });
});
}
});
} else {
this.$message({
message: "无法处理的原因不能为空值!",
type: "error",
});
}
});
},
//
getSplData() {
getOrderSamples(this.orderMsg.id, this.orderMsg.product_subclass_id).then(
(res) => {
if (res.code == 200) {
const sp = res.data;
if (sp.length === 0) {
this.$message({
type: "warning",
message: "没有样本数据",
});
} else {
cu.removePoint();
for (let i in sp) {
cu.addPoint(sp[i].lon, sp[i].lat, sp[i].alt);
}
}
}
}
);
},
//
downLoadPro() {
// console.log(this.productMsg);
const zipPath = this.productMsg.filePath;
if (zipPath !== null || zipPath !== undefined) {
const pdfName = zipPath.substr(zipPath.lastIndexOf("/") + 1); //
if ("download" in document.createElement("a")) {
const elink = document.createElement("a");
elink.download = pdfName;
elink.style.display = "none";
elink.href = zipPath;
document.body.appendChild(elink);
elink.click();
document.body.removeChild(elink);
} else {
location.href = zipPath;
}
// downloadPdf(zipPath).then((res) => {
// // console.log(res);
// if (res.size > 0) {
// const content = res;
// const blob = new Blob([content]);
// const fileName = pdfName;
// if ("download" in document.createElement("a")) {
// // IE
// const elink = document.createElement("a");
// elink.download = fileName;
// elink.style.display = "none";
// elink.href = URL.createObjectURL(blob);
// document.body.appendChild(elink);
// elink.click();
// URL.revokeObjectURL(elink.href); // URL
// document.body.removeChild(elink);
// } else {
// // IE10+
// navigator.msSaveBlob(blob, fileName);
// }
// }
// });
}
},
pickValue() {
cu.handleClick();
},
addLayer() {
cu.addlayer(this.workSpace, this.layerName);
},
removeLayer() {
cu.clearLayers();
},
removeSplData() {
cu.removePoint();
},
},
};
</script>
<style scoped lang="less">
.Fade-enter,
.Fade-leave-to {
opacity: 0;
}
.Fade-enter-to,
.Fade-leave {
opacity: 1;
}
.Fade-enter-active,
.Fade-leave-active {
transition: all 0.4s;
}
.daichuli {
width: 100%;
background-color: white;
font-size: 20px;
padding-bottom: 10px;
}
.daichuli1 {
width: 100%;
background-color: white;
font-size: 20px;
margin-top: 20px;
padding-bottom: 15px;
}
.daichuli2 {
width: 100%;
background-color: white;
font-size: 20px;
margin-top: 20px;
}
.sp1 {
display: inline-block;
width: 7px;
height: 26px;
background-color: #354595;
position: relative;
left: 20px;
top: 6px;
}
.sp2 {
margin-left: 30px;
font-size: 20px;
font-weight: 700;
color: #354595;
}
.box1 {
height: 40px;
line-height: 40px;
border-bottom: 1px solid rgb(205, 205, 205, 0.5);
}
/deep/.daichuli .el-button--primary {
color: #fff;
background-color: #409eff;
border-color: #409eff;
width: 100px;
height: 30px;
}
/deep/.daichuli .el-button--primary:focus {
background-color: #354595;
border-color: #354595;
}
/deep/ .daichuli1 .el-button--primary {
color: #fff;
background-color: #409eff;
border-color: #409eff;
width: 100px;
height: 30px;
margin-left: 30px;
position: relative;
top: -3px;
}
#PendPreview {
width: 98%;
height: 600px;
background-color: #354595;
margin-left: 1%;
margin-top: -60px;
}
.dealGrp {
// margin-top: 20px;
text-align: center;
width: 100%;
background-color: white;
}
/deep/.dealGrp .el-button--primary {
width: 170px;
height: 35px;
margin-bottom: 20px;
background-color: #354595;
margin-left: 10px;
border-color: #354595;
}
/deep/.daichuli1 .el-button--primary:hover {
background-color: #354595;
}
/deep/.daichuli1 .el-button--primary:focus {
background-color: #6979cc;
border-color: #6979cc;
}
.cstop {
margin-top: 20px;
margin-bottom: 0;
position: relative;
text-align: center;
}
.ysjMsg {
width: 18%;
}
.ysjMsgMrg {
margin-left: 14px;
}
.ysjMsg2 {
width: 20%;
}
/deep/.cstop .el-input.is-disabled .el-input__inner {
width: 140px;
height: 33px;
}
/deep/.cstop .el-form--inline .el-form-item__label {
text-align: justify;
// text-align-last: justify;
font-size: 15px;
}
/deep/.cstop .el-radio {
margin-right: 10px;
}
/deep/.cstop .el-radio__inner::after {
background-color: #354595;
}
/deep/.cstop .el-radio__input.is-checked .el-radio__inner {
border-color: #354595;
background: white;
}
/deep/.cstop .el-radio__input.is-disabled .el-radio__inner {
border-color: #354595;
}
/deep/.cstop .el-radio__input.is-disabled.is-checked .el-radio__inner::after {
background-color: #354595;
}
/deep/.cstop .el-radio__input.is-checked + .el-radio__label {
color: #606266;
}
/deep/.cstop .el-radio__inner {
border: 2px solid #354595;
}
.unableDeal .box1 {
width: 100%;
position: absolute;
left: 0;
top: 10px;
z-index: 9999;
}
/deep/.unableDeal .el-radio {
padding: 0 30px 0 20px;
}
/deep/.unableDeal .el-select .el-input {
width: 180px;
}
/deep/.unableDeal .el-upload-dragger .el-icon-upload {
font-size: 20px;
color: black;
}
.upload-demo {
display: inline-block;
}
.el-upload-dragger {
margin-left: 0px;
}
/deep/.unableDeal .el-upload-dragger .el-icon-upload {
margin: 0;
line-height: 30px;
}
/deep/.unableDeal .el-form-item {
margin-bottom: 0;
}
/deep/.unableDeal .el-input__inner {
height: 35px;
}
/deep/.unableDeal .el-upload-dragger {
width: 150px;
height: 35px;
margin-left: 27px;
margin-top: 20px;
border: 1px solid #d9d9d9;
}
/deep/.unableDeal .el-textarea__inner {
margin-left: 40px;
margin-top: 20px;
}
.sp3 {
position: relative;
top: -13px;
}
// /deep/.el-textarea__inner{
// margin-left: 70px;
// margin-top: 20px;
// }
/deep/.beizhu .el-form-item__label {
margin-top: 20px;
}
/deep/.dialog-footer {
text-align: center;
}
/deep/.dialog-footer .el-button--primary {
width: 150px;
height: 35px;
background-color: #354595;
border-color: #354595;
}
/deep/.el-button {
line-height: 0;
}
.imgPreview {
width: 178px;
height: 178px;
display: block;
}
.preview {
width: 98%;
height: 600px;
margin-left: 1%;
margin-top: -60px;
position: relative;
}
.shade {
position: absolute;
left: 0px;
top: 0px;
width: 98%;
height: 600px;
appearance: none;
background-color: rgba(14, 20, 34, 0.3);
cursor: pointer;
margin-left: 1%;
line-height: 600px;
text-align: center;
color: white;
z-index: 1000;
}
</style>

View File

@ -0,0 +1,332 @@
<template>
<div>
<transition name="Fade" mode="in-out">
<router-view></router-view>
</transition>
<div>
<div class="daichuli">
<div class="box1">
<span class="sp1"></span><span class="sp2">订单查询</span>
</div>
<OrderSearch
:getOrderList="getOrderList"
ref="orderSearchPanel"
@initPage="initPage"
></OrderSearch>
</div>
<div class="daichuli1">
<div class="box1">
<span class="sp1"></span><span class="sp2">查询结果</span>
</div>
<el-table
:header-cell-style="{ background: '#E4E9F1' }"
:cell-style="tableRowClassName"
:data="pendingData"
style="width: 98%; margin-left: 1%; margin-top: 15px"
>
<el-table-column
prop="orderCode"
label="订单编号"
width="180"
align="center"
>
<template slot-scope="scope">
{{ scope.row.order_code }}
</template>
</el-table-column>
<el-table-column
prop="uploadDate"
label="提交日期"
width="180"
align="center"
>
<template slot-scope="scope">
{{ scope.row.create_date | formatDate }}
</template>
</el-table-column>
<el-table-column prop="satelliteType" label="卫星类型" align="center">
<template slot-scope="scope">
{{ scope.row.satellite_name }}
</template>
</el-table-column>
<el-table-column prop="load" label="载荷名称" align="center">
<template slot-scope="scope">
{{ scope.row.satellite_load_name }}
</template>
</el-table-column>
<el-table-column prop="category" label="产品大类" align="center">
<template slot-scope="scope">
{{ scope.row.product_id | categoryFilter }}
</template>
</el-table-column>
<el-table-column prop="cldCategory" label="产品小类" align="center">
<template slot-scope="scope">
{{ scope.row.product_subclass_id | cldCategoryFilter }}
</template>
</el-table-column>
<!-- <el-table-column
prop="checkoutFun"
label="检验类型"
align="center"
>
直接检验
</el-table-column> -->
<el-table-column prop="user_id" label="订单创建者" align="center">
<template slot-scope="scope">
{{ scope.row.userName }}
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button
type="primary"
icon="el-icon-search"
@click="changePage(scope.row)"
>订单处理</el-button
>
</template>
</el-table-column>
</el-table>
<div class="block">
<Pagination
:page-sizes="[6, 12, 18]"
:total="pageForm.total"
:page.sync="pageForm.page"
:limit.sync="pageForm.limit"
@pagination="getOrderList"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import OrderSearch from "@/components/orderSearch";
import Pagination from "@/components/Pagination";
import { getOrderListByStatus } from "@/api/common";
import { updateOrderStatus } from "@/api/pendingOrder";
export default {
components: { Pagination, OrderSearch },
filters: {
categoryFilter(category) {
const categoryMap = {
1: "几何产品",
2: "辐射产品",
3: "陆表产品",
4: "植被产品",
};
return categoryMap[category];
},
cldCategoryFilter(cldCategory) {
const cldCategoryMap = {
1: "正射校正",
2: "高程产品",
5: "干涉测量形变产品",
3: "后向散射系数",
4: "大气延迟校正",
9: "地表粗糙度",
6: "地表覆盖类型",
7: "土壤水分",
8: "地表盐碱度",
10: "植被高度",
11: "叶面积指数",
12: "植被物候",
};
return cldCategoryMap[cldCategory];
},
formatDate(inputTime) {
if (!inputTime && typeof inputTime !== "number") {
return "";
}
var localTime = "";
inputTime = new Date(inputTime);
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
userIdFilter(userId) {
const userIdMap = {
1: "默认",
2: "测试员",
3: "陈鹏",
4: "卢慧龙",
5: "郜琪",
};
return userIdMap[userId];
},
},
data() {
return {
pendingData: [],
pageForm: {
total: 0,
page: 1,
limit: 6,
},
};
},
mounted() {
this.getOrderList();
},
methods: {
getOrderList() {
const searchVal = this.$refs.orderSearchPanel;
const sf = searchVal.searchForm;
sf.page = this.pageForm.page;
sf.limit = this.pageForm.limit;
sf.status = [8];
getOrderListByStatus(sf).then((res) => {
// console.log(res);
if (res.code === 200) {
this.pendingData = res.data.dataList;
this.pageForm.total = res.data.count;
}
});
},
initPage() {
this.pageForm.page = 1;
},
tableRowClassName({ rowIndex }) {
if ((rowIndex + 1) % 2 !== 0) {
return "background:#F5F7FA";
} else {
return "background:#FFFFFF";
}
},
changePage(orderMsg) {
// this.$router.push("/orderUnprocessed");
localStorage.setItem(
this.configration.path.daichuli,
JSON.stringify(orderMsg)
);
updateOrderStatus(orderMsg.id).then((res) => {
if (res?.code === 401) {
this.$message.warning(res.msg);
return false;
} else {
this.$router.push({ name: "订单反馈", params: orderMsg });
}
});
},
},
};
</script>
<style scoped lang="less">
.Fade-enter,
.Fade-leave-to {
opacity: 0;
}
.Fade-enter-to,
.Fade-leave {
opacity: 1;
}
.Fade-enter-active,
.Fade-leave-active {
transition: all 0.4s;
}
.daichuli {
width: 100%;
background-color: white;
font-size: 16px;
}
.daichuli1 {
width: 100%;
background-color: white;
font-size: 20px;
margin-top: 20px;
}
.sp1 {
display: inline-block;
width: 7px;
height: 26px;
background-color: #354595;
position: relative;
left: 20px;
top: 6px;
}
/deep/.el-icon-arrow-up:before {
content: "\e78f";
}
.sp2 {
margin-left: 30px;
font-size: 20px;
font-weight: 700;
color: #354595;
}
.box1 {
height: 40px;
line-height: 40px;
border-bottom: 1px solid rgb(205, 205, 205, 0.5);
}
/deep/.el-date-editor--datetimerange.el-input,
.el-date-editor--datetimerange.el-input__inner {
width: 270px;
height: 35px;
line-height: 30px;
}
/deep/.el-range-editor.el-input__inner {
padding: 1px 10px;
}
// /deep/.daichuli .el-select {
// width: 270px;
// }
// /deep/.daichuli .el-input__inner {
// height: 35px;
// line-height: 35px;
// }
.inp1 {
width: 270px;
height: 35px;
line-height: 35px;
}
// /deep/.daichuli .el-input__inner {
// width: 270px;
// height: 35px;
// line-height: 35px;
// }
.sp31 {
display: inline-block;
}
/deep/.daichuli .el-input {
width: 270px;
}
.box28 {
text-align: center;
}
/deep/.daichuli .el-button--primary {
width: 170px;
height: 35px;
// margin-top: 20px;
margin-bottom: 20px;
}
/deep/.el-button {
line-height: 0;
}
.block {
margin-top: 20px;
padding-bottom: 20px;
text-align: center;
}
/deep/.daichuli1 .el-button--primary {
color: #354595;
background-color: transparent;
border-color: transparent;
}
/deep/.daichuli1 .el-button--primary:hover {
background-color: #409eff;
color: #fff;
}
/deep/.el-input__icon {
line-height: 35px;
}
/deep/.el-table th > .cell {
font-size: 16px;
}
</style>

View File

@ -0,0 +1,594 @@
<template>
<div>
<div class="orderMsg">
<div class="title">
<span class="sp1"></span><span class="sp2">订单信息</span>
</div>
<el-table
:data="orderList"
:header-cell-style="{ background: '#E4E9F1' }"
:cell-style="tableRowClassName"
style="width: 98%; margin-left: 1%; margin-top: 15px"
:default-sort="{ prop: 'date', order: 'descending' }"
>
<el-table-column
prop="orderCode"
label="订单编号"
width="180"
align="center"
>
</el-table-column>
<el-table-column
prop="orderSource"
label="订单来源"
width="180"
align="center"
>
<template slot-scope="scope">
{{ scope.row.orderSource | orderSourceFilter }}
</template>
</el-table-column>
<el-table-column prop="uploadDate" label="提交时间" align="center">
<template slot-scope="scope">
{{ scope.row.uploadDate | formatDate }}
</template>
</el-table-column>
<el-table-column prop="fileName" label="文件名" align="center">
</el-table-column>
<el-table-column
prop="fileSize"
label="文件大小"
sortable
align="center"
>
<template slot-scope="scope">
{{ scope.row.fileSize | transformByte }}
</template>
</el-table-column>
<el-table-column
prop="fileFormat"
label="文件格式"
sortable
align="center"
>
</el-table-column>
<el-table-column label="元数据" align="center">
<el-button type="primary" @click="openMetaCode"></el-button>
</el-table-column>
</el-table>
</div>
<div class="metaMsg" v-show="metaShow">
<div class="title">
<span class="sp1"></span><span class="sp2">元数据信息</span>
</div>
<div class="cstop">
<el-form
:inline="true"
:model="metaFormMsg"
class="demo-form-inline"
:disabled="true"
>
<el-form-item label="卫星" class="ysjMsg">
<el-input
class="ysjMsgMrg"
v-model="metaFormMsg.satellite"
placeholder="卫星名称"
></el-input>
</el-form-item>
<el-form-item label="载荷" class="ysjMsg">
<el-input
class="ysjMsgMrg"
v-model="metaFormMsg.load"
placeholder="载荷方式"
></el-input>
</el-form-item>
<el-form-item label="空间分辨率" class="ysjMsg2">
<el-input
v-model="metaFormMsg.resRatio"
placeholder="空间分辨率"
></el-input>
</el-form-item>
<el-form-item label="时间" class="ysjMsg">
<el-input
class="ysjMsgMrg"
v-model="formatDateStr"
placeholder="生产时间"
></el-input>
</el-form-item>
<el-form-item label="级别" prop="resource" class="ysjMsg2">
<el-radio-group v-model="metaFormMsg.proLevel">
<el-radio label="3"></el-radio>
<el-radio label="4"></el-radio>
<el-radio label="5"></el-radio>
<!-- <el-radio label="其他"></el-radio> -->
</el-radio-group> </el-form-item
><br />
<el-form-item label="坐标系统" class="ysjMsg">
<el-input
v-model="metaFormMsg.coordinateSys"
placeholder="坐标系统"
></el-input>
</el-form-item>
<el-form-item label="最小纬度" class="ysjMsg">
<el-input
v-model="metaFormMsg.minLat"
placeholder="最小纬度"
></el-input>
</el-form-item>
<el-form-item label="最大纬度" class="ysjMsg2">
<el-input
style="margin-left: 6px"
v-model="metaFormMsg.maxLat"
placeholder="最大纬度"
></el-input>
</el-form-item>
<el-form-item label="最小经度" class="ysjMsg">
<el-input
v-model="metaFormMsg.minLon"
placeholder="最小经度"
></el-input>
</el-form-item>
<el-form-item label="最大经度" class="ysjMsg2">
<el-input
v-model="metaFormMsg.maxLon"
placeholder="最大经度"
></el-input>
</el-form-item>
</el-form>
</div>
</div>
<div class="showOrderMsg">
<div class="orderScene">
<div class="title">
<span class="sp1"></span><span class="sp2">待审核产品预览</span>
</div>
<div
id="auditPreview"
@click="pickValue"
style="overflow: hidden; position: relative"
></div>
</div>
<div class="orderPdf">
<div class="title">
<span class="sp1"></span><span class="sp2">检验报告</span>
</div>
<div class="pdfDom">
<iframe class="pdfPage" :src="pdfUrl" frameborder="0"></iframe>
</div>
</div>
</div>
<div class="orderAudit">
<div class="title">
<span class="sp1"></span><span class="sp2">审核信息</span>
</div>
<div class="radiogroup">
<el-radio-group v-model="auditVal">
<el-radio label="1">审核通过</el-radio>
<el-radio label="2">审核不通过</el-radio>
</el-radio-group>
</div>
<el-input
type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }"
placeholder="请输入内容"
v-model="auditText"
>
</el-input>
<div class="btngroup">
<el-button class="shbtn" type="primary" @click="cancleSubmit"
>取消</el-button
>
<el-button class="shbtn" type="primary" @click="submitAuditMsg"
>确定</el-button
>
</div>
</div>
</div>
</template>
<script>
import cu from "@/lib/cesiumUtils";
import {
getProductMsg,
getProductMetaMsg,
getOrderSamples,
updateOrderMsg,
disOrderStatus,
updateOrderStage,
getReportMsg,
} from "@/api/pendingOrder";
import { orderExamine } from "@/api/audit";
import qs from "qs";
export default {
filters: {
orderSourceFilter(orderSource) {
const orderSourceMap = {
0: "用户上传",
1: "历史上传",
2: "平台共享",
};
return orderSourceMap[orderSource];
},
transformByte(size) {
if (!size) {
return "0B";
}
var num = 1024.0;
if (size < num) {
return size + "B";
}
if (size < Math.pow(num, 2)) {
return (size / num).toFixed(2) + "K";
}
if (size < Math.pow(num, 3)) {
return (size / Math.pow(num, 2)).toFixed(2) + "M";
}
if (size < Math.pow(num, 4)) {
return (size / Math.pow(num, 3)).toFixed(2) + "G";
}
return (size / Math.pow(num, 4)).toFixed(2) + "T"; // T
},
formatDate(inputTime) {
if (!inputTime && typeof inputTime !== "number") {
return "";
}
var localTime = "";
inputTime = new Date(inputTime);
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
},
mounted() {
cu.initCesium("auditPreview");
cu.handleClick();
},
created() {
if (
Object.keys(this.$route.params).length > 0 &&
sessionStorage.getItem("prePage") === this.configration.path.daishenhe
) {
this.queryParams = this.$route.params;
} else {
this.queryParams = JSON.parse(
localStorage.getItem(this.configration.path.daishenhe)
);
}
console.log("111111", this.queryParams);
document.body.scrollTop = 0;
this.initOrderMsg();
const samplesList = this.queryParams.sample;
this.getSplData(samplesList);
},
data() {
return {
queryParams: null,
metaShow: false,
orderList: [],
metaFormMsg: {
satellite: "", //
load: "", //
resRatio: "0.000307", //
proLevel: "4", //
coordinateSys: "WGS84", //
minLat: "116.13622332", //
maxLat: "118.342222", //
minLon: "34.211234", //
maxLon: "35.3455666", //
},
pdfUrl: "static/data/download.pdf",
auditVal: "1",
auditText: "",
};
},
computed: {
formatDateStr: function () {
let inputTime = this.metaFormMsg.producedDate;
if (!inputTime) {
//&& typeof inputTime !== 'number'){
return "";
}
var localTime = "";
inputTime = new Date(inputTime).getTime();
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
},
methods: {
initOrderMsg() {
const self = this;
const om = this.queryParams;
const pdUId = om.product_upload_id;
getProductMsg(qs.stringify({ productId: pdUId })).then((res) => {
if (res || res.length !== 0) {
const r = res[0];
sessionStorage.setItem("tifPath", r.tifPath);
self.orderList = [];
self.orderList.push({
orderCode: om.order_code,
orderSource: om.order_resource,
uploadDate: om.create_date,
fileName: r.fileName,
fileSize: r.fileSize,
fileFormat: r.fileFormat,
});
getProductMetaMsg(qs.stringify({ dataPath: r.tifPath })).then(
(res) => {
if (res !== null) {
self.metaFormMsg = {
satellite: om.satellite_name,
load: om.satellite_load_name,
resRatio:
res.imageResolution > 0.01
? res.imageResolution
: (res.imageResolution * 111194.926).toFixed(2) + "米",
coordinateSys: res.coordinateSystem,
minLat: res.boundBoxMinY.toFixed(8),
maxLat: res.boundBoxMaxY.toFixed(8),
minLon: res.boundBoxMinX.toFixed(8),
maxLon: res.boundingBoxMaxX.toFixed(8),
producedDate: r.productDate,
proLevel: r.productLevel + "",
};
cu.flyToLayerRect(
res.boundBoxMinX,
res.boundBoxMinY,
res.boundingBoxMaxX,
res.boundBoxMaxY
);
}
}
);
const geoWS = r.geoWorkspace;
const geoLN = r.layerName;
cu.addlayer(geoWS, geoLN);
}
});
this.getNumPages(om.id);
},
getNumPages(orderId) {
getReportMsg(orderId).then((res) => {
console.log(res);
if (res.code === 200 && res.data.length !== 0) {
const rpMsg = res.data[0];
this.pdfUrl = rpMsg.validationReportDownload;
}
});
},
tableRowClassName({ rowIndex }) {
if ((rowIndex + 1) % 2 !== 0) {
return "background:#F5F7FA";
} else {
return "background:#FFFFFF";
}
},
openMetaCode() {
this.metaShow = !this.metaShow;
},
submitAuditMsg() {
const om = this.queryParams;
const oe = {
orderId: om.id,
userId: localStorage.userId,
exContext: this.auditText,
exResult: Number(this.auditVal),
};
let os = 6;
if (this.auditVal === "2") os = 7;
orderExamine(qs.stringify(oe)).then((res) => {
if (res.code === 200) {
this.$message({
type: "success",
message: "订单审核成功",
});
updateOrderMsg({
id: om.id,
inspectionId: localStorage.userId,
inspectionName: localStorage.userName,
});
disOrderStatus(om.id);
const up = new FormData();
up.append("orderId", om.id);
up.append("orderStatus", os);
up.append("userId", om.user_id);
updateOrderStage(up).then((res) => {
if (res.code === 200) this.$router.push({ name: "待审核检验订单" });
});
}
});
},
cancleSubmit() {
this.$router.push({ name: "待审核检验订单" });
},
//
getSplData(spl) {
const om = this.queryParams;
getOrderSamples(om.id, om.product_subclass_id).then((res) => {
if (res.code == 200) {
const sp = res.data;
if (sp.length === 0) {
this.$message({
type: "warning",
message: "没有样本数据",
});
} else {
let sp = JSON.parse(spl);
cu.removePoint();
for (let i in sp) {
cu.addPoint(sp[i].lon, sp[i].lat, sp[i].alt);
}
}
}
});
},
pickValue() {
cu.handleClick();
},
},
};
</script>
<style scoped lang="less">
.orderMsg {
width: 100%;
background-color: white;
font-size: 20px;
height: 180px;
padding-bottom: 20px;
}
.metaMsg {
width: 100%;
background-color: white;
font-size: 20px;
margin-top: 20px;
}
.showOrderMsg {
width: 100%;
// background-color: white;
font-size: 20px;
margin: 20px 0 20px 0;
height: 600px;
}
.title {
height: 40px;
line-height: 40px;
border-bottom: 1px solid rgb(205, 205, 205, 0.5);
}
.orderScene {
width: 50%;
height: inherit;
background-color: white;
float: left;
padding-bottom: 5px;
}
#auditPreview {
width: 98%;
height: calc(100% - 45px);
background-color: #354595;
margin-left: 1%;
margin-top: 2px;
}
.orderPdf {
width: calc(50% - 10px);
margin-left: 10px;
float: left;
background-color: white;
height: inherit;
padding-bottom: 5px;
}
.orderPdf {
width: calc(50% - 10px);
margin-left: 10px;
float: left;
background-color: white;
height: inherit;
padding-bottom: 5px;
.pdfDom {
height: 560px;
background-color: white;
.pdfPage {
width: 100%;
height: 100%;
}
}
}
.orderAudit {
background-color: white;
}
.radiogroup {
margin-top: 20px;
margin-left: 20px;
height: 50px;
}
.btngroup {
margin-top: 20px;
margin-bottom: 20px;
// margin-left: 40%;
text-align: center;
}
.shbtn {
width: 150px;
height: 35px;
background-color: #354595;
border: 0;
margin-bottom: 15px;
}
.sp1 {
display: inline-block;
width: 7px;
height: 26px;
background-color: #354595;
position: relative;
left: 20px;
top: 6px;
}
.sp2 {
margin-left: 30px;
font-size: 20px;
font-weight: 700;
color: #354595;
}
.cstop {
margin-top: 20px;
margin-bottom: 0;
position: relative;
text-align: center;
}
.ysjMsg {
width: 18%;
}
.ysjMsgMrg {
margin-left: 14px;
}
.ysjMsg2 {
width: 20%;
}
/deep/.cstop .el-input.is-disabled .el-input__inner {
width: 140px;
height: 33px;
}
/deep/.cstop .el-form--inline .el-form-item__label {
text-align: justify;
// text-align-last: justify;
font-size: 15px;
}
/deep/.cstop .el-radio {
margin-right: 10px;
}
/deep/.cstop .el-radio__inner::after {
background-color: #354595;
}
/deep/.cstop .el-radio__input.is-checked .el-radio__inner {
border-color: #354595;
background: white;
}
/deep/.cstop .el-radio__input.is-disabled .el-radio__inner {
border-color: #354595;
}
/deep/.cstop .el-radio__input.is-disabled.is-checked .el-radio__inner::after {
background-color: #354595;
}
/deep/.cstop .el-radio__input.is-checked + .el-radio__label {
color: #606266;
}
/deep/.cstop .el-radio__inner {
border: 2px solid #354595;
}
/deep/.el-button {
line-height: 0;
}
/deep/.el-textarea__inner {
margin-left: 20px;
width: 50%;
}
/deep/.el-textarea__inner:focus {
border-color: #354595;
}
</style>

View File

@ -0,0 +1,260 @@
<template>
<div>
<router-view></router-view>
<div>
<div class="daichuli">
<div class="box1">
<span class="sp1"></span><span class="sp2">订单查询</span>
</div>
<OrderSearch
:getOrderList="getOrderList"
ref="orderSearchPanel"
@initPage="initPage"
></OrderSearch>
</div>
<div class="daichuli1">
<div class="box1">
<span class="sp1"></span><span class="sp2">查询结果</span>
</div>
<el-table
:header-cell-style="{ background: '#E4E9F1' }"
:cell-style="tableRowClassName"
:data="auditData"
style="width: 98%; margin-left: 1%; margin-top: 15px"
>
<el-table-column
prop="order_code"
label="订单编号"
width="180"
align="center"
>
</el-table-column>
<el-table-column
prop="create_date"
label="提交日期"
width="180"
align="center"
>
<template slot-scope="scope">
{{ scope.row.create_date | formatDate }}
</template>
</el-table-column>
<el-table-column
prop="satellite_name"
label="卫星类型"
align="center"
>
</el-table-column>
<el-table-column
prop="satellite_load_name"
label="载荷"
align="center"
>
</el-table-column>
<el-table-column prop="product_id" label="产品大类" align="center">
<template slot-scope="scope">
{{ scope.row.product_id | categoryFilter }}
</template>
</el-table-column>
<el-table-column
prop="product_subclass_id"
label="产品小类"
align="center"
>
<template slot-scope="scope">
{{ scope.row.product_subclass_id | cldCategoryFilter }}
</template>
</el-table-column>
<el-table-column
prop="validation_method_desc"
label="检验类型"
align="center"
>
</el-table-column>
<el-table-column prop="userName" label="创建人员" align="center">
</el-table-column>
<el-table-column prop="auditName" label="检验人员" align="center">
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button
type="primary"
icon="el-icon-search"
@click="openAudit(scope.row)"
>订单审核</el-button
>
</template>
</el-table-column>
</el-table>
<div class="block">
<Pagination
:page-sizes="[6, 12, 18]"
:total="pageForm.total"
:page.sync="pageForm.page"
:limit.sync="pageForm.limit"
@pagination="getOrderList"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import OrderSearch from "@/components/orderSearch";
import Pagination from "@/components/Pagination";
import { getOrderListByStatus } from "@/api/common";
export default {
components: {
OrderSearch,
Pagination,
},
filters: {
categoryFilter(category) {
const categoryMap = {
1: "几何产品",
2: "辐射产品",
3: "陆表产品",
4: "植被产品",
};
return categoryMap[category];
},
cldCategoryFilter(cldCategory) {
const cldCategoryMap = {
1: "正射校正",
2: "高程产品",
5: "干涉测量形变产品",
3: "后向散射系数",
4: "大气延迟校正",
9: "地表粗糙度",
6: "地表覆盖类型",
7: "土壤水分",
8: "地表盐碱度",
10: "植被高度",
11: "叶面积指数",
12: "植被物候",
};
return cldCategoryMap[cldCategory];
},
formatDate(inputTime) {
if (!inputTime && typeof inputTime !== "number") {
return "";
}
var localTime = "";
inputTime = new Date(inputTime);
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
},
data() {
return {
auditData: [],
pageForm: {
total: 0,
page: 1,
limit: 6,
},
};
},
mounted() {
this.getOrderList();
},
methods: {
tableRowClassName({ rowIndex }) {
if ((rowIndex + 1) % 2 !== 0) {
return "background:#F5F7FA";
} else {
return "background:#FFFFFF";
}
},
openAudit(orderMsg) {
localStorage.setItem(
this.configration.path.daishenhe,
JSON.stringify(orderMsg)
);
this.$router.push({ name: "订单审核", params: orderMsg });
},
getOrderList() {
const searchVal = this.$refs.orderSearchPanel;
const sf = searchVal.searchForm;
sf.page = this.pageForm.page;
sf.limit = this.pageForm.limit;
sf.status = [2];
getOrderListByStatus(sf).then((res) => {
if (res.code === 200) {
this.auditData = res.data.dataList;
this.pageForm.total = res.data.count;
}
});
},
initPage() {
this.pageForm.page = 1;
},
},
};
</script>
<style scoped lang="less">
.daichuli {
width: 100%;
background-color: white;
font-size: 20px;
}
.daichuli1 {
width: 100%;
background-color: white;
font-size: 20px;
margin-top: 20px;
}
/deep/.el-icon-arrow-up:before {
content: "\e78f";
}
.sp1 {
display: inline-block;
width: 7px;
height: 26px;
background-color: #354595;
position: relative;
left: 20px;
top: 6px;
}
.sp2 {
margin-left: 30px;
font-size: 20px;
font-weight: 700;
color: #354595;
}
.box1 {
height: 40px;
line-height: 40px;
border-bottom: 1px solid rgb(205, 205, 205, 0.5);
}
.block {
margin-top: 20px;
padding-bottom: 20px;
text-align: center;
}
/deep/.daichuli1 .el-button--primary {
color: #354595;
background-color: transparent;
border-color: transparent;
}
/deep/.daichuli1 .el-button--primary:hover {
background-color: #409eff;
color: #fff;
}
/deep/.el-input__icon {
line-height: 35px;
}
/deep/.el-table th > .cell {
font-size: 16px;
}
/deep/.el-button {
line-height: 0;
}
</style>

90
src/views/Home.vue Normal file
View File

@ -0,0 +1,90 @@
<template>
<div class="home">
<div class="header">
<img
src="/static/images/header.png"
alt="#"
style="height: 50px; margin-top: 5px;margin-left:300px"
/>
<i class="el-icon-user-solid userName" >
<span>{{userName}}</span>
</i>
</div>
<div id="cesium_container"></div>
<TestProduct v-show="showRightcard"></TestProduct>
<Parameter v-show="showLeftcard"></Parameter>
<Iconbox></Iconbox>
</div>
</template>
<script>
import cu from "@/lib/cesiumUtils";
import TestProduct from "../components/home/testProduct/index.vue";
import Parameter from '../components/home/parameter/index.vue';
import Iconbox from '../components/home/iconbox/index.vue';
export default {
name: "Home",
data() {
return {
showRightcard:false,
// sendToProParam:{
// proID:'1',
// ifShow:true,
// labelCla:'surfaceRoughness'
// },
isLabelCla:true,
showLeftcard:true,
currentUser: null,
};
},
components: {
TestProduct,
Parameter,
Iconbox,
},
created() {},
mounted() {
//
cu.initCesium("cesium_container");
//
this.bus.$on("openMenu", msg => {
this.showRightcard=msg.ifShow;
// this.sendToProParam = msg;
});
this.bus.$on('closeleftcard',msg=>{
this.showLeftcard=msg
})
},
computed:{
userName:function(){
return localStorage.getItem("userName")
}
},
methods: {},
};
</script>
<style scoped lang="less">
.header {
background: white;
height: 60px;
}
#cesium_container{
display: block;
position: absolute;
border: none;
width: 100%;
height: 100%;
}
.userName{
font-size: 20px;
color: #354595;
float: right;
margin-top: 30px;
margin-right: 20px;
span{
color: #000;
margin-left: 10px;
}
}
</style>

190
src/views/Login.vue Normal file
View File

@ -0,0 +1,190 @@
<template>
<div class="login-container">
<el-form
class="login-form"
:model="loginForm"
:rules="loginRules"
ref="loginForm"
label-width="0px"
>
<div class="title-container">
<h3 class="title">用户登录</h3>
</div>
<el-form-item prop="username">
<span class="svg-container">
<span class="el-icon-s-custom"></span>
</span>
<el-input class="inps" placeholder="账号" v-model="loginForm.account">
</el-input>
</el-form-item>
<el-form-item prop="password">
<span class="svg-container">
<span class="el-icon-lock"></span>
</span>
<el-input
class="inps"
type="password"
placeholder="密码"
v-model="loginForm.passWord"
show-password
></el-input>
</el-form-item>
<div style="text-align: center">
<el-button
type="primary"
style="width: 40%; margin-top: 20px"
round
class="submitBtn"
@click="submitForm"
>登录
</el-button>
</div>
</el-form>
</div>
</template>
<script>
import { login } from "@/api/user";
export default {
name: "Login",
data: function () {
return {
loginForm: {
account: "",
passWord: "",
},
loginRules: {
account: [{ required: true, message: "请输入账号", trigger: "blur" }],
passWord: [{ required: true, message: "请输入密码", trigger: "blur" }],
},
};
},
methods: {
submitForm() {
const userAccount = this.loginForm.account;
const userPassword = this.loginForm.passWord;
if (!userAccount) {
return this.$message({
type: "error",
message: "账号不能为空!",
});
}
if (!userPassword) {
return this.$message({
type: "error",
message: "密码不能为空!",
});
}
login({ userName: userAccount, userPwd: userPassword }).then((res) => {
if (res) {
localStorage.setItem("userName", res.userName);
localStorage.setItem("userId", Number(res.id));
localStorage.setItem("userType", res.userClass);
switch (res.userClass) {
case "1":
this.$router.push("/home");
break;
case "2":
this.$router.push("/daichuli");
break;
case "3":
this.$router.push("/daishenhe");
break;
}
}
});
},
},
};
</script>
<style lang="less">
@supports (-webkit-mask: none) and (not (cater-color: #fff)) {
.login-container .el-input input {
color: #fff;
}
}
/* reset element-ui css */
.login-container {
.el-input {
display: inline-block;
height: 47px;
width: 85%;
input {
background: transparent;
border: 0px;
-webkit-appearance: none;
border-radius: 0px;
padding: 12px 5px 12px 15px;
color: #fff;
height: 47px;
caret-color: #fff;
:-webkit-autofill {
box-shadow: 0 0 0px 1000px #283443 inset !important;
-webkit-text-fill-color: #fff !important;
}
}
}
.el-form-item {
border: 1px solid rgba(255, 255, 255, 0.1);
background: rgba(0, 0, 0, 0.1);
border-radius: 5px;
color: #454545;
}
}
</style>
<style lang="less" scoped>
.login-container {
min-height: 100%;
width: 100%;
background-color: #2d3a4b;
overflow: hidden;
.login-form {
position: relative;
width: 360px;
max-width: 100%;
padding: 200px 35px 0;
margin: 0 auto;
overflow: hidden;
}
.svg-container {
padding: 6px 5px 6px 15px;
color: #889aa4;
vertical-align: middle;
width: 30px;
display: inline-block;
}
.title-container {
position: relative;
.title {
font-size: 26px;
color: #eee;
margin: 0px auto 40px auto;
text-align: center;
font-weight: bold;
}
}
.show-pwd {
position: absolute;
right: 10px;
top: 7px;
font-size: 16px;
color: #889aa4;
cursor: pointer;
user-select: none;
}
}
</style>

View File

@ -0,0 +1,676 @@
<template>
<div>
<div class="orderMsg">
<div class="title">
<span class="sp1"></span><span class="sp2">订单信息</span>
</div>
<el-table
:data="orderList"
:header-cell-style="{ background: '#E4E9F1' }"
:cell-style="tableRowClassName"
style="width: 98%; margin-left: 1%; margin-top: 15px"
:default-sort="{ prop: 'date', order: 'descending' }"
>
<el-table-column
prop="orderCode"
label="订单编号"
width="180"
align="center"
>
</el-table-column>
<el-table-column
prop="orderSource"
label="订单来源"
width="180"
align="center"
>
<template slot-scope="scope">
{{ scope.row.orderSource | orderSourceFilter }}
</template>
</el-table-column>
<el-table-column prop="uploadDate" label="提交时间" align="center">
<template slot-scope="scope">
{{ scope.row.uploadDate | formatDate }}
</template>
</el-table-column>
<el-table-column prop="fileName" label="文件名" align="center">
</el-table-column>
<el-table-column
prop="fileSize"
label="文件大小"
sortable
align="center"
>
<template slot-scope="scope">
{{ scope.row.fileSize | transformByte }}
</template>
</el-table-column>
<el-table-column
prop="fileFormat"
label="文件格式"
sortable
align="center"
>
</el-table-column>
<el-table-column label="元数据" align="center">
<el-button type="primary" @click="openMetaCode"></el-button>
</el-table-column>
</el-table>
</div>
<div class="metaMsg" v-show="metaShow">
<div class="title">
<span class="sp1"></span><span class="sp2">元数据信息</span>
</div>
<div class="cstop">
<el-form
:inline="true"
:model="metaFormMsg"
class="demo-form-inline"
:disabled="true"
>
<el-form-item label="卫星" class="ysjMsg">
<el-input
class="ysjMsgMrg"
v-model="metaFormMsg.satellite"
placeholder="卫星名称"
></el-input>
</el-form-item>
<el-form-item label="载荷" class="ysjMsg">
<el-input
class="ysjMsgMrg"
v-model="metaFormMsg.load"
placeholder="载荷方式"
></el-input>
</el-form-item>
<el-form-item label="空间分辨率" class="ysjMsg2">
<el-input
v-model="metaFormMsg.resRatio"
placeholder="空间分辨率"
></el-input>
</el-form-item>
<el-form-item label="时间" class="ysjMsg">
<el-input
class="ysjMsgMrg"
v-model="formatDateStr"
placeholder="生产时间"
></el-input>
</el-form-item>
<el-form-item label="级别" prop="resource" class="ysjMsg2">
<el-radio-group v-model="metaFormMsg.proLevel">
<el-radio label="3"></el-radio>
<el-radio label="4"></el-radio>
<el-radio label="5"></el-radio>
<!-- <el-radio label="其他"></el-radio> -->
</el-radio-group> </el-form-item
><br />
<el-form-item label="坐标系统" class="ysjMsg">
<el-input
v-model="metaFormMsg.coordinateSys"
placeholder="坐标系统"
></el-input>
</el-form-item>
<el-form-item label="最小纬度" class="ysjMsg">
<el-input
v-model="metaFormMsg.minLat"
placeholder="最小纬度"
></el-input>
</el-form-item>
<el-form-item label="最大纬度" class="ysjMsg2">
<el-input
style="margin-left: 6px"
v-model="metaFormMsg.maxLat"
placeholder="最大纬度"
></el-input>
</el-form-item>
<el-form-item label="最小经度" class="ysjMsg">
<el-input
v-model="metaFormMsg.minLon"
placeholder="最小经度"
></el-input>
</el-form-item>
<el-form-item label="最大经度" class="ysjMsg2">
<el-input
v-model="metaFormMsg.maxLon"
placeholder="最大经度"
></el-input>
</el-form-item>
</el-form>
</div>
</div>
<div class="dealMsg">
<div class="orderSceneOfFeedback" v-if="failedStatus">
<div class="title">
<span class="sp1"></span><span class="sp2">已处理产品预览</span>
</div>
<div id="dealPreview"></div>
</div>
<div class="orderScene" v-if="failedStatusPdf">
<div class="title">
<span class="sp1"></span><span class="sp2">已处理产品预览</span>
</div>
<div id="dealPreview"></div>
</div>
<div class="orderPdf" v-if="failedStatusPdf">
<div class="title">
<span class="sp1"></span><span class="sp2">检验报告</span>
</div>
<div class="pdfDom">
<!-- <pdf v-for="i in numPages" :key="i" :src="pdfsrc" :page="i"></pdf> -->
<iframe class="pdfPage" :src="pdfUrl" frameborder="0"></iframe>
</div>
</div>
</div>
<div class="auditMsg" v-if="hasAudit">
<div class="title">
<span class="sp1"></span><span class="sp2">审核信息</span>
</div>
<div class="status">
<span
>审核状态{{ auditStatus === 1 ? "审核通过" : "审核不通过" }}</span
>
</div>
<el-input
type="textarea"
:disabled="true"
rows="3"
v-model="auditMsgText"
>
</el-input>
</div>
<div class="feedbackMsg" v-if="failedStatus">
<div class="title">
<span class="sp1"></span><span class="sp2">处理信息</span>
</div>
<div class="desc" style="margin-top: 20px">
<el-descriptions title="">
<el-descriptions-item label="订单状态">{{
feedbackFailure.feedbackResult
}}</el-descriptions-item>
</el-descriptions>
</div>
<div class="desc">
<el-descriptions title="">
<el-descriptions-item label="反馈时间">{{
feedbackDateStr
}}</el-descriptions-item>
</el-descriptions>
</div>
<div class="desc">
<el-descriptions title="">
<el-descriptions-item label="原因">{{
feedbackFailure.feedbackReason
}}</el-descriptions-item>
</el-descriptions>
</div>
<div class="desc">
<el-descriptions title="">
<el-descriptions-item
label="备注"
v-if="feedbackFailure.feedbackContext"
>{{ feedbackFailure.feedbackContext }}</el-descriptions-item
>
</el-descriptions>
</div>
<el-image
v-if="feedbackFailure.feedbackPicUrl"
style="margin-bottom: 5px; margin-left: 20px"
:src="feedbackFailure.feedbackPicUrl"
fit="cover"
>
</el-image>
</div>
</div>
</template>
<script>
// import pdf from 'vue-pdf'
import cu from "@/lib/cesiumUtils";
import {
getProductMsg,
getProductMetaMsg,
getOrderSamples,
getReportMsg,
getFeedbackMsg,
} from "@/api/pendingOrder";
import qs from "qs";
import { getExamineMsg } from "@/api/audit";
export default {
filters: {
orderSourceFilter(orderSource) {
const orderSourceMap = {
0: "用户上传",
1: "历史上传",
2: "平台共享",
};
return orderSourceMap[orderSource];
},
transformByte(size) {
if (!size) {
return "0B";
}
var num = 1024.0;
if (size < num) {
return size + "B";
}
if (size < Math.pow(num, 2)) {
return (size / num).toFixed(2) + "K";
}
if (size < Math.pow(num, 3)) {
return (size / Math.pow(num, 2)).toFixed(2) + "M";
}
if (size < Math.pow(num, 4)) {
return (size / Math.pow(num, 3)).toFixed(2) + "G";
}
return (size / Math.pow(num, 4)).toFixed(2) + "T"; // T
},
formatDate(inputTime) {
if (!inputTime) {
//&& typeof inputTime !== 'number'){
return "";
}
var localTime = "";
inputTime = new Date(inputTime).getTime();
// console.log('inputTim11e',inputTime,'typeof inputTime',typeof inputTime)
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
console.log("localTime", localTime);
return localTime;
},
},
mounted() {
cu.initCesium("dealPreview");
},
created() {
if (
Object.keys(this.$route.params).length > 0 &&
sessionStorage.getItem("prePage") === this.configration.path.yichuli
) {
this.queryParams = this.$route.params;
} else {
this.queryParams = JSON.parse(
localStorage.getItem(this.configration.path.yichuli)
);
}
document.body.scrollTop = 0;
this.initOrderMsg();
// console.log('11111',this.queryParams)
const samplesList = this.queryParams.sample;
this.getSplData(samplesList);
},
data() {
return {
queryParams: null,
metaShow: false,
orderList: [],
metaFormMsg: {
satellite: "", //
load: "", //
resRatio: "0.000307", //
proLevel: "4", //
coordinateSys: "WGS84", //
minLat: "116.13622332", //
maxLat: "118.342222", //
minLon: "34.211234", //
maxLon: "35.3455666", //
},
pdfUrl: "",
// pdfsrc:'',
// numPages:1,
feedbackFailure: {
feedbackDate: "",
feedbackResult: "",
feedbackReason: "",
feedbackContext: "",
feedbackPicUrl: "",
},
failedStatus: false,
failedStatusPdf: true,
hasAudit: false,
auditStatus: 1,
auditMsgText: "",
};
},
computed: {
formatDateStr: function () {
let inputTime = this.metaFormMsg.producedDate;
if (!inputTime) {
//&& typeof inputTime !== 'number'){
return "";
}
var localTime = "";
inputTime = new Date(inputTime).getTime();
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
feedbackDateStr: function () {
let inputTime = this.feedbackFailure.feedbackDate;
if (!inputTime) {
//&& typeof inputTime !== 'number'){
return "";
}
var localTime = "";
inputTime = new Date(inputTime).getTime();
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
},
methods: {
initOrderMsg() {
const self = this;
const om = this.queryParams;
const pdUId = om.product_upload_id;
getProductMsg(qs.stringify({ productId: pdUId })).then((res) => {
if (res || res.length !== 0) {
const r = res[0];
self.productMsg = r;
self.orderList = [];
self.orderList.push({
orderCode: om.order_code,
orderSource: om.order_resource,
uploadDate: om.create_date,
fileName: r.fileName,
fileSize: r.fileSize,
fileFormat: r.fileFormat,
});
sessionStorage.setItem("tifPath", r.tifPath);
getProductMetaMsg(qs.stringify({ dataPath: r.tifPath })).then(
(res) => {
console.log("111", res);
if (res !== null && res !== "") {
self.metaFormMsg = {
satellite: om.satellite_name,
load: om.satellite_load_name,
resRatio:
res.imageResolution > 0.01
? res.imageResolution
: (res.imageResolution * 111194.926).toFixed(2) + "米",
coordinateSys: res.coordinateSystem,
minLat: res.boundBoxMinY.toFixed(8),
maxLat: res.boundBoxMaxY.toFixed(8),
minLon: res.boundBoxMinX.toFixed(8),
maxLon: res.boundingBoxMaxX.toFixed(8),
producedDate: r.productDate,
proLevel: r.productLevel + "",
};
cu.flyToLayerRect(
res.boundBoxMinX,
res.boundBoxMinY,
res.boundingBoxMaxX,
res.boundBoxMaxY
);
}
}
);
const geoWS = r.geoWorkspace;
const geoLN = r.layerName;
cu.addlayer(geoWS, geoLN);
}
});
if (
om.order_status === 2 ||
om.order_status === 6 ||
om.order_status === 7
) {
this.getNumPages(om.id);
if (om.order_status === 6 || om.order_status === 7) {
this.hasAudit = true;
getExamineMsg(om.id).then((res) => {
if (res.code === 200 && res.data.length !== 0) {
const rs = res.data[0];
this.auditMsgText = rs.examineContext;
this.auditStatus = rs.examineResult;
}
});
}
} else {
this.failedStatus = true;
this.failedStatusPdf = false;
getFeedbackMsg(om.id).then((res) => {
if (res.code === 200 && res.data.length !== 0) {
const rd = res.data[0];
console.log(rd);
self.feedbackFailure.feedbackDate = rd.feedbackDate;
self.feedbackFailure.feedbackResult = rd.feedbackResult;
self.feedbackFailure.feedbackReason = rd.feedbackReason;
self.feedbackFailure.feedbackContext =
rd.feedbackContext === "" ? false : rd.feedbackContext;
self.feedbackFailure.feedbackPicUrl =
rd.feedbackPicUrl === "" ? false : rd.feedbackPicUrl;
}
});
}
},
getNumPages(orderId) {
getReportMsg(orderId).then((res) => {
if (res.code === 200 && res.data.length !== 0) {
const rpMsg = res.data[0];
this.pdfUrl = rpMsg.validationReportDownload;
// const pdfName = rpMsg.validationReportName;
// var loadingTask = pdf.createLoadingTask(pdfUrl,{withCredentials: false})
// loadingTask.promise.then(pdf =>{
// this.pdfsrc = loadingTask
// this.numPages = pdf.numPages
// }).catch((err) => {
// console.error('pdf')
// })
}
});
},
tableRowClassName({ rowIndex }) {
if ((rowIndex + 1) % 2 !== 0) {
return "background:#F5F7FA";
} else {
return "background:#FFFFFF";
}
},
openMetaCode() {
this.metaShow = !this.metaShow;
},
//
getSplData(spl) {
const om = this.queryParams;
getOrderSamples(om.id, om.product_subclass_id).then((res) => {
if (res.code == 200) {
const sp = res.data;
if (sp.length === 0) {
this.$message({
type: "warning",
message: "没有样本数据",
});
} else {
if (om.order_status === 3) {
cu.removePoint();
for (let i in sp) {
cu.addPoint(sp[i].lon, sp[i].lat, sp[i].alt);
}
} else {
let sp = JSON.parse(spl);
cu.removePoint();
for (let i in sp) {
cu.addPoint(sp[i].lon, sp[i].lat, sp[i].alt);
}
}
}
}
});
},
},
};
</script>
<style scoped lang="less">
.orderMsg {
width: 100%;
background-color: white;
font-size: 20px;
height: 180px;
padding-bottom: 20px;
}
.metaMsg {
width: 100%;
background-color: white;
font-size: 20px;
margin-top: 20px;
}
.dealMsg {
width: 100%;
// background-color: white;
font-size: 20px;
margin: 20px 0 20px 0;
height: 600px;
}
.title {
height: 40px;
line-height: 40px;
border-bottom: 1px solid rgb(205, 205, 205, 0.5);
}
.orderScene {
width: 50%;
height: inherit;
background-color: white;
float: left;
padding-bottom: 5px;
}
.orderSceneOfFeedback {
width: 100%;
height: inherit;
background-color: white;
float: left;
padding-bottom: 5px;
}
#dealPreview {
width: 98%;
height: calc(100% - 45px);
background-color: #354595;
margin-left: 1%;
margin-top: 2px;
}
.orderPdf {
width: calc(50% - 10px);
margin-left: 10px;
float: left;
background-color: white;
height: inherit;
padding-bottom: 5px;
.pdfDom {
height: 560px;
background-color: white;
// overflow: hidden;
// overflow-y: auto;
// overflow-x: auto;
.pdfPage {
width: 100%;
height: 100%;
}
}
}
.feedbackMsg {
background-color: white;
}
.status {
margin-left: 20px;
font-size: 16px;
margin-top: 10px;
margin-bottom: 15px;
}
.desc {
margin-left: 20px;
font-size: 16px;
}
.sp1 {
display: inline-block;
width: 7px;
height: 26px;
background-color: #354595;
position: relative;
left: 20px;
top: 6px;
}
.sp2 {
margin-left: 30px;
font-size: 20px;
font-weight: 700;
color: #354595;
}
.cstop {
margin-top: 20px;
margin-bottom: 0;
position: relative;
text-align: center;
}
.ysjMsg {
width: 18%;
}
.ysjMsgMrg {
margin-left: 14px;
}
.ysjMsg2 {
width: 20%;
}
/deep/.cstop .el-input.is-disabled .el-input__inner {
width: 140px;
height: 33px;
}
/deep/.cstop .el-form--inline .el-form-item__label {
text-align: justify;
// text-align-last: justify;
font-size: 15px;
}
/deep/.cstop .el-radio {
margin-right: 10px;
}
/deep/.cstop .el-radio__inner::after {
background-color: #354595;
}
/deep/.cstop .el-radio__input.is-checked .el-radio__inner {
border-color: #354595;
background: white;
}
/deep/.cstop .el-radio__input.is-disabled .el-radio__inner {
border-color: #354595;
}
/deep/.cstop .el-radio__input.is-disabled.is-checked .el-radio__inner::after {
background-color: #354595;
}
/deep/.cstop .el-radio__input.is-checked + .el-radio__label {
color: #606266;
}
/deep/.cstop .el-radio__inner {
border: 2px solid #354595;
}
/deep/.el-button {
line-height: 0;
}
/deep/.el-textarea__inner {
margin-left: 20px;
width: 50%;
height: 30px;
margin-bottom: 20px;
}
/deep/.el-textarea__inner:focus {
border-color: #354595;
}
.auditMsg {
background-color: white;
}
.status {
margin-left: 20px;
font-size: 16px;
margin-top: 10px;
margin-bottom: 15px;
}
</style>

268
src/views/Yichuli/index.vue Normal file
View File

@ -0,0 +1,268 @@
<template>
<div>
<router-view></router-view>
<div>
<div class="daichuli">
<div class="box1">
<span class="sp1"></span><span class="sp2">订单查询</span>
</div>
<OrderSearch
:getOrderList="getOrderList"
ref="orderSearchPanel"
:extSearch="true"
@initPage="initPage"
></OrderSearch>
</div>
<div class="daichuli1">
<div class="box1">
<span class="sp1"></span><span class="sp2">查询结果</span>
</div>
<el-table
:header-cell-style="{ background: '#E4E9F1' }"
:cell-style="tableRowClassName"
:data="processData"
style="width: 98%; margin-left: 1%; margin-top: 15px"
>
<el-table-column
prop="order_code"
label="订单编号"
width="180"
align="center"
>
</el-table-column>
<el-table-column
prop="create_date"
label="提交日期"
width="180"
align="center"
>
<template slot-scope="scope">
{{ scope.row.create_date | formatDate }}
</template>
</el-table-column>
<el-table-column
prop="satellite_name"
label="卫星类型"
align="center"
>
</el-table-column>
<!-- <el-table-column prop="satellite_load_name" label="载荷" align="center">
</el-table-column> -->
<el-table-column prop="product_id" label="产品大类" align="center">
<template slot-scope="scope">
{{ scope.row.product_id | categoryFilter }}
</template>
</el-table-column>
<el-table-column
prop="product_subclass_id"
label="产品小类"
align="center"
>
<template slot-scope="scope">
{{ scope.row.product_subclass_id | cldCategoryFilter }}
</template>
</el-table-column>
<el-table-column
prop="validation_method_desc"
label="检验类型"
align="center"
>
</el-table-column>
<el-table-column prop="userName" label="创建人员" align="center">
</el-table-column>
<el-table-column prop="auditName" label="检验人员" align="center">
</el-table-column>
<el-table-column
prop="inspectionName"
label="审核人员"
align="center"
>
</el-table-column>
<el-table-column
prop="order_status_desc"
label="订单状态"
align="center"
>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button
type="primary"
icon="el-icon-search"
@click="changePage(scope.row)"
>查看详情</el-button
>
</template>
</el-table-column>
</el-table>
<div class="block">
<Pagination
:page-sizes="[6, 12, 18]"
:total="pageForm.total"
:page.sync="pageForm.page"
:limit.sync="pageForm.limit"
@pagination="getOrderList"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import OrderSearch from "@/components/orderSearch";
import Pagination from "@/components/Pagination";
import { getOrderListByStatus } from "@/api/common";
export default {
components: {
OrderSearch,
Pagination,
},
filters: {
categoryFilter(category) {
const categoryMap = {
1: "几何产品",
2: "辐射产品",
3: "陆表产品",
4: "植被产品",
};
return categoryMap[category];
},
cldCategoryFilter(cldCategory) {
const cldCategoryMap = {
1: "正射校正",
2: "高程产品",
5: "干涉测量形变产品",
3: "后向散射系数",
4: "大气延迟校正",
9: "地表粗糙度",
6: "地表覆盖类型",
7: "土壤水分",
8: "地表盐碱度",
10: "植被高度",
11: "叶面积指数",
12: "植被物候",
};
return cldCategoryMap[cldCategory];
},
formatDate(inputTime) {
if (!inputTime && typeof inputTime !== "number") {
return "";
}
var localTime = "";
inputTime = new Date(inputTime);
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
},
data() {
return {
processData: [],
pageForm: {
total: 0,
page: 1,
limit: 6,
},
};
},
mounted() {
this.getOrderList();
},
methods: {
tableRowClassName({ rowIndex }) {
if ((rowIndex + 1) % 2 !== 0) {
return "background:#F5F7FA";
} else {
return "background:#FFFFFF";
}
},
changePage(orderMsg) {
// this.$router.push("/feedbackycl");
localStorage.setItem(
this.configration.path.yichuli,
JSON.stringify(orderMsg)
);
// console.log('', orderMsg)
this.$router.push({ name: "订单处理信息", params: orderMsg });
},
getOrderList() {
const searchVal = this.$refs.orderSearchPanel;
const sf = searchVal.searchForm;
sf.auditId = localStorage.userId;
if (sf.extOption !== "") sf.status = [sf.extOption];
else sf.status = [2, 3, 6, 7];
sf.page = this.pageForm.page;
sf.limit = this.pageForm.limit;
getOrderListByStatus(sf).then((res) => {
if (res.code === 200) {
this.processData = res.data.dataList;
this.pageForm.total = res.data.count;
}
});
},
initPage() {
this.pageForm.page = 1;
},
},
};
</script>
<style scoped lang="less">
.daichuli {
width: 100%;
background-color: white;
font-size: 20px;
}
.daichuli1 {
width: 100%;
background-color: white;
font-size: 20px;
margin-top: 20px;
}
/deep/.el-icon-arrow-up:before {
content: "\e78f";
}
.sp1 {
display: inline-block;
width: 7px;
height: 26px;
background-color: #354595;
position: relative;
left: 20px;
top: 6px;
}
.sp2 {
margin-left: 30px;
font-size: 20px;
font-weight: 700;
color: #354595;
}
.box1 {
height: 40px;
line-height: 40px;
border-bottom: 1px solid rgb(205, 205, 205, 0.5);
}
.block {
margin-top: 20px;
padding-bottom: 20px;
text-align: center;
}
/deep/.daichuli1 .el-button--primary {
color: #354595;
background-color: transparent;
border-color: transparent;
}
/deep/.daichuli1 .el-button--primary:hover {
background-color: #409eff;
color: #fff;
}
/deep/.el-input__icon {
line-height: 35px;
}
/deep/.el-table th > .cell {
font-size: 16px;
}
</style>

View File

@ -0,0 +1,549 @@
<template>
<div>
<div class="orderMsg">
<div class="title">
<span class="sp1"></span><span class="sp2">订单信息</span>
</div>
<el-table
:data="orderList"
:header-cell-style="{ background: '#E4E9F1' }"
:cell-style="tableRowClassName"
style="width: 98%; margin-left: 1%; margin-top: 15px"
:default-sort="{ prop: 'date', order: 'descending' }"
>
<el-table-column
prop="orderCode"
label="订单编号"
width="180"
align="center"
>
</el-table-column>
<el-table-column
prop="orderSource"
label="订单来源"
width="180"
align="center"
>
<template slot-scope="scope">
{{ scope.row.orderSource | orderSourceFilter }}
</template>
</el-table-column>
<el-table-column prop="uploadDate" label="提交时间" align="center">
<template slot-scope="scope">
{{ scope.row.uploadDate | formatDate }}
</template>
</el-table-column>
<el-table-column prop="fileName" label="文件名" align="center">
</el-table-column>
<el-table-column
prop="fileSize"
label="文件大小"
sortable
align="center"
>
<template slot-scope="scope">
{{ scope.row.fileSize | transformByte }}
</template>
</el-table-column>
<el-table-column
prop="fileFormat"
label="文件格式"
sortable
align="center"
>
</el-table-column>
<el-table-column label="元数据" align="center">
<el-button type="primary" @click="openMetaCode"></el-button>
</el-table-column>
</el-table>
</div>
<div class="metaMsg" v-show="metaShow">
<div class="title">
<span class="sp1"></span><span class="sp2">元数据信息</span>
</div>
<div class="cstop">
<el-form
:inline="true"
:model="metaFormMsg"
class="demo-form-inline"
:disabled="true"
>
<el-form-item label="卫星" class="ysjMsg">
<el-input
class="ysjMsgMrg"
v-model="metaFormMsg.satellite"
placeholder="卫星名称"
></el-input>
</el-form-item>
<el-form-item label="载荷" class="ysjMsg">
<el-input
class="ysjMsgMrg"
v-model="metaFormMsg.load"
placeholder="载荷方式"
></el-input>
</el-form-item>
<el-form-item label="空间分辨率" class="ysjMsg2">
<el-input
v-model="metaFormMsg.resRatio"
placeholder="空间分辨率"
></el-input>
</el-form-item>
<el-form-item label="时间" class="ysjMsg">
<el-input
class="ysjMsgMrg"
v-model="formatDateStr"
placeholder="生产时间"
></el-input>
</el-form-item>
<el-form-item label="级别" prop="resource" class="ysjMsg2">
<el-radio-group v-model="metaFormMsg.proLevel">
<el-radio label="3"></el-radio>
<el-radio label="4"></el-radio>
<el-radio label="5"></el-radio>
<!-- <el-radio label="其他"></el-radio> -->
</el-radio-group> </el-form-item
><br />
<el-form-item label="坐标系统" class="ysjMsg">
<el-input
v-model="metaFormMsg.coordinateSys"
placeholder="坐标系统"
></el-input>
</el-form-item>
<el-form-item label="最小纬度" class="ysjMsg">
<el-input
v-model="metaFormMsg.minLat"
placeholder="最小纬度"
></el-input>
</el-form-item>
<el-form-item label="最大纬度" class="ysjMsg2">
<el-input
style="margin-left: 6px"
v-model="metaFormMsg.maxLat"
placeholder="最大纬度"
></el-input>
</el-form-item>
<el-form-item label="最小经度" class="ysjMsg">
<el-input
v-model="metaFormMsg.minLon"
placeholder="最小经度"
></el-input>
</el-form-item>
<el-form-item label="最大经度" class="ysjMsg2">
<el-input
v-model="metaFormMsg.maxLon"
placeholder="最大经度"
></el-input>
</el-form-item>
</el-form>
</div>
</div>
<div class="orderMsgShow">
<div class="orderScene">
<div class="title">
<span class="sp1"></span><span class="sp2">已审核产品预览</span>
</div>
<div
id="checkedPreview"
@click="pickValue"
style="overflow: hidden; position: relative"
></div>
</div>
<div class="orderPdf">
<div class="title">
<span class="sp1"></span><span class="sp2">检验报告</span>
</div>
<div class="pdfDom">
<iframe class="pdfPage" :src="pdfUrl" frameborder="0"></iframe>
</div>
</div>
</div>
<div class="auditMsg">
<div class="title">
<span class="sp1"></span><span class="sp2">审核信息</span>
</div>
<div class="status">
<span>审核状态{{ auditStatus | auditStatusFilter }}</span>
</div>
<el-input
type="textarea"
:disabled="true"
rows="3"
v-model="auditMsgText"
>
</el-input>
</div>
</div>
</template>
<script>
import cu from "@/lib/cesiumUtils";
import {
getProductMsg,
getProductMetaMsg,
getOrderSamples,
getReportMsg,
} from "@/api/pendingOrder";
import { getExamineMsg } from "@/api/audit";
import qs from "qs";
export default {
filters: {
auditStatusFilter(auditStatus) {
const auditStatusMap = {
1: "审核通过",
2: "审核不通过",
};
return auditStatusMap[auditStatus];
},
orderSourceFilter(orderSource) {
const orderSourceMap = {
0: "用户上传",
1: "历史上传",
2: "平台共享",
};
return orderSourceMap[orderSource];
},
transformByte(size) {
if (!size) {
return "0B";
}
var num = 1024.0;
if (size < num) {
return size + "B";
}
if (size < Math.pow(num, 2)) {
return (size / num).toFixed(2) + "K";
}
if (size < Math.pow(num, 3)) {
return (size / Math.pow(num, 2)).toFixed(2) + "M";
}
if (size < Math.pow(num, 4)) {
return (size / Math.pow(num, 3)).toFixed(2) + "G";
}
return (size / Math.pow(num, 4)).toFixed(2) + "T"; // T
},
formatDate(inputTime) {
if (!inputTime && typeof inputTime !== "number") {
return "";
}
var localTime = "";
inputTime = new Date(inputTime);
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
},
mounted() {
cu.initCesium("checkedPreview");
cu.handleClick();
},
created() {
if (
Object.keys(this.$route.params).length > 0 &&
sessionStorage.getItem("prePage") === this.configration.path.yishenhe
) {
this.queryParams = this.$route.params;
} else {
this.queryParams = JSON.parse(
localStorage.getItem(this.configration.path.yishenhe)
);
}
document.body.scrollTop = 0;
this.initOrderMsg();
const samplesList = this.queryParams.sample;
this.getSplData(samplesList);
},
data() {
return {
queryParams: null,
metaShow: false,
orderList: [],
metaFormMsg: {
satellite: "", //
load: "", //
resRatio: "0.000307", //
proLevel: "4", //
coordinateSys: "WGS84", //
minLat: "116.13622332", //
maxLat: "118.342222", //
minLon: "34.211234", //
maxLon: "35.3455666", //
},
pdfUrl: "",
auditStatus: 1,
auditMsgText: "",
};
},
computed: {
formatDateStr: function () {
let inputTime = this.metaFormMsg.producedDate;
if (!inputTime) {
//&& typeof inputTime !== 'number'){
return "";
}
var localTime = "";
inputTime = new Date(inputTime).getTime();
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
},
methods: {
initOrderMsg() {
const self = this;
const om = this.queryParams;
const pdUId = om.product_upload_id;
getProductMsg(qs.stringify({ productId: pdUId })).then((res) => {
if (res || res.length !== 0) {
const r = res[0];
self.orderList = [];
self.orderList.push({
orderCode: om.order_code,
orderSource: om.order_resource,
uploadDate: om.create_date,
fileName: r.fileName,
fileSize: r.fileSize,
fileFormat: r.fileFormat,
});
sessionStorage.setItem("tifPath", r.tifPath);
getProductMetaMsg(qs.stringify({ dataPath: r.tifPath })).then(
(res) => {
if (res !== null) {
self.metaFormMsg = {
satellite: om.satellite_name,
load: om.satellite_load_name,
resRatio:
res.imageResolution > 0.01
? res.imageResolution
: (res.imageResolution * 111194.926).toFixed(2) + "米",
coordinateSys: res.coordinateSystem,
minLat: res.boundBoxMinY.toFixed(8),
maxLat: res.boundBoxMaxY.toFixed(8),
minLon: res.boundBoxMinX.toFixed(8),
maxLon: res.boundingBoxMaxX.toFixed(8),
producedDate: r.productDate,
proLevel: r.productLevel + "",
};
cu.flyToLayerRect(
res.boundBoxMinX,
res.boundBoxMinY,
res.boundingBoxMaxX,
res.boundBoxMaxY
);
}
}
);
const geoWS = r.geoWorkspace;
const geoLN = r.layerName;
cu.addlayer(geoWS, geoLN);
}
});
this.getNumPages(om.id);
getExamineMsg(om.id).then((res) => {
if (res.code === 200 && res.data.length !== 0) {
const rs = res.data[0];
this.auditMsgText = rs.examineContext;
this.auditStatus = rs.examineResult;
}
});
},
getNumPages(orderId) {
getReportMsg(orderId).then((res) => {
console.log(res);
if (res.code === 200 && res.data.length !== 0) {
const rpMsg = res.data[0];
this.pdfUrl = rpMsg.validationReportDownload;
}
});
},
tableRowClassName({ rowIndex }) {
if ((rowIndex + 1) % 2 !== 0) {
return "background:#F5F7FA";
} else {
return "background:#FFFFFF";
}
},
openMetaCode() {
this.metaShow = !this.metaShow;
},
//
getSplData(spl) {
const om = this.queryParams;
getOrderSamples(om.id, om.product_subclass_id).then((res) => {
if (res.code == 200) {
const sp = res.data;
if (sp.length === 0) {
this.$message({
type: "warning",
message: "没有样本数据",
});
} else {
// cu.removePoint();
// for (let i in sp) {
// cu.addPoint(sp[i].lon, sp[i].lat, sp[i].alt);
// }
let sp = JSON.parse(spl);
cu.removePoint();
for (let i in sp) {
cu.addPoint(sp[i].lon, sp[i].lat, sp[i].alt);
}
}
}
});
},
pickValue() {
cu.handleClick();
},
},
};
</script>
<style scoped lang="less">
.orderMsg {
width: 100%;
background-color: white;
font-size: 20px;
height: 180px;
padding-bottom: 20px;
}
.metaMsg {
width: 100%;
background-color: white;
font-size: 20px;
margin-top: 20px;
}
.orderMsgShow {
width: 100%;
// background-color: white;
font-size: 20px;
margin: 20px 0 20px 0;
height: 600px;
}
.title {
height: 40px;
line-height: 40px;
border-bottom: 1px solid rgb(205, 205, 205, 0.5);
}
.orderScene {
width: 50%;
height: inherit;
background-color: white;
float: left;
padding-bottom: 5px;
}
#checkedPreview {
width: 98%;
height: calc(100% - 45px);
background-color: #354595;
margin-left: 1%;
margin-top: 2px;
}
.orderPdf {
width: calc(50% - 10px);
margin-left: 10px;
float: left;
background-color: white;
height: inherit;
padding-bottom: 5px;
.pdfDom {
height: 560px;
background-color: white;
.pdfPage {
width: 100%;
height: 100%;
}
}
}
.auditMsg {
background-color: white;
}
.status {
margin-left: 20px;
font-size: 16px;
margin-top: 10px;
margin-bottom: 15px;
}
/deep/.el-textarea__inner {
margin-left: 20px;
width: 50%;
height: 30px;
margin-bottom: 20px;
}
/deep/.el-textarea__inner:focus {
border-color: #354595;
}
/deep/.el-input__inner {
height: 30px;
}
.sp1 {
display: inline-block;
width: 7px;
height: 26px;
background-color: #354595;
position: relative;
left: 20px;
top: 6px;
}
.sp2 {
margin-left: 30px;
font-size: 20px;
font-weight: 700;
color: #354595;
}
.cstop {
margin-top: 20px;
margin-bottom: 0;
position: relative;
text-align: center;
}
.ysjMsg {
width: 18%;
}
.ysjMsgMrg {
margin-left: 14px;
}
.ysjMsg2 {
width: 20%;
}
/deep/.cstop .el-input.is-disabled .el-input__inner {
width: 140px;
height: 33px;
}
/deep/.cstop .el-form--inline .el-form-item__label {
text-align: justify;
// text-align-last: justify;
font-size: 15px;
}
/deep/.cstop .el-radio {
margin-right: 10px;
}
/deep/.cstop .el-radio__inner::after {
background-color: #354595;
}
/deep/.cstop .el-radio__input.is-checked .el-radio__inner {
border-color: #354595;
background: white;
}
/deep/.cstop .el-radio__input.is-disabled .el-radio__inner {
border-color: #354595;
}
/deep/.cstop .el-radio__input.is-disabled.is-checked .el-radio__inner::after {
background-color: #354595;
}
/deep/.cstop .el-radio__input.is-checked + .el-radio__label {
color: #606266;
}
/deep/.cstop .el-radio__inner {
border: 2px solid #354595;
}
/deep/.el-button {
line-height: 0;
}
</style>

View File

@ -0,0 +1,271 @@
<template>
<div>
<router-view></router-view>
<div>
<div class="daichuli">
<div class="box1">
<span class="sp1"></span><span class="sp2">订单查询</span>
</div>
<OrderSearch
:getOrderList="getOrderList"
ref="orderSearchPanel"
@initPage="initPage"
></OrderSearch>
</div>
<div class="daichuli1">
<div class="box1">
<span class="sp1"></span><span class="sp2">查询结果</span>
</div>
<el-table
:header-cell-style="{ background: '#E4E9F1' }"
:cell-style="tableRowClassName"
:data="passAuditData"
style="width: 98%; margin-left: 1%; margin-top: 15px"
>
<el-table-column
prop="order_code"
label="订单编号"
width="150"
align="center"
>
</el-table-column>
<el-table-column
prop="create_date"
label="提交日期"
width="100"
align="center"
>
<template slot-scope="scope">
{{ scope.row.create_date | formatDate }}
</template>
</el-table-column>
<el-table-column
prop="satellite_name"
label="卫星类型"
align="center"
>
</el-table-column>
<el-table-column
prop="satellite_load_name"
label="载荷"
align="center"
>
</el-table-column>
<el-table-column prop="product_id" label="产品大类" align="center">
<template slot-scope="scope">
{{ scope.row.product_id | categoryFilter }}
</template>
</el-table-column>
<el-table-column
prop="product_subclass_id"
label="产品小类"
align="center"
>
<template slot-scope="scope">
{{ scope.row.product_subclass_id | cldCategoryFilter }}
</template>
</el-table-column>
<el-table-column
prop="validation_method_desc"
label="检验类型"
align="center"
>
</el-table-column>
<el-table-column prop="userName" label="创建人员" align="center">
</el-table-column>
<el-table-column prop="auditName" label="检验人员" align="center">
</el-table-column>
<el-table-column
prop="inspectionName"
label="审核人员"
align="center"
>
</el-table-column>
<el-table-column
prop="order_status_desc"
label="订单状态"
align="center"
>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button
type="primary"
icon="el-icon-search"
@click="changePage(scope.row)"
>查看详情</el-button
>
</template>
</el-table-column>
</el-table>
<div class="block">
<Pagination
:page-sizes="[6, 12, 18]"
:total="pageForm.total"
:page.sync="pageForm.page"
:limit.sync="pageForm.limit"
@pagination="getOrderList"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import OrderSearch from "@/components/orderSearch";
import Pagination from "@/components/Pagination";
import { getOrderListByStatus } from "@/api/common";
export default {
components: {
OrderSearch,
Pagination,
},
filters: {
categoryFilter(category) {
const categoryMap = {
1: "几何产品",
2: "辐射产品",
3: "陆表产品",
4: "植被产品",
};
return categoryMap[category];
},
cldCategoryFilter(cldCategory) {
const cldCategoryMap = {
1: "正射校正",
2: "高程产品",
5: "干涉测量形变产品",
3: "后向散射系数",
4: "大气延迟校正",
9: "地表粗糙度",
6: "地表覆盖类型",
7: "土壤水分",
8: "地表盐碱度",
10: "植被高度",
11: "叶面积指数",
12: "植被物候",
};
return cldCategoryMap[cldCategory];
},
formatDate(inputTime) {
if (!inputTime && typeof inputTime !== "number") {
return "";
}
var localTime = "";
inputTime = new Date(inputTime);
const offset = new Date().getTimezoneOffset();
localTime = new Date(inputTime - offset * 60000).toISOString();
localTime = localTime.substr(0, localTime.lastIndexOf("."));
localTime = localTime.replace("T", " ");
return localTime;
},
},
data() {
return {
passAuditData: [],
pageForm: {
total: 0,
page: 1,
limit: 6,
},
};
},
mounted() {
this.getOrderList();
},
methods: {
tableRowClassName({ rowIndex }) {
if ((rowIndex + 1) % 2 !== 0) {
return "background:#F5F7FA";
} else {
return "background:#FFFFFF";
}
},
changePage(orderMsg) {
localStorage.setItem(
this.configration.path.yishenhe,
JSON.stringify(orderMsg)
);
this.$router.push({ name: "已审核订单信息", params: orderMsg });
},
getOrderList() {
const searchVal = this.$refs.orderSearchPanel;
const sf = searchVal.searchForm;
sf.inspectionId = Number(localStorage.userId);
sf.page = this.pageForm.page;
sf.limit = this.pageForm.limit;
sf.status = [6, 7];
getOrderListByStatus(sf).then((res) => {
if (res.code === 200) {
this.passAuditData = res.data.dataList;
this.pageForm.total = res.data.count;
}
});
},
initPage() {
this.pageForm.page = 1;
},
},
};
</script>
<style scoped lang="less">
.daichuli {
width: 100%;
background-color: white;
font-size: 20px;
}
.daichuli1 {
width: 100%;
background-color: white;
font-size: 20px;
margin-top: 20px;
}
/deep/.el-icon-arrow-up:before {
content: "\e78f";
}
.sp1 {
display: inline-block;
width: 7px;
height: 26px;
background-color: #354595;
position: relative;
left: 20px;
top: 6px;
}
.sp2 {
margin-left: 30px;
font-size: 20px;
font-weight: 700;
color: #354595;
}
.box1 {
height: 40px;
line-height: 40px;
border-bottom: 1px solid rgb(205, 205, 205, 0.5);
}
.block {
margin-top: 20px;
padding-bottom: 20px;
text-align: center;
}
/deep/.daichuli1 .el-button--primary {
color: #354595;
background-color: transparent;
border-color: transparent;
}
/deep/.daichuli1 .el-button--primary:hover {
background-color: #409eff;
color: #fff;
}
/deep/.el-input__icon {
line-height: 35px;
}
/deep/.el-table th > .cell {
font-size: 16px;
}
/deep/.el-button {
line-height: 0;
}
</style>

110
vue.config.js Normal file
View File

@ -0,0 +1,110 @@
// 拷贝文件插件
const CopyWebpackPlugin = require("copy-webpack-plugin");
const webpack = require("webpack");
const path = require("path");
let cesiumSource = "./node_modules/cesium/Source";
let cesiumWorkers = "../Build/Cesium/Workers";
module.exports = {
// 基本路径
publicPath: "./",
// 输出文件目录
outputDir: "dist",
assetsDir: "static",
indexPath: "index.html",
filenameHashing: true,
productionSourceMap: false,
lintOnSave: false, // 在保存代码的时候开启eslint代码检查机制
devServer: {
// 实时保存,编译的配置段
port: 8085, // http服务的端口号码设定
open: false,
proxy: {
[process.env.VUE_APP_BASE_API]: {
target:'http://192.168.1.104:8086/macApi',
// target: "http://211.157.180.211:8086/macApi",
changeOrigin: true,
pathRewrite: {
["^" + process.env.VUE_APP_BASE_API]: ""
}
},
[process.env.VUE_APP_REALITY_API]: {
target:'http://192.168.1.104:18092/microwave',
// target: "http://211.157.180.211:18092/microwave",
changeOrigin: true,
pathRewrite: {
["^" + process.env.VUE_APP_REALITY_API]: ""
}
},
[process.env.VUE_APP_FILE_API]: {
target:'http://192.168.1.104:18093/file',
// target: "http://211.157.180.211:18093/file",
changeOrigin: true,
pathRewrite: {
["^" + process.env.VUE_APP_FILE_API]: ""
}
}
}
},
configureWebpack: {
output: {
sourcePrefix: " "
},
amd: {
toUrlUndefined: true
},
resolve: {
alias: {
vue$: "vue/dist/vue.esm.js",
//可以对同一个地址起2个不同的别名
"@": path.resolve("src"),
src: path.resolve("src"),
cesium: path.resolve(__dirname, cesiumSource)
}
},
plugins: [
new CopyWebpackPlugin([
{ from: path.join(cesiumSource, cesiumWorkers), to: "static/Workers" }
]),
new CopyWebpackPlugin([
{ from: path.join(cesiumSource, "Assets"), to: "static/Assets" }
]),
new CopyWebpackPlugin([
{ from: path.join(cesiumSource, "Widgets"), to: "static/Widgets" }
]),
new CopyWebpackPlugin([
{
from: path.join(cesiumSource, "ThirdParty/Workers"),
to: "static/ThirdParty/Workers"
}
]),
new webpack.DefinePlugin({
CESIUM_BASE_URL: JSON.stringify("./static")
})
// new CopyWebpackPlugin([ { from: path.join(cesiumSource, cesiumWorkers), to: 'Workers'}]),
// new CopyWebpackPlugin([ { from: path.join(cesiumSource, 'Assets'), to: 'Assets'}]),
// new CopyWebpackPlugin([ { from: path.join(cesiumSource, 'Widgets'), to: 'Widgets'}]),
// new CopyWebpackPlugin([ { from: path.join(cesiumSource, 'ThirdParty/Workers'), to: 'ThirdParty/Workers'}]),
// new webpack.DefinePlugin({
// //定义 Cesium 从哪里加载资源,如果使用默认的''
// //却变成了绝对路径了,所以这里使用'./',使用相对路径
// CESIUM_BASE_URL: JSON.stringify('./')
// })
],
optimization: {
splitChunks: {
cacheGroups: {
commons: {
name: "Cesium",
test: /[\\/]node_modules[\\/]cesium/,
chunks: "all"
}
}
}
},
module: {
// unknownContextCritical: /^.\/.*$/,
unknownContextCritical: false
}
}
};