文件

525 行
28 KiB
HTML

<link rel="stylesheet" href="__CDN__/assets/element-ui-2.15.14/css/index.css">
<link href="/assets/css/sweetalert.css" rel="stylesheet">
<link rel="stylesheet" href="__CDN__/assets/css/vvv.css">
<style>
.el-form-item__label {
width: 110px !important;
}
.el-tag + .el-tag {
margin-left: 10px;
}
.button-new-tag {
margin-left: 10px;
height: 32px;
line-height: 30px;
padding-top: 0;
padding-bottom: 0;
}
.input-new-tag {
width: 90px;
margin-left: 10px;
vertical-align: bottom;
}
input[type="file"] {
display: none !important;
}
.el-form-item__error {
/*margin-left: 30px;*/
}
.search-select .el-input--suffix .el-input__inner {
width: 130px;
}
.quality-direction-toggle {
display: inline-flex;
flex-wrap: nowrap;
}
.quality-direction-toggle .el-button {
padding-left: 8px;
padding-right: 8px;
}
.quality-editor-dialog .el-dialog__body {
padding: 10px 18px 0;
background: #f5f7fa;
}
.quality-editor-dialog .el-dialog__header {
padding: 16px 20px 12px;
border-bottom: 1px solid #ebeef5;
}
.quality-editor-dialog .el-dialog__footer {
position: sticky;
bottom: 0;
z-index: 3;
padding: 12px 20px;
background: #fff;
border-top: 1px solid #ebeef5;
box-shadow: 0 -4px 14px rgba(31, 45, 61, .06);
}
.quality-editor-card {
padding: 14px 16px 4px;
border: 1px solid #e4e7ed;
border-radius: 8px;
background: #fff;
}
.quality-editor-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-bottom: 12px;
padding: 10px 12px;
border-radius: 6px;
background: #f0f9ff;
color: #5f6b7a;
font-size: 13px;
line-height: 1.6;
}
.quality-editor-toolbar strong {
color: #303133;
}
.quality-legend {
display: flex;
flex-wrap: wrap;
gap: 8px;
white-space: nowrap;
}
.quality-legend span {
padding: 1px 7px;
border-radius: 10px;
font-size: 12px;
}
.quality-legend .good { color: #16844a; background: #e8f8ef; }
.quality-legend .warn { color: #946200; background: #fff7df; }
.quality-legend .bad { color: #c0392b; background: #fff0ee; }
.quality-editor-table .el-table__header th {
padding: 8px 0;
background: #f8fafc;
color: #475467;
font-weight: 600;
}
.quality-editor-table .el-table__body td {
padding: 4px 0;
}
.quality-editor-table .cell {
line-height: 20px;
}
.quality-editor-table .el-input--small .el-input__inner {
height: 28px;
line-height: 28px;
}
.quality-editor-table .el-input__count {
display: none;
}
.quality-editor-table .el-table__body-wrapper {
max-height: min(58vh, 680px);
overflow-y: auto;
}
.quality-rule-ranges {
display: flex;
flex-wrap: wrap;
gap: 3px 9px;
margin-top: 5px;
font-size: 12px;
line-height: 18px;
}
.quality-rule-ranges span {
white-space: nowrap;
}
.quality-direction-help {
margin-top: 6px;
color: #8492a6;
font-size: 12px;
}
@media (max-width: 1100px) {
.quality-editor-toolbar { align-items: flex-start; flex-direction: column; gap: 4px; }
.quality-editor-dialog .el-dialog__body { padding-left: 10px; padding-right: 10px; }
}
</style>
<div id="vue" v-cloak>
<div class="screen-container">
<div class="screen-container-show">
<div class="screen-container-right display-flex" style="margin-right: 12px">
<el-select v-model="search.site" @change="siteChanged" clearable size="small" placeholder="全部库区" aria-label="筛选库区" style="width: 150px">
<el-option v-for="site in siteOptions" :key="site.id" :value="site.id" :label="site.name"></el-option>
</el-select>
</div>
<el-button style="margin-top: 14px;" size="small" @click="refreshPage" icon="el-icon-refresh" circle
type="primary"></el-button>
<div class="screen-container-left display-flex">
<div class="datetime">
<el-date-picker
value-format="yyyy-MM-dd HH:mm:ss"
@change="handleClearDate('startTime')"
size="small"
v-model="search.startTime"
type="datetime"
placeholder="选择起始时间">
</el-date-picker>
</div>
<div class="datetime">
<el-date-picker
value-format="yyyy-MM-dd HH:mm:ss"
@change="handleClearDate('endTime')"
size="small"
v-model="search.endTime"
type="datetime"
placeholder="选择结束时间">
</el-date-picker>
</div>
</div>
<div class="screen-container-right display-flex">
<el-select @clear="handleClearSelect('gid')" clearable filterable size="small" style="width: 220px;" v-model="search.gid" placeholder="所属仓库">
<el-option
v-for="item in granaryList"
:key="item.id"
:label="granaryLabel(item)"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="screen-container-right display-flex" style="position: relative; top: 2px;">
<el-radio-group @input="handelSeasonRadio" size="small" v-model="search.season">
<el-radio-button :label="0">全部</el-radio-button>
<el-radio-button :label="1">春季</el-radio-button>
<el-radio-button :label="2">秋季</el-radio-button>
<el-radio-button :label="3">满仓</el-radio-button>
</el-radio-group>
</div>
<div class="screen-container-right display-flex" style="position: relative; top: 2px;">
<el-radio-group @input="handelTypeRadio" size="small" v-model="search.type">
<el-radio-button v-for="(item, index) of typeOptList" :label="item.id">{{item.name}}
</el-radio-button>
</el-radio-group>
</div>
<div class="screen-container-right display-flex">
<el-date-picker
@change="handleClearDate('date')"
size="small"
value-format="yyyy-MM"
style="width: 220px;"
v-model="search.date"
type="month"
placeholder="记录日期">
</el-date-picker>
<el-button style="margin-left: 10px;" @click="searchData" size="small" type="success" plain icon="el-icon-search">搜索
</el-button>
</div>
<div class="search-select screen-container-right display-flex keyword">
<a href="testing/add" @click.prevent="openAddPage" class="el-button el-button--primary el-button--small is-plain btn-addtabs" title="添加检测报告"><i class="el-icon-plus"></i><span>添加</span></a>
<el-button @click="del" size="small" type="danger" plain icon="el-icon-delete">删除
</el-button>
</div>
</div>
</div>
<div class="vue-table background-white color-666">
<el-table :data="tableData" border highlight-current-row v-loading="listLoading"
@sort-change="sortChange" :element-loading-text="loadingText"
@selection-change="handleSelectionChange" style="width: 100%">
<el-table-column type="selection" width="60" align="center"></el-table-column>
<el-table-column prop="granary.name" label="所属仓库" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="type" width="130" label="类型" show-overflow-tooltip
align="center">
<template scope="scope">
<span v-if="scope.row.type == 'rapeseed'">菜籽油</span>
<span v-else-if="scope.row.type == 'bean'">大豆油</span>
<span v-else-if="scope.row.type == 'wheat'">小麦</span>
<span v-else-if="scope.row.type == 'paddy'">稻谷</span>
<span v-else-if="scope.row.type == 'corn'">玉米</span>
</template>
</el-table-column>
<el-table-column prop="date" label="记录日期" width="130" align="center">
<template scope="scope">
<span>{{scope.row.year}}-{{scope.row.month}}</span>
</template>
</el-table-column>
<el-table-column prop="season" label="季节" width="150" align="center">
<template scope="scope">
<span>{{scope.row.year}}-{{scope.row.season == 1 ? '春季' : scope.row.season == 2 ? '秋季' : '满仓'}}</span>
</template>
</el-table-column>
<el-table-column prop="season" label="排序" width="150" align="center">
<template scope="scope">
<el-input @blur="handleSort(scope.row)" v-model="scope.row.sort" size="mini" placeholder="排序"></el-input>
</template>
</el-table-column>
<el-table-column label="数据来源" width="120" align="center"><template slot-scope="s"><el-tag :type="Number(s.row.is_demo) === 1 ? 'warning' : 'info'" size="small">{{Number(s.row.is_demo) === 1 ? 'DEMO 演示' : '后台录入'}}</el-tag></template></el-table-column>
<el-table-column prop="create_time" width="160" :formatter="dateFormat" label="创建时间" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column align="center" width="320" fixed="right" label="操作">
<template scope="scope">
<a :href="'testing/edit?ids=' + scope.row.id" @click.prevent="openEditPage(scope.row)"
class="el-button el-button--primary el-button--small btn-addtabs" title="编辑检测报告"><i
class="el-icon-edit"></i><span>编辑</span></a>
<a :href="'testing/detail?ids=' + scope.row.id" @click.prevent="openDetailPage(scope.row)"
class="el-button el-button--success el-button--small btn-addtabs" title="检测报告详情"><i
class="el-icon-tickets"></i><span>详情</span></a>
<button @click="dell(scope.row.id)" type="button"
class="el-button el-button--danger el-button--small"><i
class="el-icon-delete"></i><span>删除</span></button>
</template>
</el-table-column>
</el-table>
<div class="layout-pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalCount">
</el-pagination>
</div>
</div>
<!-- 添加编辑 -->
<div class="add-dialog">
<el-dialog
:close-on-click-modal="false"
:title="title"
:visible.sync="addDialog"
custom-class="quality-editor-dialog"
width="96%"
>
<div class="form">
<el-form ref="form" :rules="rules" :model="formData" label-width="110px">
<el-form-item label="所属库区:" required>
<el-select v-model="formSite" @change="formSiteChanged" placeholder="请选择库区" style="width: 330px">
<el-option v-for="site in siteOptions" :key="site.id" :value="site.id" :label="site.name"></el-option>
</el-select>
</el-form-item>
<el-form-item label="所属仓库:" prop="gid">
<el-select @change="handleGranaryChange" style="width: 330px;" v-model="formData.gid" filterable clearable
placeholder="请您选择所属仓库">
<el-option
v-for="item in siteGranaries"
:key="item.id"
:label="granaryLabel(item)"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="类型:" prop="type">
<div v-if="formData.gid" class="type">
{{typeName}}
</div>
</el-form-item>
<el-form-item label="记录日期:" prop="record_date">
<el-date-picker
style="width: 330px;"
value-format="yyyy-MM"
v-model="formData.record_date"
type="month"
placeholder="请您选择记录日期">
</el-date-picker>
</el-form-item>
<el-form-item label="季节:" prop="season">
<el-radio style="margin-right: 0;" v-model="formData.season" :label="1" border size="small">春季</el-radio>
<el-radio style="margin-right: 0;" v-model="formData.season" :label="2" border size="small">秋季</el-radio>
<el-radio v-model="formData.season" :label="3" border size="small">满仓</el-radio>
</el-form-item>
<el-form-item label="排序:" prop="season">
<el-input type="number" placeholder="排序" style="width: 330px;" v-model="formData.sort"></el-input>
</el-form-item>
<el-form-item label="检测参数:" prop="content">
<div class="quality-editor-card">
<div class="quality-editor-toolbar">
<div><strong>录入提示:</strong>先填实测值、预警值和警告值,再选择指标偏好。大屏显示列可开启或关闭该参数在大屏上的展示。等于阈值时归入较低一级。</div>
<div class="quality-legend" aria-label="颜色规则">
<span class="good">绿 · 达标</span>
<span class="warn">黄 · 预警</span>
<span class="bad">红 · 警告</span>
</div>
</div>
<el-table class="quality-editor-table" size="small" :data="typeList[formData.type]['content']" border highlight-current-row>
<el-table-column prop="num" width="60" label="序号" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="name" min-width="150" label="检测项目" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="unit" width="110" label="单位" show-overflow-tooltip
align="center">
<template scope="scope">
<el-input style="width: 85px;" placeholder="单位" size="small" maxlength="15"
v-model="typeList[formData.type]['content'][scope.$index].unit"></el-input>
</template>
</el-table-column>
<el-table-column prop="val" width="130" label="值" show-overflow-tooltip
align="center">
<template scope="scope">
<el-input style="width: 110px;" placeholder="请您输入值" size="small" maxlength="50"
v-model="typeList[formData.type]['content'][scope.$index].val"></el-input>
</template>
</el-table-column>
<el-table-column prop="warning" width="140" label="预警值" show-overflow-tooltip
align="center">
<template scope="scope">
<el-input style="width: 120px;" placeholder="请您输入预警值" size="small" maxlength="50"
v-model="typeList[formData.type]['content'][scope.$index].warning"></el-input>
</template>
</el-table-column>
<el-table-column prop="alert" width="140" label="警告值" show-overflow-tooltip
align="center">
<template scope="scope">
<el-input style="width: 120px;" placeholder="请您输入警告值" size="small" maxlength="50"
v-model="typeList[formData.type]['content'][scope.$index].alert"></el-input>
</template>
</el-table-column>
<el-table-column prop="is_number" width="110" label="大屏显示" show-overflow-tooltip
align="center">
<template scope="scope">
<el-button @click="handelIsNumber(scope.$index, 2)" size="mini" v-if="scope.row.is_number == 1" type="success" icon="el-icon-check">显示</el-button>
<el-button @click="handelIsNumber(scope.$index, 1)" size="mini" v-else type="warning" icon="el-icon-close">隐藏</el-button>
</template>
</el-table-column>
<el-table-column width="270" label="指标偏好与颜色规则" align="left">
<template scope="scope">
<template v-if="isNumericRule(scope.row)">
<el-button-group class="quality-direction-toggle" :aria-label="'选择' + scope.row.name + '的指标偏好'">
<el-button size="mini" :type="ruleDirection(scope.row) === 'lower' ? 'success' : 'info'"
:plain="ruleDirection(scope.row) !== 'lower'"
:aria-pressed="ruleDirection(scope.row) === 'lower'"
@click="setRuleDirection(scope.row, 'lower')">越大越好</el-button>
<el-button size="mini" :type="ruleDirection(scope.row) === 'upper' ? 'success' : 'info'"
:plain="ruleDirection(scope.row) !== 'upper'"
:aria-pressed="ruleDirection(scope.row) === 'upper'"
@click="setRuleDirection(scope.row, 'upper')">越小越好</el-button>
</el-button-group>
<div v-if="ruleError(scope.row)" style="color: #c0392b; margin-top: 6px;">{{ruleError(scope.row)}}</div>
<div v-else class="quality-rule-ranges">
<span style="color: #16844a;">绿 {{ruleRanges(scope.row)[0]}}</span>
<span style="color: #946200;">黄 {{ruleRanges(scope.row)[1]}}</span>
<span style="color: #c0392b;">红 {{ruleRanges(scope.row)[2]}}</span>
</div>
</template>
<span v-else-if="ruleError(scope.row)" style="color: #c0392b;">{{ruleError(scope.row)}}</span>
<span v-else>文字指标,按检测结果判定</span>
</template>
</el-table-column>
</el-table>
<div class="quality-direction-help">“越大越好”:低于预警值会触发风险;“越小越好”:高于预警值会触发风险。文字指标按检测结果判定。</div>
</div>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialog = false" size="small" icon="el-icon-switch-button">取 消</el-button>
<el-button type="primary" size="small" @click="submit" icon="el-icon-position">提 交</el-button>
</span>
</el-dialog>
</div>
<!-- 详情 -->
<div class="detail-dialog">
<el-dialog
:close-on-click-modal="false"
title="详情"
:visible.sync="detailDialog"
width="98%"
>
<div class="form">
<el-form ref="detailForm" :model="formData" label-width="110px">
<el-form-item label="所属库区:" required>
<el-select v-model="formSite" @change="formSiteChanged" placeholder="请选择库区" style="width: 330px">
<el-option v-for="site in siteOptions" :key="site.id" :value="site.id" :label="site.name"></el-option>
</el-select>
</el-form-item>
<el-form-item label="所属仓库:" prop="gid">
<div>{{detail.granary.name}}</div>
</el-form-item>
<el-form-item label="类型:" prop="type">
<span v-if="detail.type == 'rapeseed'">菜籽油</span>
<span v-else-if="detail.type == 'bean'">大豆油</span>
<span v-else-if="detail.type == 'wheat'">小麦</span>
<span v-else-if="detail.type == 'paddy'">稻谷</span>
<span v-else-if="detail.type == 'corn'">玉米</span>
</el-form-item>
<el-form-item label="记录日期:" prop="record_date">
<div>{{detail.year}}-{{detail.month}}</div>
</el-form-item>
<el-form-item label="季节:" prop="record_date">
<div v-if="detail.season == 1">春季</div>
<div v-else-if="detail.season == 2">秋季</div>
<div v-else>满仓</div>
</el-form-item>
<el-form-item label="检测参数:" prop="content">
<el-table :data="detail.testing_params" border highlight-current-row>
<el-table-column prop="num" width="60" label="序号" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="name" label="检测项目" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="unit" width="160" label="单位" show-overflow-tooltip
align="center">
</el-table-column>
<el-table-column prop="val" width="200" label="值" show-overflow-tooltip
align="center">
</el-table-column>
<el-table-column prop="warning" width="230" label="预警值" show-overflow-tooltip
align="center">
</el-table-column>
<el-table-column prop="alert" width="230" label="警告值" show-overflow-tooltip
align="center">
</el-table-column>
<el-table-column prop="is_number" width="100" label="大屏显示" show-overflow-tooltip
align="center">
<template scope="scope">
<el-tag size="mini" v-if="scope.row.is_number == 1" type="success">显示</el-tag>
<el-tag size="mini" v-else type="info">隐藏</el-tag>
</template>
</el-table-column>
<el-table-column width="250" label="指标偏好与颜色规则" align="left">
<template scope="scope">
<template v-if="isNumericRule(scope.row)">
<div>{{ruleDirection(scope.row) === 'lower' ? '● 越大越好' : '● 越小越好'}}</div>
<div style="color: #16844a;">绿 · {{ruleRanges(scope.row)[0]}}</div>
<div style="color: #946200;">黄 · {{ruleRanges(scope.row)[1]}}</div>
<div style="color: #c0392b;">红 · {{ruleRanges(scope.row)[2]}}</div>
</template>
<span v-else-if="ruleError(scope.row)" style="color: #c0392b;">{{ruleError(scope.row)}}</span>
<span v-else>文字指标,按检测结果判定</span>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="detailDialog = false" size="small" icon="el-icon-switch-button">取 消</el-button>
</span>
</el-dialog>
</div>
</div>
<script src="__CDN__/assets/element-ui-2.15.14/js/vue.js"></script>
<script src="__CDN__/assets/element-ui-2.15.14/js/index.js"></script>
<script src="__CDN__/assets/tool/libs/moment.js"></script>
<script src="/assets/js/sweetalert.min.js"></script>
<script src="__CDN__/assets/js/jquery-2.1.1.min.js"></script>