You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2013 lines
74 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="app-container setting-main">
<div class="app-container-search main-radius">
<h1 style="margin: 0;">小程序显示配置</h1>
</div>
<div class="app-container-search main-bgcolor main-radius setting-container">
<div class="setting-title">当前批次基本信息</div>
<el-row class="setting-content">
<el-col :span="6"><div>批次号{{ harvestBatchConfig.harvestBatchId }}</div></el-col>
<el-col :span="6"><div>所属商户{{ harvestBatchConfig.belongBusinessName }}</div></el-col>
<el-col :span="6"><div>商品名称{{ harvestBatchConfig.goodsName }}</div></el-col>
</el-row>
<el-row>
<el-col :span="24" style="margin-top: 20px;">
<div>当前所选语言{{ languageType.name }}</div>
<div style="color: red">*请注意, 每种语言需有对应配置, 否则小程序将无法正常显示</div>
</el-col>
</el-row>
<el-row style="margin-top: 20px;">
<el-col :span="24" style="line-height: 40px;">
<span style="margin-right: 20px;">小程序显示模板:</span>
<el-select v-model="harvestBatchConfig.templateId" placeholder="请选择小程序显示模板">
<el-option
v-for="template in uniTemplateOptions"
:key="template.id"
:label="template.templateName"
:value="template.id"
/>
</el-select>
</el-col>
</el-row>
</div>
<!-- ///////////////////////////////////////// 商品信息 ///////////////////////////////////////// -->
<div class="app-container-search main-bgcolor main-radius setting-container">
<div class="setting-title flex-jcenter">
<div class="">商品信息</div>
<div class="">
<el-button class="mr-10" @click="openImportGoodsInfo">导入商品信息</el-button>
</div>
</div>
<div class="setting-title flex-jcenter">
<div class="mr-6">
<el-input v-model="goodsInfo.linkName" />
</div>
<div>
<span class="fs-12 mr-6" >扫码展示</span>
<el-switch v-model="goodsInfo.scanShow" :active-value="true" :inactive-value="false"></el-switch>
</div>
</div>
<operateInfo
:operateDetails.sync="goodsInfo.operateDetails"
:typeList="typeList"
:type="'goods'"
/>
</div>
<!-- ///////////////////////////////////////// 产地信息 ///////////////////////////////////////// -->
<div class="app-container-search main-bgcolor main-radius setting-container" v-loading="envDataLoading">
<div class="setting-title flex-jcenter">
<div class="">产地信息</div>
<div class="">
</div>
</div>
<div class="setting-title flex-jcenter">
<div class="mr-6">
<el-select v-model="currentLandInfoId" placeholder="请选择地块" @change="handleLandChange">
<el-option
v-for="landInfo in landInfos"
:key="landInfo.value"
:label="landInfo.label"
:value="landInfo.value"
/>
</el-select>
</div>
<div>
<el-button class="mr-10" @click="openSelectEnvType">选择想要展示的环境信息</el-button>
</div>
</div>
<div v-if="showECharts" id="envDataECharts" style="width: 100%; height: 500px;">
</div>
<div slot="empty" v-if="!showECharts">
<EmptyTable />
</div>
<div class="setting-title flex-jcenter">
<div style="font-size: 20px; margin-left: 10px;">监控列表</div>
</div>
<el-tabs @tab-click="handleMonitorChange" tab-position="left" style="height: 600px;" v-if="showMonitorList">
<el-tab-pane
:label="item.monitorPoints"
v-for="item in deviceInfo.monitorObj[currentLandInfoId]"
:key="item.monitorCode"
>
<!--
<video :src="item.url" ></video>-->
<Monitor v-if="currentMonitorCode == item.monitorCode" :monitorUrl="item.url" :playerId="item.monitorCode" @refresh="refreshMonitorList"/>
</el-tab-pane>
</el-tabs>
<div slot="empty" v-if="!showMonitorList">
<EmptyTable />
</div>
</div>
<!-- ///////////////////////////////////////// 农事活动 ///////////////////////////////////////// -->
<div class="app-container-search main-bgcolor main-radius setting-container">
<div class="setting-title flex-jcenter">
<div class="">
<span class="mr-6">农事活动</span>
</div>
<el-button @click="openSelectPlan">选择地块计划</el-button>
</div>
<el-collapse>
<el-collapse-item v-for="(item, index) in farmingPlans" :key="index" :name="index">
<template #title>
<div class="info-setting-title">
<span style="display: flex; width: 190px;">
<el-input v-model="item.linkName" @click.native.stop="" />
</span>
<div style="flex: 1;"></div>
<div style="display: flex;align-items: center;">
<div>
<span class="fs-12 mr-6" >扫码展示</span>
<el-switch v-model="item.scanShow" @change="changePlanScanShow($event, index)" @click.native.stop="" :active-value="true" :inactive-value="false"></el-switch>
</div>
<el-button slot="reference" type="text" class="mlr-10" @click="farmingPlans.splice(index, 1)" @click.native.stop="">删除</el-button>
</div>
</div>
</template>
<div style="margin-top: 10px;">
<el-form ref="form" label-width="80px">
<el-row :gutter="40">
<el-col :span="5">
<el-form-item label="地块编码:">
<el-input disabled v-model="item.operateDetails[0].content"></el-input>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="计划编号:">
<el-input disabled v-model="item.operateDetails[1].content"></el-input>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="种植时间:">
<el-input disabled v-model="item.operateDetails[2].content"></el-input>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="采收时间:">
<el-input disabled v-model="item.operateDetails[3].content"></el-input>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="说明:">
<el-input v-model="item.operateDetails[4].content"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table :data="item.tableData" style="width: 100%">
<el-table-column prop="jobType" label="任务类型">
<template slot-scope="{ row }">
<el-input v-model="row.jobType" placeholder="请输入任务类型"></el-input>
</template>
</el-table-column>
<el-table-column prop="inputsName" label="农资名称">
<template slot-scope="{ row }">
<el-input v-model="row.inputsName" placeholder="请输入农资名称"></el-input>
</template>
</el-table-column>
<el-table-column prop="inputsBatchId" label="农资批次编号">
<template slot-scope="{ row }">
<div class="flex-acenter">
<el-tooltip class="item" effect="dark" :content="row.inputsBatchId" placement="top">
<span class="more-width-full">{{ row.inputsBatchId }}</span>
</el-tooltip>
</div>
</template>
</el-table-column>
<el-table-column prop="jobDate" label="作业日期">
<template slot-scope="{ row }">
<div class="flex-acenter">
<!-- <span>{{ row.jobDate }}</span> -->
<el-input v-model="row.jobDate" placeholder="请输入作业日期"></el-input>
</div>
</template>
</el-table-column>
<el-table-column prop="jobWorker" label="作业员工">
<template slot-scope="{ row }">
<div class="flex-acenter">
<!-- <span>{{ row.jobWorker }}</span> -->
<el-input v-model="row.jobWorker" placeholder="请输入作业员工"></el-input>
</div>
</template>
</el-table-column>
<el-table-column prop="remarks" label="图片">
<template v-slot="{ row }">
<div class="flex-acenter">
<div v-if="row.jobImage" @click="openPreviewImage(row.jobImage)">查看</div>
<div v-if="!row.jobImage">-</div>
</div>
</template>
</el-table-column>
<el-table-column prop="remarks" label="视频">
<template v-slot="{ row }">
<div class="flex-acenter">
<div v-if="row.jobVideo" @click="openPreviewVideo(row.jobVideo)">查看</div>
<div v-if="!row.jobVideo">-</div>
</div>
</template>
</el-table-column>
<el-table-column prop="remarks" label="说明">
<template v-slot="{ row }">
<div class="flex-acenter">
<el-input v-model="row.remarks" placeholder="请输入"></el-input>
</div>
</template>
</el-table-column>
<el-table-column label="扫码展示">
<template v-slot="{ row }">
<el-switch v-model="row.scanShow"></el-switch>
</template>
</el-table-column>
<el-table-column label="操作">
<template v-slot="{ $index }">
<el-button @click="item.tableData.splice($index, 1) && item.farmingJobs.splice($index, 1)" type="text" size="small">删除</el-button>
</template>
</el-table-column>
<div slot="empty">
<EmptyTable />
</div>
</el-table>
</div>
</el-collapse-item>
</el-collapse>
<div v-if="farmingPlans && farmingPlans.length == 0">
<EmptyTable />
</div>
</div>
<!-- ///////////////////////////////////////// 商品认证 ///////////////////////////////////////// -->
<div class="app-container-search main-bgcolor main-radius setting-container">
<div class="setting-title flex-jcenter">
<div class="">商品认证</div>
<div class="">
<el-button class="mr-10" @click="openImportGoodsVerify">导入商品认证</el-button>
</div>
</div>
<el-table :data="goodsVerifys" style="width: 100%">
<el-table-column prop="verifyName" label="认证名称">
<template v-slot="{ row }">
<el-input v-model="row.verifyName" placeholder="请输入认证名称"></el-input>
</template>
</el-table-column>
<el-table-column prop="verifyAgencies" label="认证机构">
<template v-slot="{ row }">
<el-input v-model="row.verifyAgencies" placeholder="请输入认证机构"></el-input>
</template>
</el-table-column>
<el-table-column prop="verifyDate" label="有效期">
<template v-slot="{ row }">
<el-input v-model="row.verifyDate" placeholder="请输入有效期"></el-input>
</template>
</el-table-column>
<el-table-column prop="verifyDataUrl" label="认证资料" >
<template v-slot="{ row }">
<template v-if="row.verifyDataUrl != '--'">
<el-image
style="width: 60px; height: 60px;margin: 5px;"
v-for="(item, index) in row.verifyDataUrl"
:key="index"
:src="item"
:preview-src-list="row.verifyDataUrl"
fit="fill"></el-image>
</template>
<template v-else>
<span>{{row.verifyDataUrl}}</span>
</template>
</template>
</el-table-column>
<el-table-column label="扫码展示">
<template v-slot="{ row }">
<el-switch v-model="row.scanShow" :active-value="true" :inactive-value="false"></el-switch>
</template>
</el-table-column>
<el-table-column label="操作">
<template v-slot="{$index}">
<!--
<el-popconfirm title="确定删除吗?" @confirm="deleteVerify($index)">
<el-button slot="reference" type="text" size="small">删除</el-button>
</el-popconfirm>
-->
<el-button slot="reference" type="text" size="small" @click="deleteVerify($index)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- ///////////////////////////////////////// 检验检疫 ///////////////////////////////////////// -->
<div class="app-container-search main-bgcolor main-radius setting-container">
<div class="setting-title flex-jcenter">
<div class="">
<span class="mr-6">检验检疫</span>
</div>
<el-button @click="openSelectInspection" >选择检验检疫</el-button>
</div>
<el-collapse>
<el-collapse-item v-for="(item, index) in inspections" :key="index" :name="index">
<template #title>
<div class="info-setting-title">
<span style="display: flex; width: 190px;">
<el-input v-model="item.linkName" @click.native.stop="" />
</span>
<div style="display: flex;align-items: center;">
<div>
<span class="fs-12 mr-6" >扫码展示</span>
<el-switch v-model="item.scanShow" @change="changeInspectionScanShow($event, index)" @click.native.stop="" :active-value="true" :inactive-value="false"></el-switch>
</div>
<el-button slot="reference" type="text" class="mlr-10" @click="inspections.splice(index, 1)" @click.native.stop="">删除</el-button>
</div>
</div>
</template>
<div style="margin-top: 10px;">
<operateInfo
:operateDetails.sync="item.operateDetails"
:typeList="typeList"
/>
<el-table :data="item.tableData" style="width: 100%; margin: 10px 0px;">
<el-table-column prop="inspectionItem" label="检验项目">
<template v-slot="{ row }">
<el-input v-model="row.inspectionItem" placeholder="请输入检验项目"></el-input>
</template>
</el-table-column>
<el-table-column prop="inspectionUnit" label="单位">
<template v-slot="{ row }">
<el-input v-model="row.inspectionUnit" placeholder="请输入单位"></el-input>
</template>
</el-table-column>
<el-table-column prop="inspectionRequire" label="技术要求">
<template v-slot="{ row }">
<el-input v-model="row.inspectionRequire" placeholder="请输入技术要求"></el-input>
</template>
</el-table-column>
<el-table-column prop="inspectionResult" label="检测结果">
<template v-slot="{ row }">
<el-input v-model="row.inspectionResult" placeholder="请输入检测结果"></el-input>
</template>
</el-table-column>
<el-table-column prop="inspectionConclusion" label="单项结论">
<template v-slot="{ row }">
<el-input v-model="row.inspectionConclusion" placeholder="请输入单项结论"></el-input>
</template>
</el-table-column>
<el-table-column label="扫码展示">
<template v-slot="{ row }">
<el-switch v-model="row.scanShow"></el-switch>
</template>
</el-table-column>
<el-table-column label="操作">
<template v-slot="{ $index }">
<el-button @click="item.tableData.splice($index, 1) && item.inspectionItems.splice($index, 1)" type="text" size="small">删除</el-button>
</template>
</el-table-column>
<div slot="empty">
<EmptyTable />
</div>
</el-table>
</div>
</el-collapse-item>
</el-collapse>
<div v-if="inspections.length == 0">
<EmptyTable />
</div>
</div>
<!-- ///////////////////////////////////////// 环节信息 ///////////////////////////////////////// -->
<div class="app-container-search main-bgcolor main-radius setting-container">
<div class="setting-title flex-jcenter">
<div class="">环节信息</div>
<div class="">
<el-button class="" @click="linksExport">溯源环节导出</el-button>
<el-button class="mr-10" @click="linksImport">溯源环节导入</el-button>
<el-select
v-model="templateId"
class="mr-10"
placeholder="选择模板">
<el-option :value="item.templateId" :label="item.templateName" v-for="(item, index) in templateList" :key="index"></el-option>
</el-select>
<el-button type="info" plain :disabled="!templateId" @click="importModel">导入模板</el-button>
<el-button class="mr-10" type="primary" @click="saveModel">保存为模板</el-button>
</div>
</div>
<el-collapse>
<el-collapse-item v-for="(item, index) in linkInfos" :key="index" :name="index">
<template #title>
<div class="info-setting-title">
<span style="display: flex; width: 190px;">
<el-input v-model="item.linkName" @click.native.stop="" />
</span>
<div style="display: flex;align-items: center; margin-right: 10px;">
<div>
<span class="fs-12 mr-6" >扫码展示</span>
<el-switch v-model="item.scanShow" :active-value="true" :inactive-value="false" @click.native.stop=""></el-switch>
</div>
<el-button slot="reference" type="text" class="mlr-10" @click="linkInfos.splice(index, 1)" @click.native.stop="">删除</el-button>
<div class="flex-col flex-allcenter">
<i class="el-icon-caret-top operate-icon" @click="tempSerial(linkInfos, index)" @click.stop="" :class="[index!=0?'operate-active':'']"></i>
<i class="el-icon-caret-bottom operate-icon" @click="downtempSerial(linkInfos, index)" @click.stop="" :class="[linkInfos.length != 1 && linkInfos.length - 1 != index ?'operate-active':'']"></i>
</div>
</div>
</div>
</template>
<div style="margin-top: 10px;">
<operateInfo
:operateDetails.sync="item.operateDetails"
:typeList="typeList"
:type="'links'"
/>
</div>
</el-collapse-item>
</el-collapse>
<div slot="empty" v-if="linkInfos && linkInfos.length == 0">
<EmptyTable />
</div>
<div class="setting-btn-area" @click="addLink">
<i style="font-size: 14px;" class="el-icon-plus"></i>
<div class="buttonText">添加环节</div>
</div>
</div>
<!-- ///////////////////////////////////////// 企业信息 ///////////////////////////////////////// -->
<div class="app-container-search main-bgcolor main-radius setting-container">
<div class="setting-title flex-jcenter">
<div class="">企业信息</div>
<div class="">
<el-button class="mr-10" @click="openImportBusinessInfo">导入企业信息</el-button>
</div>
</div>
<div class="setting-title flex-jcenter" v-if="businessInfo">
<div class="mr-6">
<el-input v-model="businessInfo.linkName" />
</div>
<div>
<span class="fs-12 mr-6" >扫码展示</span>
<el-switch v-model="businessInfo.scanShow" :active-value="true" :inactive-value="false"></el-switch>
<el-button slot="reference" type="text" class="mlr-10" @click="businessInfo = null">删除</el-button>
</div>
</div>
<operateInfo
v-if="businessInfo"
:operateDetails.sync="businessInfo.operateDetails"
:typeList="typeList"
/>
</div>
<div class="setting-footer-btn">
<el-button @click="$router.go(-1);">取消</el-button>
<el-button type="primary" @click="submitSave">保存</el-button>
</div>
<!-- 选择商品/企业信息弹窗 -->
<el-dialog
v-if="selectOperateVisible"
title="导入信息"
:visible.sync="selectOperateVisible"
width="600px" append-to-body
>
<SelectOperateView :tableData="selectOperateTableData" :typeList="typeList" :selectedOperateDetails.sync="selectedOperateDetails"/>
<div slot="footer" class="dialog-footer">
<el-button @click="selectOperateVisible = false">取 消</el-button>
<el-button type="primary" @click="submitImport">确 定</el-button>
</div>
</el-dialog>
<!-- 选择环境数据类型弹窗 -->
<el-dialog class="add-dialog" title="环境类型" v-if="selectEnvTypeVisible" :visible.sync="selectEnvTypeVisible" width="900px" append-to-body>
<Transfer
ref="envTypeTransfer"
:data="canSelectEnvTypeOptions"
:vModel="envTypeCheckedIdList"
:renderContent="renderEnvTypeLabel"
:titles="['可选', '已选']"
@change="handleSelectEnvTypeChange"
/>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitSelectEnvType">确 定</el-button>
<el-button @click="selectEnvTypeVisible = false">取 消</el-button>
</div>
</el-dialog>
<!-- 选择认证信息弹窗 -->
<el-dialog
v-if="selectVerifyVisible"
title="认证信息"
:visible.sync="selectVerifyVisible"
width="900px" append-to-body
>
<SelectVerifyView :tableData="selectVerifyTableData" :selectedGoodsVerifys.sync="selectedGoodsVerifys"/>
<div slot="footer" class="dialog-footer">
<el-button @click="selectVerifyVisible = false">取 消</el-button>
<el-button type="primary" @click="submitGoodsVerifyImport">确 定</el-button>
</div>
</el-dialog>
<!-- 选择检验检疫弹窗 -->
<el-dialog
v-if="selectInspectionVisible"
title="检验检疫信息"
:visible.sync="selectInspectionVisible"
width="900px" append-to-body
>
<SelectInspectionView :tableData="selectInspectionTableData" :selectedInspection.sync="selectedInspection"/>
<div slot="footer" class="dialog-footer">
<el-button @click="selectInspectionVisible = false">取 消</el-button>
<el-button type="primary" @click="submitInspectionImport">确 定</el-button>
</div>
</el-dialog>
<!-- 溯源环节上传 -->
<el-dialog
title="溯源环节上传"
:visible.sync="templateImportVisible"
width="600px"
>
<el-upload
class="upload-demo"
drag
:limit="fileLimit"
:auto-upload="false"
:before-upload="handleBeforeUpload"
:on-exceed="handleExceed"
:on-change="handleChange"
:file-list="fileList"
:action="uploadFileUrl">
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<div class="el-upload__tip" slot="tip">只能上传json文件且不超过500kb</div>
</el-upload>
</el-dialog>
<!-- 环节保存为模板 -->
<el-dialog
title="保存为模板"
:visible.sync="templateVisible"
width="600px"
>
<el-form
ref="templateForm"
:model="templateForm"
:rules="templateRules"
label-position="top"
label-width="100px">
<el-form-item label="模板名称" prop="linkName">
<el-input v-model="templateForm.linkName"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="templateVisible = false">取 消</el-button>
<el-button type="primary" @click="submitSaveTemp">确 定</el-button>
</span>
</el-dialog>
<!-- 选择计划弹窗 -->
<el-dialog class="add-dialog" title="地块计划信息列表" v-if="selectPlanVisible" :visible.sync="selectPlanVisible" width="1200px" append-to-body>
<Transfer
ref="transfer"
:data="planOptions"
:vModel="inputCheckedIdList"
:renderContent="renderTransferLabel"
:titles="['可选', '已选']"
@change="handleSelectChange"
/>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitTransferForm">确 定</el-button>
<el-button @click="selectPlanVisible = false">取 消</el-button>
</div>
</el-dialog>
<el-dialog class="add-dialog" title="查看图片" :visible.sync="previewImageVisible" width="600px" append-to-body>
<ImageUpload v-model="imageList" :disabled="true"></ImageUpload>
<div slot="footer" class="dialog-footer">
<el-button @click="previewImageVisible = false">取 消</el-button>
</div>
</el-dialog>
<el-dialog class="add-dialog" title="查看视频" :visible.sync="previewVideoVisible" width="600px" append-to-body>
<VideoUpload v-model="videoList" :value="videoList" :disabled="true"></VideoUpload>
<div slot="footer" class="dialog-footer">
<el-button @click="previewVideoVisible = false"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import * as echarts from 'echarts';
import { Loading } from 'element-ui';
import { getByGoodsId } from '@/api/basic/goodsInfo';
import { getBusinessInfo } from '@/api/basic/businessInfo';
import { getGoodsVerifyByGoodsId } from '@/api/basic/goodsVerify';
import { getHarvestBatchConfig, updateHarvestBatchConfig } from '@/api/production/harvestBatch';
import { getTempListGoodsId , copyToTemplate , getTemplateDetail } from '@/api/configure/traceTemplate';
import { exportLinkConfig } from '@/api/product/harvestBatch';
import { getDictDataListByType } from '@/api/system/dict/data';
import { getLandPlanByGoodsId, getLandFarmingConfig } from '@/api/product/landPlan';
import { getInspectionByHarvestBatchId } from '@/api/production/inspection';
import { getAvailableEnvType, getEnvTypeConfigGroupByLandId } from '@/api/iot/envType';
import { getAVGEnvDatasByTypeIds } from '@/api/iot/envData';
import { getBusinessNamesByLandId } from '@/api/product/landInfo';
import { getMonitorPreviewURLByLandId } from '@/api/iot/deviceInfo';
import { getLanguageType } from "@/api/system/languageType";
import { getUniTemplateOptions } from '@/api/configure/uniTemplate';
import operateInfo from '@/components/Customer/operateInfo2';
import SelectOperateView from './selectOperateView';
import SelectVerifyView from './selectVerifyView';
import SelectInspectionView from './selectInspectionView';
import EmptyTable from '@/components/EmptyTable';
import Transfer from '@/components/Customer/Transfer';
import ImageUpload from '@/components/ImageUpload';
import VideoUpload from '@/components/VideoUpload';
import Monitor from '@/components/Monitor';
const getXDayAgo = (dayNum) => {
const dates = [];
// 获取当前日期
const now = new Date();
// 循环获取最近 dayNum 天的日期
for (let i = dayNum - 1; i >= 0; i--) {
// 获取当前日期的时间戳
const timestamp = now.getTime();
// 计算 i 天前的时间戳
const dayTimestamp = 24 * 60 * 60 * 1000; // 一天的毫秒数
const iDayAgoTimestamp = timestamp - i * dayTimestamp;
// 转换为日期对象
const date = new Date(iDayAgoTimestamp);
// 格式化日期为 "yyyy-MM-dd" 的字符串并存入数组
const year = date.getFullYear();
const month = ("0" + (date.getMonth() + 1)).slice(-2);
const day = ("0" + date.getDate()).slice(-2);
dates.push(year + "-" + month + "-" + day);
}
return dates;
}
export default {
components: {
operateInfo,
SelectOperateView,
SelectVerifyView,
SelectInspectionView,
EmptyTable,
Transfer,
ImageUpload,
VideoUpload,
Monitor,
},
data() {
return {
languageTypeId: null,
languageType: {},
uniTemplateOptions: [],
// 采收批次配置信息
harvestBatchConfig: {},
businessInfo: null,
// businessInfo: {
// linkName: '企业信息',
// scanShow: true,
// },
goodsInfo: {
linkName: '商品信息',
scanShow: true,
},
goodsVerifys: [],
linkInfos: [],
farmingPlans: [],
inspections: [],
typeList: [],// 操作明细类型
// 设备信息
deviceInfo: {
srcEnvTypes: {},
envTypes: {}, // 当前的环境类型 { landId:[envTypeList] }
envDatasObj: {}, // 显示的环境数据 { typeId:[envDatas] }
monitorObj: {}, // 监控集合 { landId:[monitorList] }
},
landInfos: [],
currentLandInfoId: null,
selectEnvTypeVisible: false,
canSelectEnvTypeOptions: [], // 可选的环境类型集合
envTypeCheckedIdList: [],
envDataLoading: false,
showECharts: false, // 是否显示图表
showMonitorList: false,
// 图表实例对象
echartsInstance: null,
// 图表配置信息
eChartsOption: {
title: {
text: '环境数据信息',
},
tooltip: {
trigger: 'axis',
show: true
},
legend: {
left: '25%',
top: '1%',
data: [],
},
// x轴
xAxis: {
type: 'category',
data: getXDayAgo(7), // 每格的下标
},
// y轴
yAxis: {},
series: [
{
data: [],
type: 'line',
smooth: true
}
]
},
currentMonitorCode: null,
// 显示选择操作明细窗口
selectOperateVisible: false,
importType: 'goodsInfo',
selectOperateTableData: [],
selectedOperateDetails: [],
// 认证信息窗口
selectVerifyVisible: false,
selectVerifyTableData: [],
selectedGoodsVerifys: [],
// 选择检验信息窗口
selectInspectionVisible: false,
selectInspectionTableData: [],
selectedInspection: [],
// 环节模板列表
templateList: [],
// 当前选择的模板id
templateId:'',
// 环节导入弹窗
templateImportVisible: false,
// 模板保存弹窗
templateVisible: false,
// 模板保存表单
templateForm: {},
// 模板保存校验规则 rules
templateRules: {
linkName: [
{ required: true, message: '请输入环节名称', trigger: 'change' }
],
},
// 上传文件参数
fileList: [],
fileSize: 0.5,
fileLimit: 1,
fileType: ['json'],
uploadFileUrl: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload", // 请求地址
// 查看图片弹窗
previewImageVisible: false,
// 查看视频弹窗
previewVideoVisible: false,
// 选择计划弹窗
selectPlanVisible: false,
// 计划选项列表
planOptions: [],
// 已选中的地块列表【临时】,只在弹窗时作为临时存放用
inputCheckedIdList: [],
imageList: [],
videoList: [],
openImage: false,
openVideo: false,
}
},
created() {
const { query: { id, typeId } } = this.$route;
this.languageTypeId = typeId;
this.getHarvestBatchConfig(id, typeId);
this.initDate();
},
methods: {
async initDate() {
const typeParams = {
page: 1,
pageSize: 100,
type: 'operate_detail_type',
};
const { data } = await getDictDataListByType(typeParams);
this.typeList = data;
// 请求语言类型
const res = await getLanguageType(this.languageTypeId);
if (!res.data) {
this.$message.error('所选语言类型不存在或已删除');
return;
}
this.languageType = res.data;
getUniTemplateOptions().then(({ data: options }) => {
this.uniTemplateOptions = options;
});
},
getHarvestBatchConfig(id, languageTypeId) {
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
getHarvestBatchConfig(id, languageTypeId).then(({ data, data: { belongBusinessId, goodsId, businessInfo, goodsInfo, goodsVerifys, linkInfos, farmingPlans, inspections, } }) => {
this.harvestBatchConfig = {
...data,
id,
}
// 企业信息
if(businessInfo !== null) {
const operateDetails = businessInfo.operateDetails?.map(detail => {
if(detail.type == 7 || detail.type == 10) {
detail.content = JSON.parse(detail.content);
detail.mapContent = detail.content;
}
return detail;
});
this.businessInfo = {
...businessInfo,
operateDetails,
};
}
// 商品信息
if(goodsInfo !== null) {
const operateDetails = goodsInfo.operateDetails?.map(detail => {
if(detail.type == 7 || detail.type == 10) {
detail.content = JSON.parse(detail.content);
detail.mapContent = detail.content;
}
return detail;
});
this.goodsInfo = {
...goodsInfo,
operateDetails,
};
}
// 商品认证
this.goodsVerifys = goodsVerifys.map(verify => {
const { operateDetails } = verify;
return {
...verify,
verifyName: operateDetails[0].content,
verifyAgencies: operateDetails[1].content,
verifyDate: operateDetails[2].content,
verifyDataUrl: operateDetails[3].content.split(','),
};
});
// 环节
this.linkInfos = linkInfos.map(item => {
const { operateDetails } = item;
operateDetails.map(items=>{
if(items.type == 7 || items.type == 10) {
items.content = JSON.parse(items.content);
items.mapContent = items.content;
}
});
return {
...item,
isExpand: false,
operateDetails,
}
});
// 农事计划
this.farmingPlans = farmingPlans.map((item, index)=>{
item.isExpand = false;
if(index == 0) item.isExpand = true;
// item.scanShow = true;
item.tableData = [];
item.farmingJobs?.map((job, index) => {
job.indexKey = index;
// job.scanShow = true;
item.tableData.push({
jobType: job.operateDetails[0].content,
inputsName: job.operateDetails[1].content,
inputsBatchId: job.operateDetails[2].content,
jobDate: job.operateDetails[3].content,
jobWorker: job.operateDetails[4].content,
jobImage: job.operateDetails[5].content,
jobVideo: job.operateDetails[6].content,
remarks: job.operateDetails[7].content,
scanShow: job.scanShow,
indexKey: index,
});
});
return item;
});
// 检验检疫
this.inspections = inspections.map((item, index)=>{
item.isExpand = false;
if(index == 0) item.isExpand = true;
item.operateDetails?.map(detail => {
if(detail.type == 7 || detail.type == 10) {
detail.content = JSON.parse(detail.content);
detail.mapContent = detail.content;
}
});
item.tableData = [];
item.inspectionItems?.map((iItem, index) => {
iItem.indexKey = index;
item.tableData.push({
inspectionItem: iItem.operateDetails[0].content,
inspectionUnit: iItem.operateDetails[1].content,
inspectionRequire: iItem.operateDetails[2].content,
inspectionResult: iItem.operateDetails[3].content,
inspectionConclusion: iItem.operateDetails[4].content,
scanShow: iItem.scanShow,
indexKey: index,
});
});
return item;
});
loading.close();
// 查询模板
this.getTraceTemplate(goodsId);
// 查询地块列表
this.getLandInfoList(belongBusinessId);
}).catch(() => {
loading.close();
});
},
// 获得环节模板下拉列表
getTraceTemplate(goodsId) {
getTempListGoodsId({ goodsId }).then(({ data }) => {
this.templateList = data;
});
},
// 打开导入商品信息的窗口
openImportGoodsInfo() {
if(this.harvestBatchConfig.goodsId === undefined) {
return;
}
// 查询商品信息
getByGoodsId({ goodsId: this.harvestBatchConfig.goodsId }).then(({ data }) => {
const { id, goodsName, goodsType, unitName, shelfLife, goodsImgUrl } = data;
this.goodsInfo.operateObjId = id;
this.importType = 'goodsInfo';
this.selectOperateTableData = [
{
title: '商品名称',
type: 3,
content: goodsName,
},
{
title: '分类',
type: 3,
content: goodsType,
},
{
title: '单位',
type: 3,
content: unitName,
},
{
title: '保质期',
type: 3,
content: shelfLife + ' 天',
},
{
title: '图片',
type: 1,
content: goodsImgUrl,
},
]
this.selectOperateVisible = true;
});
},
// 打开导入企业信息的窗口
openImportBusinessInfo() {
if(this.harvestBatchConfig.belongBusinessId === undefined) {
return;
}
// 查询企业信息
getBusinessInfo(this.harvestBatchConfig.belongBusinessId).then(({ data }) => {
const { id, businessName, area, companiesName, businessCode, legalName, legalIdCard } = data;
if (this.businessInfo == null) {
this.businessInfo = {
linkName: '企业信息',
scanShow: true,
};
}
this.businessInfo.operateObjId = id;
this.importType = 'businessInfo';
this.selectOperateTableData = [
{
title: '商户名称',
type: 3,
content: businessName,
},
{
title: '所属行政区',
type: 3,
content: area,
},
{
title: '企业名称',
type: 3,
content: companiesName,
},
{
title: '统一社会信用代码',
type: 3,
content: businessCode,
},
{
title: '法人名称',
type: 3,
content: legalName,
},
{
title: '法人身份证',
type: 3,
content: legalIdCard,
},
]
this.selectOperateVisible = true;
});
},
// 确认导入商品/企业信息
submitImport() {
this[this.importType].operateDetails = this.selectedOperateDetails.map(detail => detail);
this.selectOperateVisible = false;
this.selectedOperateDetails = [];
},
// 打开导入商品认证的窗口
openImportGoodsVerify() {
if(this.harvestBatchConfig.goodsId === undefined) {
return;
}
// 查询认证信息
getGoodsVerifyByGoodsId(this.harvestBatchConfig.goodsId).then(({ data }) => {
this.selectVerifyTableData = data.map(({ id, verifyName, verifyAgencies, verifyIsForver, verifyStartTime, verifyEndTime, verifyDataUrl }) => {
return {
verifyName,
verifyAgencies,
verifyDataUrl: verifyDataUrl.split(','),
verifyDate: verifyIsForver ? `${verifyStartTime} ~ 长期` : `${verifyStartTime} ~ ${verifyEndTime}`,
scanShow: true,
operateObjId: id,
}
});
this.selectVerifyVisible = true;
});
},
submitGoodsVerifyImport() {
this.goodsVerifys = this.selectedGoodsVerifys.map(detail => detail);
this.selectVerifyVisible = false;
this.selectedGoodsVerifys = [];
},
// 删除商品认证
deleteVerify(index) {
this.goodsVerifys.splice(index, 1);
},
// 查询地块列表
getLandInfoList(belongBusinessId) {
getBusinessNamesByLandId({ belongBusinessId }).then(({ data }) => {
this.landInfos = data.map(item => {
return {
label: item.landName,
value: item.landId,
}
});
// 默认选中第一个
this.currentLandInfoId = data[0]?.landId;
// 查询环境类型配置
this.getEnvTypeConfig(belongBusinessId);
// 查询监控列表
this.getMonitorList();
});
},
// 地块改变
handleLandChange(value) {
const envTypes = this.deviceInfo.envTypes[value];
// this.deviceInfo.envTypes[this.currentLandInfoId]
if(envTypes && envTypes.length > 0) {
// 获取环境数据
this.gatAVGEnvDatas(envTypes.map(item => item.id).join(','));
} else {
this.showECharts = false;
// 销毁原来的实例
this.echartsInstance?.dispose();
this.echartsInstance = null;
}
// 重置监控列表的显示
this.showMonitorList = false;
// 获得监控列表
this.getMonitorList();
},
// 获得环境类型配置信息
getEnvTypeConfig(businessInfoId) {
getEnvTypeConfigGroupByLandId({ businessInfoId }).then(({ data }) => {
data.map(item => {
this.deviceInfo.envTypes[item.landId] = item.envTypes;
this.deviceInfo.srcEnvTypes[item.landId] = item.envTypes;// 保存一份未更改之前的类型数据
});
if(this.deviceInfo.envTypes[this.currentLandInfoId] && this.deviceInfo.envTypes[this.currentLandInfoId].length > 0) {
// 获得第一页的环境数据
this.gatAVGEnvDatas(this.deviceInfo.envTypes[this.currentLandInfoId].map(item => item.id).join(','));
}
});
},
// 打开选择环境类型的窗口
openSelectEnvType() {
if(this.currentLandInfoId == null) {
this.$modal.msgError('请先选择地块');
return;
}
// 获得可选的环境类型
getAvailableEnvType({ businessInfoId: this.harvestBatchConfig.belongBusinessId }).then(({ data }) => {
// 穿梭框可选列表
this.canSelectEnvTypeOptions = data.map(item => {
return {
...item,
key: item.id,
label: item.envTypeName, // 用于搜索
}
});
// 默认选中的数据
this.envTypeCheckedIdList = this.deviceInfo.envTypes[this.currentLandInfoId]?.map(item => item.id) || [];
this.selectEnvTypeVisible = true;
});
},
// 渲染选择环境类型穿梭框的选择列表
renderEnvTypeLabel(h, option) {
return <div style="display:flex;align-item: center;">
<span title={ option.envTypeName } style="display: inline-block;min-width: 180px;max-width: 180px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">{ option.envTypeName }</span>
<span style='color: #e6ebf5;display: inline-block;margin:0 5px;'>|</span>
<span style="display: inline-block;min-width: 80px;max-width: 80px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">{ option.unit }</span>
</div>;
},
/**
* 选择环境类型的穿梭框改变
* @param {*} value 已选中的值[数组]
* @param {*} direction 移动方向 leftright
* @param {*} movedKeys 移动的key数组
*/
handleSelectEnvTypeChange(value) {
this.envTypeCheckedIdList = value;
},
// 确认选择环境类型
submitSelectEnvType() {
this.selectEnvTypeVisible = false;
const srcSelectedIds = this.deviceInfo.envTypes[this.currentLandInfoId]?.map(item => item.id);
if(this.envTypeCheckedIdList.length === 0) {
// 清空环境数据
this.deviceInfo.envDatasObj = {};
// 将当前选择的地块的环境类型清空
if(this.deviceInfo.envTypes[this.currentLandInfoId]) {
this.deviceInfo.envTypes[this.currentLandInfoId] = [];
}
} else {
// 将环境类型更新为用户选择的集合
this.deviceInfo.envTypes[this.currentLandInfoId] = this.canSelectEnvTypeOptions.filter(option => this.envTypeCheckedIdList.indexOf(option.id) != -1);
let isDifferent = false;
if(!srcSelectedIds || srcSelectedIds.length != this.deviceInfo.envTypes[this.currentLandInfoId].length) {
isDifferent = true;
} else {
// 对比每个id
isDifferent = this.deviceInfo.envTypes[this.currentLandInfoId].filter(item => srcSelectedIds.indexOf(item.id) == -1).length > 0;
}
// 获取环境数据
if(isDifferent) this.gatAVGEnvDatas(this.envTypeCheckedIdList.join(','));
}
},
// 获得环境数据
gatAVGEnvDatas(typeIds) {
// 环境数据的请求时间可能较长,所以这里加个遮罩
this.envDataLoading = true;
// 根据选择环境类型id 请求环境数据, 不传天数默认7天
const params = {
landId: this.currentLandInfoId,
typeIds,
}
getAVGEnvDatasByTypeIds(params).then(({ data }) => {
this.deviceInfo.envDatasObj = {};
typeIds.split(',').map(id => {
this.deviceInfo.envDatasObj[id] = []; // 初始化所选的每种环境数据的数据值
});
data.map(item => {
this.deviceInfo.envDatasObj[item.envTypeId].push(item);
});
this.envDataLoading = false;
this.testEnvDatasObj();
this.echartsInstance?.dispose();// 销毁原来的实例
this.echartsInstance = null;
if(this.showECharts){
// 如果显示,则开始渲染
this.rendECharts();
}
});
},
//检验环境数据是否合法,并改变是否显示图表的状态
testEnvDatasObj() {
const envTypes = this.deviceInfo.envTypes[this.currentLandInfoId];
if(!envTypes) {
this.showECharts = false;
return;
}
for(let i = 0; i < envTypes.length; i++) {
if(this.deviceInfo.envDatasObj[envTypes[i].id]) {
this.showECharts = true;
return;
}
}
this.showECharts = false;
},
// 渲染图表
rendECharts() {
// 设置
this.eChartsOption.legend.data = this.deviceInfo.envTypes[this.currentLandInfoId].map(item => item.envTypeName);
// 设置数值
this.eChartsOption.series = this.deviceInfo.envTypes[this.currentLandInfoId].map(item => {
// 设置每种类型的数值
const data = [];
const { data: dateDatas } = this.eChartsOption.xAxis;
const envDatasObj = this.deviceInfo.envDatasObj[item.id];
// 可能存在空值的情况
if(envDatasObj) {
dateDatas.map((date, index) => {
envDatasObj.map(env => {
const envDate = new Date(env.createTime);
if(this.parseTime(envDate).substr(0, 10) == date) {
data.push(env.value);
}
});
if(data.length != index + 1) {
data.push('0');// 如果取不到,这里直接补位
}
});
} else {
dateDatas.map(() => {
data.push('0');
});
}
return {
name: item.envTypeName,
data,
type: 'line',
smooth: true
}
});
// 延时加载图表避免dom未刷新获取不到
setTimeout(() => {
// 初始化图表
const chartDom = document.getElementById('envDataECharts');
this.echartsInstance = echarts.init(chartDom);
this.echartsInstance.setOption(this.eChartsOption);
}, 50);
},
// 获得监控列表
getMonitorList() {
if(!this.deviceInfo.monitorObj[this.currentLandInfoId]) {
// hls
getMonitorPreviewURLByLandId({ landId: this.currentLandInfoId, type: 'wss' }).then(({ data }) => {
this.deviceInfo.monitorObj[this.currentLandInfoId] = data;
if(data.length > 0) {
this.showMonitorList = true;
}
this.currentMonitorCode = data[0]?.monitorCode;
});
} else {
// 修改当前监控列表到当前地块
if(this.deviceInfo.monitorObj[this.currentLandInfoId].length > 0) {
this.showMonitorList = true;
}
this.currentMonitorCode = this.deviceInfo.monitorObj[this.currentLandInfoId][0]?.monitorCode;
}
},
// 重新刷新监控列表
refreshMonitorList() {
getMonitorPreviewURLByLandId({ landId: this.currentLandInfoId, type: 'wss' }).then(({ data }) => {
this.deviceInfo.monitorObj = {};
this.deviceInfo.monitorObj[this.currentLandInfoId] = data;
// this.$set(this.deviceInfo.monitorObj, this.currentLandInfoId, data);
if(data.length > 0) {
this.showMonitorList = true;
}
});
},
handleMonitorChange({ index }) {
this.currentMonitorCode = this.deviceInfo.monitorObj[this.currentLandInfoId][index].monitorCode;
},
addLink() {
this.linkInfos.push({
isExpand: false,
linkName: '新建环节',
operateDetails: [],
scanShow: true,
});
},
//向上移动 list是一个数组index是当前的索引值
tempSerial(list, index) {
if(list.length == 1 ) return;
if (index != 0) {
list[index] = list.splice(index - 1, 1, list[index])[0]
}
// else {
// list.push(list.shift())
// }
},
//向下移动 list是一个数组index是当前的索引值
downtempSerial(list, index) {
if(list.length == 1 && list.length-1 == index) return;
if (index != list.length - 1) {
list[index] = list.splice(index + 1, 1, list[index])[0]
}
// else {
// list.unshift(list.splice(index, 1)[0])
// }
},
// 环节导出
async linksExport() {
let rest = await exportLinkConfig({id: this.$route.query.id});
this.$download.json(JSON.stringify(rest),'环节信息.json');
},
// 环节导入
linksImport(){
this.templateImportVisible = true;
},
// 导入模板
async importModel() {
const { data } = await getTemplateDetail({templateId: this.templateId});
data.map((item, index)=>{
item.isExpand = false;
if(index == 0) item.isExpand = true;
item.id = null;
item.isChainState = 0;
item.chainState = 0;
item.operateDetails = JSON.parse(JSON.stringify( item.traceLinkItems ));
item.operateDetails && item.operateDetails.map(items=>{
if(items.type == 7){
items.content = JSON.parse(items.content);
items.mapContent = items.content;
}
});
});
this.linkInfos = this.linkInfos.concat(data);
},
// 保存为模板
saveModel(){
this.templateVisible = true;
},
// 验证links是否可提交
checkSubmit(){
let isName = false;//环节名称是否存在空值
// let isId = false;//环节是否存在id有则更新无则创建
let isContent = false;//类似是否存在空值
let isTitle = false;//类型为5或6时为无标类型标题可为空其他类型标题不能为空。
let isDate = false;//环节内数据不能为空
const list = this.linkInfos;
if(list.length > 0){
list.map((item,index)=>{
item.sort = index+1;
if(item.linkName == '') isName = true;
// if(item.id) isId = true;
if(item.operateDetails.length==0) isDate = true;
item.operateDetails.length && item.operateDetails.map(items=>{
if( !items.type ) isContent = true;
if( items.type != 5 && items.type != 6 && !items.title ) isTitle = true;
//地图
if(items.type == '7') items.content = JSON.stringify(items.mapContent);
});
});
}else{
this.$message.error("环节数据不能为空");
return false;
}
if(isName){
this.$message.error("环节名称不能为空");
return false;
}
if(isContent){
this.$message.error("环节数据类型不能为空");
return false;
}
if(isTitle){
this.$message.error("环节数据标题不能为空");
return false;
}
if(isDate){
this.$message.error("环节内数据不能为空");
return false;
}
return true;
},
// 提交模板保存
submitSaveTemp(){
this.$refs['templateForm'].validate(async (valid) => {
if (valid) {
let state = await this.checkSubmit();
console.log('保存模板-状态是否符合', state);
if(state){
let links = JSON.parse(JSON.stringify(this.linkInfos));
links.map(item=>{
item.linkItems = item.operateDetails;
});
let form = {
belongBusinessId: this.harvestBatchConfig.belongBusinessId,
goodsId: this.harvestBatchConfig.goodsId,
links,
templateName: this.templateForm.linkName,
};
let res = await copyToTemplate(form);
if(res.data){
this.$message.success("保存模板成功");
this.templateVisible = false;
this.templateForm = {};
}
console.log('保存模板结果', res);
}
}
});
},
// ------------------------ 导入模板相关事件 ------------------------
// 导入模板本质不经过接口,前端直接读取文件内容,覆盖本地模板
// 上传前校检格式和大小
handleBeforeUpload(file) {
// 校检文件类型
if (this.fileType) {
let fileExtension = "";
if (file.name.lastIndexOf(".") > -1) {
fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
}
const isTypeOk = this.fileType.some((type) => {
if (file.type.indexOf(type) > -1) return true;
if (fileExtension && fileExtension.indexOf(type) > -1) return true;
return false;
});
if (!isTypeOk) {
this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`);
return false;
}
}
// 校检文件大小
if (this.fileSize) {
const isLt = file.size / 1024 / 1024 < this.fileSize;
if (!isLt) {
this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);
return false;
}
}
return true;
},
// 文件个数超出
handleExceed() {
this.$modal.msgError(`上传文件数量不能超过 ${this.fileLimit} 个!`);
},
// 模板 文件改变
handleChange(file, fileList){
if(fileList.length > 0) {
let files = fileList[0].raw;
let reader = new FileReader();
reader.readAsText(files,'UTF-8');
let that = this;
reader.onload = function(e) {
let val = JSON.parse(e.target.result);
val.map((item, index) => {
item.isExpand = false;
if(index == 0) item.isExpand = true;
item.chainState = 0;
item.isChainState = 0;
item.operateDetails.length > 0 && item.operateDetails.map(items => {
if(items.type == 7) {
items.content = JSON.parse(items.content);
items.mapContent = items.content;
}
});
});
that.templateImportVisible = false;
that.linkInfos = val;
}
}
},
// 打开选择地块计划弹窗
openSelectPlan() {
getLandPlanByGoodsId({ goodsId: this.harvestBatchConfig.goodsId }).then(({ data }) => {
this.planOptions = data.map(item => {
return {
...item,
key: item.id,
label: item.landName,
};
});
this.selectPlanVisible = true;
});
},
// 渲染选择计划穿梭框的选择列表
renderTransferLabel(h, option) {
return <div style="display:flex;align-item: center;">
<span title={ option.landId } style="display: inline-block;min-width: 80px;max-width: 80px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">{ option.landId }</span>
<span style='color: #e6ebf5;display: inline-block;margin:0 5px;'>|</span>
<span>{ option.landName }</span>
<span style='color: #e6ebf5;display: inline-block;margin:0 5px;'>|</span>
<span title={ option.landPlanId } style="display: inline-block;min-width: 40px;max-width: 80px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">{ option.landPlanId }</span>
<span style='color: #e6ebf5;display: inline-block;margin:0 5px;'>|</span>
<span>{ this.parseTime(option.planStartTime, '{y}-{m}-{d}') }</span>
<span style='color: #e6ebf5;display: inline-block;margin:0 5px;'>|</span>
<span>{ this.parseTime(option.planEndTime, '{y}-{m}-{d}') }</span>
</div>;
},
/**
*
* @param {*} value 已选中的值[数组]
* @param {*} direction 移动方向 leftright
* @param {*} movedKeys 移动的key数组
*/
handleSelectChange(value) {
this.inputCheckedIdList = value;
},
// 修改农事计划的扫码展示
changePlanScanShow(value, index){
this.farmingPlans[index].scanShow = value;
},
// 查看视频
openPreviewVideo(list) {
this.videoList = list;
this.previewVideoVisible = true;
},
// 查看图片
openPreviewImage(list){
this.imageList = list;
this.previewImageVisible = true;
},
// 确认选择农事计划
async submitTransferForm() {
const { data } = await getLandFarmingConfig({
goodsId: this.harvestBatchConfig.goodsId,
ids: this.inputCheckedIdList.join(','),
});
this.selectPlanVisible = false;
this.farmingPlans = data.map((item, index)=>{
item.isExpand = false;
if(index == 0) item.isExpand = true;
item.scanShow = true;
item.tableData = [];
item.farmingJobs.map((job, index) => {
job.indexKey = index;
job.scanShow = true;
item.tableData.push({
jobType: job.operateDetails[0].content,
inputsName: job.operateDetails[1].content,
inputsBatchId: job.operateDetails[2].content,
jobDate: job.operateDetails[3].content,
jobWorker: job.operateDetails[4].content,
jobImage: job.operateDetails[5].content,
jobVideo: job.operateDetails[6].content,
remarks: job.operateDetails[7].content,
scanShow: true,
indexKey: index,
});
});
return item;
});
},
// 修改计划的展开状态
changePlanExpand(index) {
this.farmingPlans = this.farmingPlans.map((plan, i) => {
return {
...plan,
isExpand: index == i ? !plan.isExpand : plan.isExpand,
}
});
},
// 修改检验检疫的展开状态
changeInspectionExpand(index) {
this.inspections = this.inspections.map((inspection, i) => {
return {
...inspection,
isExpand: index == i ? !inspection.isExpand : inspection.isExpand,
}
});
},
// 修改检验检疫的是否展示
changeInspectionScanShow(value, index) {
this.inspections[index].scanShow = value;
},
// 打开选择检验检疫的窗口
openSelectInspection() {
if(this.harvestBatchConfig.harvestBatchId === undefined) {
return;
}
// 查询检验检疫信息
getInspectionByHarvestBatchId(this.harvestBatchConfig.harvestBatchId).then(({ data }) => {
this.selectInspectionTableData = data.map(item => {
return {
...item,
inspectionImgUrl: item.inspectionImgUrl?item.inspectionImgUrl.split(','):'--',
inspectionVideoUrl: item.inspectionVideoUrl?item.inspectionVideoUrl:'--',
}
});
this.selectInspectionVisible = true;
});
},
// 选择想要配置的检验检疫
submitInspectionImport() {
this.inspections = this.selectedInspection.map((inspection, index) => {
const operateDetails = [
{
title: "入库批次",
type: 3,
content: inspection.harvestBatchId,
scanShow: true,
},
{
title: "生产时间",
type: 3,
content: this.parseTime(inspection.harvestTime),
scanShow: true,
},
{
title: "执行标准",
type: 3,
content: inspection.inspectionStandard,
scanShow: true,
},
{
title: "检验结果",
type: 3,
content: inspection.inspectionResult,
scanShow: true,
},
{
title: "自检检测项目",
type: 3,
content: inspection.inspectionOwnItem,
scanShow: true,
},
{
title: "检测人",
type: 3,
content: inspection.inspectionUser,
scanShow: true,
},
{
title: "委托检测项目",
type: 3,
content: inspection.inspectionEntrustItem,
scanShow: true,
},
{
title: "检测机构",
type: 3,
content: inspection.inspectionOrganization,
scanShow: true,
},
{
title: "检测日期",
type: 3,
content: this.parseTime(inspection.inspectionDate),
scanShow: true,
},
{
title: "签发日期",
type: 3,
content: this.parseTime(inspection.issuanceDate),
scanShow: true,
},
{
title: "检测图片",
type: 1,
content: inspection.inspectionImgUrl == '--' ? '' : inspection.inspectionImgUrl.join(','),
scanShow: true,
},
{
title: "检测视频",
type: 2,
content: inspection.inspectionVideoUrl == '--' ? '' : inspection.inspectionVideoUrl,
scanShow: true,
},
];
const tableData = [];
const inspectionItems = inspection.inspectionItems?.map((item, iIndex) => {
const itemOperateDetails = [
{
title: "检验项目",
type: 3,
content: item.inspectionItem,
scanShow: true,
},
{
title: "单位",
type: 3,
content: item.inspectionUnit,
scanShow: true,
},
{
title: "技术要求",
type: 3,
content: item.inspectionRequire,
scanShow: true,
},
{
title: "检测结果",
type: 3,
content: item.inspectionResult,
scanShow: true,
},
{
title: "单项结论",
type: 3,
content: item.inspectionConclusion,
scanShow: true,
},
];
tableData.push({
...item,
scanShow: true,
});
return {
operateObjId: item.id,
scanShow: true,
linkName: '检验项目',
sort: iIndex,
operateDetails: itemOperateDetails,
};
});
return {
operateObjId: inspection.id,
scanShow: true,
isExpand: index === 0,
linkName: '检验检疫',
sort: index,
operateDetails,
tableData,
inspectionItems,
};
});
this.selectInspectionVisible = false;
this.selectedInspection = [];
},
// 保存
submitSave() {
const { id, templateId } = this.harvestBatchConfig;
const { id: languageTypeId } = this.languageType;
if (!languageTypeId) {
this.$message.error('未找到语言类型');
return false;
}
if (!templateId) {
this.$message.error('请选择模板');
return false;
}
const goodsInfo = {
...this.goodsInfo,
operateDetails: this.goodsInfo.operateDetails?.filter(item => item.type !== '').map((item, index) => {
if(item.type == 7 || item.type == 10){//地图
item.content = JSON.stringify(item.mapContent);
}
item.sort = index;
return item;
}),
}
let businessInfo = null;
if (this.businessInfo) {
businessInfo = {
...this.businessInfo,
operateDetails: this.businessInfo.operateDetails?.filter(item => item.type !== '').map((item, index) => {
if(item.type == 7 || item.type == 10){//地图
item.content = JSON.stringify(item.mapContent);
}
item.sort = index;
return item;
}),
}
}
const linkInfos = this.linkInfos.map(link => {
return {
...link,
operateDetails: link.operateDetails?.filter(item => item.type !== '').map((item, index) => {
if(item.type == 7 || item.type == 10){//地图
item.content = JSON.stringify(item.mapContent);
}
item.sort = index;
return item;
})
}
});
if(!goodsInfo.linkName || !goodsInfo.operateDetails || goodsInfo.operateDetails.length === 0){
this.$message.error('商品信息不能为空');
return false;
}
// if(!businessInfo.linkName || !businessInfo.operateDetails || businessInfo.operateDetails.length === 0){
// this.$message.error('企业信息不能为空');
// return false;
// }
const goodsVerifys = this.goodsVerifys.map((item, index) => {
const operateDetails = item.operateDetails || [
{
title: "认证名称",
type: 3,
content: item.verifyName,
},
{
title: "认证机构",
type: 3,
content: item.verifyAgencies,
},
{
title: "有效期",
type: 3,
content: item.verifyDate,
},
{
title: "认证资料",
type: 1,
content: item.verifyDataUrl && item.verifyDataUrl.join(','),
},
];
operateDetails.map((detail, i) => {
if (detail.title === "认证名称") {
detail.content = item.verifyName;
}
if (detail.title === "认证机构") {
detail.content = item.verifyAgencies;
}
if (detail.title === "有效期") {
detail.content = item.verifyDate;
}
detail.sort = i;
});
return {
...item,
linkName: '商品认证',
sort: index,
operateDetails,
};
});
const inspections = this.inspections.map((inspection, index) => {
const operateDetails = inspection.operateDetails?.filter(item => item.type !== '').map(item => {
if(item.type == 7 || item.type == 10){//地图
item.content = JSON.stringify(item.mapContent);
}
return item;
});
const { tableData, } = inspection;
const inspectionItems = inspection.inspectionItems?.map((item, iIndex) => {
item.operateDetails.map((detail, i) => {
if (detail.title === "检验项目") {
detail.content = tableData[iIndex].inspectionItem;
}
if (detail.title === "单位") {
detail.content = tableData[iIndex].inspectionUnit;
}
if (detail.title === "技术要求") {
detail.content = tableData[iIndex].inspectionRequire;
}
if (detail.title === "检测结果") {
detail.content = tableData[iIndex].inspectionResult;
}
if (detail.title === "单项结论") {
detail.content = tableData[iIndex].inspectionConclusion;
}
detail.sort = i;
})
return {
...item,
scanShow: inspection.tableData[iIndex].scanShow,
};
}) || [];
return {
...inspection,
sort: index,
operateDetails,
inspectionItems,
};
});
const farmingPlans = this.farmingPlans.map((plan, index) => {
const { tableData, } = plan;
const farmingJobs = plan.farmingJobs?.map((item, iIndex) => {
item.operateDetails.map((detail, i) => {
if (detail.title === '说明') {
detail.content = tableData[iIndex].remarks;
}
if (detail.title === "任务类型") {
detail.content = tableData[iIndex].jobType;
}
if (detail.title === "投入品名称") {
detail.content = tableData[iIndex].inputsName;
}
if (detail.title === "作业日期") {
detail.content = tableData[iIndex].jobDate;
}
if (detail.title === "作业员工") {
detail.content = tableData[iIndex].jobWorker;
}
detail.sort = i;
});
return {
...item,
scanShow: tableData[iIndex].scanShow,
};
});
return {
...plan,
sort: index,
farmingJobs,
};
});
const envTypeConfigs = [];
this.landInfos?.map((land, index) => {
this.deviceInfo.envTypes[land.value]?.map(item => {
const { configId, id, } = item;
const srcEnvTypes = this.deviceInfo.srcEnvTypes[land.value]?.filter(src => src.id == id);
envTypeConfigs.push({
id: configId || srcEnvTypes ? srcEnvTypes[0]?.configId : null,
landId: land.value,
envTypeId: id,
});
});
});
const params = {
id,
languageTypeId,
templateId,
businessInfo,
goodsInfo,
goodsVerifys,
linkInfos,
farmingPlans,
inspections,
envTypeConfigs,
};
const loading = Loading.service({ text: '加载中...', target: '.setting-main' });
updateHarvestBatchConfig(params).then(({}) => {
this.$message.success('保存成功');
// 重新查询
this.getHarvestBatchConfig(id, languageTypeId);
}).finally(() => {
loading.close();
});
},
},
};
</script>
<style>
</style>