From e8c0ee20186dd4fd13b1284c6184d07763a0a748 Mon Sep 17 00:00:00 2001 From: shishuaikang <280848880@qq.com> Date: 星期二, 05 十二月 2023 17:54:55 +0800 Subject: [PATCH] 大屏web和h5提交 --- web/src/views/MixingInfo/mixRatio.vue | 22 web/src/views/GoodManage/MixingScreen.vue | 566 ++++++++++++++++++++++------ web/src/views/MixingInfo/mixing.vue | 11 web/src/views/GoodManage/MixRatioScreen.vue | 568 ++++++++++++++++++++++++++++ web/src/api/modules/materials.js | 26 + 5 files changed, 1,056 insertions(+), 137 deletions(-) diff --git a/web/src/api/modules/materials.js b/web/src/api/modules/materials.js index 8fa250e..e21807a 100644 --- a/web/src/api/modules/materials.js +++ b/web/src/api/modules/materials.js @@ -235,5 +235,31 @@ checkGetLists: params => // 修改回显 axios.post('/materials/embedmentCorrection/inventoryList', params), }, + /* 配合比屏管理 */ + mixRatioSrcreen: { + getLists: params => + axios.post('/materials/materialRelease/mixingConsumeList', params), + insert: params => + axios.post('/materials/materialRelease/mixingConsumeIn', params), + update: params => + axios.post('/materials/materialRelease/mixingConsumeUp', params), + delete: params => + axios.post('/materials/materialRelease/mixingConsumeDel', params), + getScreenNames: params => + axios.get('/materials/materialRelease/mixingConsumePull', { params }), + }, + /* 拌合站屏管理 */ + mixingSrcreen: { + getLists: params => + axios.post('/materials/materialRelease/siloMixingList', params), + insert: params => + axios.post('/materials/materialRelease/mixingInsert', params), + update: params => + axios.post('/materials/materialRelease/mixingUpdate', params), + delete: params => + axios.post('/materials/materialRelease/mixingDel', params), + getScreenNames: params => + axios.get('/materials/materialRelease/siloPull', { params }), + }, } diff --git a/web/src/views/GoodManage/MixRatioScreen.vue b/web/src/views/GoodManage/MixRatioScreen.vue index 74753ca..74f6fb2 100644 --- a/web/src/views/GoodManage/MixRatioScreen.vue +++ b/web/src/views/GoodManage/MixRatioScreen.vue @@ -1,11 +1,571 @@ +<!-- 物资管理 ==> 配合比屏管理--> <template> - <div>222222222222222</div> + <div class="main"> + <div class="main_header"> + <div class="header_item"> + <span class="header_label">配和比屏:</span> + <el-select size="mini" v-model="queryInfo.mixingSignboardId" placeholder="请选择配和比屏" clearable> + <el-option v-for="item in selects.screenNames" :key="item.value" :label="item.label" + :value="item.value"></el-option> + </el-select> + </div> + <!-- <div class="header_item"> + <span class="header_label">录入方式:</span> + <el-select size="mini" v-model="queryInfo.stata" placeholder="请选择录入方式"> + <el-option v-for="item in selects.stata" :key="item.value" :label="item.label" :value="item.value"></el-option> + </el-select> + </div> --> + <div class="header_item"> + <span class="header_label">创建时间:</span> + <el-date-picker type="daterange" v-model="times" value-format="yyyy-MM-dd" start-placeholder="起始时间" + end-placeholder="结束时间" @change="changeTime" clear></el-date-picker> + </div> + <div class="header_item"> + <el-button icon="el-icon-search" v-permission="'search'" @click="queryReset">查询</el-button> + <el-button icon="el-icon-plus" v-permission="'insert'" @click="addRow">新增</el-button> + </div> + </div> + + <div class="main_content"> + <div class="main_content_wrap"> + <div class="table" v-for="(item, index) in tableData" :key="index"> + + <div class="row table_head"> + <div class="table_head_item"> + <span class="text title">{{ item.signboardName }}</span> + <span class="text">创建时间: {{ item.createTime }}</span> + <!-- <span class="text">录入方式: {{ item.inType }}</span> --> + </div> + <div class="table_head_item"> + <el-button v-permission="'update'" @click="updateRow(index)">修改</el-button> + <el-button v-permission="'delete'" @click="deleteRow(index)">删除</el-button> + </div> + </div> + + <div class="row"> + <div class="name">工程名称</div> + <div class="value">{{ item.proName }}</div> + </div> + + <div class="row"> + <div class="name">施工单位</div> + <div class="value">{{ item.constructionUnit }}</div> + </div> + + <div class="row aline"> + <div> + <div class="name">施工日期</div> + <div class="value">{{ item.saveStamp }}</div> + </div> + <div> + <div class="name">施工部位</div> + <div class="value">{{ item.construction }}</div> + </div> + </div> + + <div class="row" v-for="sub in item.dataLists" :key="sub.name"> + <div class="name">{{ sub.name }}</div> + <div class="column"> + <div class="column-item" v-for="(sub, index) in sub.value" :key="index">{{ sub }}</div> + </div> + </div> + + </div> + </div> + </div> + + <!-- dialog --> + <el-dialog class="prop_dialog" width="80%" v-if="isRenderDialog" :title="dialogTitle" :visible.sync="asyncVisible" + @close="closeDialog"> + <el-form ref="ruleForm" class="rule_form" :model="ruleForm" :rules="rules"> + <el-form-item label="拌合站屏:" prop="mixingSignboardId"> + <el-select size="mini" v-model="ruleForm.mixingSignboardId" :disabled="isUpdate" placeholder="请选择拌合站屏" + @change="changeSelectForm($event)"> + <el-option v-for="item in selects.screenNames" :key="item.value" :label="item.label" + :value="item.value"></el-option> + </el-select> + </el-form-item> + <el-form-item label="工程名称:" prop="proName"> + <el-input v-model="ruleForm.proName" size="mini" placeholder="请输入工程名称" clearable disabled></el-input> + </el-form-item> + <el-form-item label="施工单位:" prop="constructionUnit"> + <el-input v-model="ruleForm.constructionUnit" size="mini" placeholder="请输入施工单位" clearable></el-input> + </el-form-item> + <el-row> + <el-col :span="12"> + <el-form-item label="施工日期:" prop="saveStamp"> + <el-date-picker v-model="ruleForm.saveStamp" size="mini" value-format="yyyy-MM-dd" placeholder="请输入施工日期" + clearable></el-date-picker> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="施工部位:" prop="construction"> + <el-input v-model="ruleForm.construction" size="mini" placeholder="请输入施工部位" clearable></el-input> + </el-form-item> + </el-col> + </el-row> + + <el-button style="margin: 0 0 20px 130px;" @click="addFormCol">添加材料</el-button> + + <div style="display: flex;"> + <div style="margin-right: 10px;" v-for="(item, index) in ruleForm.infos " :key="index"> + <el-form-item :label="index === 0 ? '材料名称' : ''" :prop="`infos.${index}.dictId`"> + <el-select v-model="item.dictId" size="mini" placeholder="请选择材料名称"> + <el-option v-for="item in selects.materials" :key="item.value" :label="item.label" + :value="item.value"></el-option> + </el-select> + </el-form-item> + <el-form-item :label="index === 0 ? '规格型号' : ''" :prop="`infos.${index}.spec`"> + <el-input v-model="item.spec" size="mini" placeholder="请输入" clearable></el-input> + </el-form-item> + <el-form-item :label="index === 0 ? '生产厂家' : ''" :prop="`infos.${index}.manufacturer`"> + <el-input v-model="item.manufacturer" size="mini" placeholder="请输入" clearable></el-input> + </el-form-item> + <el-form-item :label="index === 0 ? '材料含水率(%)' : ''" :prop="`infos.${index}.watFull`"> + <el-input v-model="item.watFull" size="mini" placeholder="请输入" clearable></el-input> + </el-form-item> + <el-form-item :label="index === 0 ? '理论用量(kg/m³)' : ''" :prop="`infos.${index}.planAmnt`"> + <el-input v-model="item.planAmnt" size="mini" placeholder="请输入" clearable></el-input> + </el-form-item> + <el-form-item :label="index === 0 ? '实际用量(kg/m³)' : ''" :prop="`infos.${index}.factAmnt`"> + <el-input v-model="item.factAmnt" size="mini" placeholder="请输入" clearable></el-input> + </el-form-item> + </div> + </div> + + </el-form> + <div slot="footer"> + <el-button @click="asyncVisible = false">取 消</el-button> + <el-button class="submit_btn" @click="onSubmit('ruleForm')">提 交</el-button> + </div> + </el-dialog> + + </div> </template> - <script> +export default { + data() { + return { + loading: false, + isRenderDialog: false, + asyncVisible: false, + submitMode: '', // add update + times: [], // 时间范围 + selects: { + screenNames: [], // 配合比屏 + materials: [] // 材料名称 + }, // 下拉框状态选择汇总 + tableData: [{ + inType: '', // 录入方式 + mixingSignboardId: '', // 屏id + createTime: '', // 创建时间 + signboardName: '', // 标识排 + proName: '', // 工程名称 + constructionUnit: '', // 施工单位 + saveStamp: '', // 施工日期 + construction: '', // 施工部位 + mixingConsumeId: '', // 每个材料id + dataLists: [ + {name: '材料名称', type: 'dictName', value: []}, // 材料名称 + {name: '规格型号', type: 'spec', value: []}, // 规格型号 + {name: '生产厂家', type: 'manufacturer', value: []}, // 生产厂家 + {name: '材料含水率(%)', type: 'watFull', value: []}, // 含水率 + {name: '理论用量(kg/m³)', type: 'planAmnt', value: []}, // 理论用量 + {name: '实际用量(kg/m³)', type: 'factAmnt', value: []}, // 实际用量 + ], + dataListFlat: [] // 修改时赋值使用 + }], + ruleForm: { + mixingSignboardId: '', // 屏名称id + proName: '', // 工程名称 [拌合站屏下拉框联动] + constructionUnit: '', // 施工单位 + saveStamp: '', // 施工日期 + construction: '', // 施工部位 + infos: [{ + dictId: '', + spec: '', + manufacturer: '', + watFull: '', + planAmnt: '', + factAmnt: '', + }] + }, + queryInfo: { + pageNum: 1, + pageSize: 9999, + // stata: '', // 录入方式 + mixingSignboardId: '', // 拌合站屏名称 + strTime: '', + endTime: '', + }, + } + }, + computed: { + dialogTitle() { + return this.submitMode === 'update' ? '修改' : '添加' + }, + isUpdate() { + return this.submitMode === 'update' + }, + }, + created() { + this.$http = this.$api.Materials.mixRatioSrcreen + this.rawRuleFormInfos = {...this.ruleForm.infos[0]} // 原始的infos.添加材料使用 + this.selects.stata = [ // 录入方式 + {value: 1, label: '自动'}, + {value: 2, label: '手动'}, + ] + this.selects.stataMap = { + 1: '自动', + 2: '手动', + } + this.rules = { + mixingSignboardId: [{required: true, message: '请选择拌合站屏', trigger: 'change'}], + proName: [{required: true, message: '请输入工程名称', trigger: 'change'}], + constructionUnit: [{required: true, message: '请输入工程名称', trigger: 'blur'}], + saveStamp: [{required: true, message: '请输入施工日期', trigger: 'blur'}], + construction: [{required: true, message: '请输入施工部位', trigger: 'blur'}], + infos: [{ + dictId: [{required: true, message: '请输入', trigger: 'blur'}], + spec: [{required: true, message: '请输入', trigger: 'blur'}], + manufacturer: [{required: true, message: '请输入', trigger: 'blur'}], + watFull: [{required: true, message: '请输入', trigger: 'blur'}], + planAmnt: [{required: true, message: '请输入', trigger: 'blur'}], + factAmnt: [{required: true, message: '请输入', trigger: 'blur'}], + }] + } + this.getLists() + this.getScreenNames() + }, + methods: { + // 获取table列表数据 + getLists() { + this.$http.getLists(this.queryInfo).then(res => { + this.tableData = [{ + inType: '', // 录入方式 + mixingSignboardId: '', // 屏id + createTime: '', // 创建时间 + signboardName: '', // 标识排 + proName: '', // 工程名称 + constructionUnit: '', // 施工单位 + saveStamp: '', // 施工日期 + construction: '', // 施工部位 + mixingConsumeId: '', // 每个材料id + dataLists: [ + {name: '材料名称', type: 'dictName', value: []}, // 材料名称 + {name: '规格型号', type: 'spec', value: []}, // 规格型号 + {name: '生产厂家', type: 'manufacturer', value: []}, // 生产厂家 + {name: '材料含水率(%)', type: 'watFull', value: []}, // 含水率 + {name: '理论用量(kg/m³)', type: 'planAmnt', value: []}, // 理论用量 + {name: '实际用量(kg/m³)', type: 'factAmnt', value: []}, // 实际用量 + ], + dataListFlat: [] // 修改时赋值使用 + }] + if (res.statusMsg === 'ok' && res.data) { + const {list} = res.data + if (list && list.length) { + let temps = JSON.parse(JSON.stringify(this.tableData[0])) + list.forEach((item, index) => { + if (!this.tableData[index]) { + this.tableData.push(JSON.parse(JSON.stringify(temps))) + } + let {tmixingConsumes, signboardName, proName} = item + let curTableData = this.tableData[index] + curTableData.signboardName = signboardName + curTableData.proName = proName + + if (tmixingConsumes && tmixingConsumes.length) { + if (!curTableData.mixingSignboardId) { + curTableData.constructionUnit = tmixingConsumes[0].constructionUnit + curTableData.createTime = tmixingConsumes[0].createTime + curTableData.mixingSignboardId = tmixingConsumes[0].mixingSignboardId + curTableData.saveStamp = tmixingConsumes[0].saveStamp + curTableData.construction = tmixingConsumes[0].construction + } + + tmixingConsumes.forEach(item => { + curTableData.dataLists.forEach(val => { + item[val.type] && val.value.push(item[val.type]) + }) + curTableData.dataListFlat.push({ + constructionUnit: item.constructionUnit, + mixingConsumeId: item.mixingConsumeId, + dictId: item.dictId, + spec: item.spec, + manufacturer: item.manufacturer, + watFull: item.watFull, + planAmnt: item.planAmnt, + factAmnt: item.factAmnt, + star: item.star + }) + }) + } + }) + } + } + }) + }, + //获取字典表材料名称 + async getDicFilteredData() { + let params = {pageNum: 1, pageSize: 100000000} + let {data} = await this.$api.Dictionary.searchDictionary(params) + data.list.forEach(item => { + if (item.dictType === 'pipe_materials') { + this.selects.materials.push({ + label: item.dictName, + value: item.dictId, + }) + } + }) + }, + // 获取配比屏名称 + async getScreenNames() { + const params = {pageNum: 1, pageSize: 9999} + let {data} = await this.$http.getScreenNames(params) + let temps = [] + data.forEach(item => { + temps.push({ + label: item.signboardName, + value: item.mixingSignboardId, + proName: item.proName, + }) + }) + this.selects.screenNames.push(...temps) + }, + // 查询按钮列表信息 + queryReset() { + this.getLists() + }, + resetForm(formName) { + this.$refs[formName].resetFields() + + let ruleFormItem = this.ruleForm.infos[0] + let rulesItem = this.rules.infos[0] + this.ruleForm.infos = [{...ruleFormItem}] + this.rules.infos = [{...rulesItem}] + }, + showDialog() { + // eslint-disable-next-line no-async-promise-executor + return new Promise(async resolve => { + if (!this.isRenderDialog) { + this.isRenderDialog = true + } + if (!this.selects.materials.length) { + await this.getDicFilteredData() + } + this.asyncVisible = true + this.$nextTick(() => { + resolve() + }) + }) + }, + closeDialog() { + this.asyncVisible = false + this.resetForm('ruleForm') + }, + addRow() { + this.submitMode = 'add' + this.showDialog() + }, + updateRow(i) { + this.submitMode = 'update' + this.showDialog().then(() => { + const {mixingSignboardId, proName, constructionUnit, saveStamp, construction, dataListFlat} = this.tableData[i] + this.ruleForm = Object.assign(this.ruleForm, { + mixingSignboardId, + proName, + constructionUnit, + saveStamp, + construction, + infos: JSON.parse(JSON.stringify(dataListFlat)) + }) + this.changeSelectForm(mixingSignboardId) + }) + }, + deleteRow(i) { + this.$confirm("该操作将删除该信息,是否继续删除?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(() => { + let star = '' + let mixingConsumeIds = [] + this.tableData[i].dataListFlat.forEach((item, index) => { + if (index === 0) { + star = item.star + '' + } + mixingConsumeIds.push(item.mixingConsumeId) + }) + this.$http.delete({star, mixingConsumeIds}).then(res => { + if (res.statusMsg === 'ok') { + this.getLists() + this.$message.success("删除成功!") + } else { + this.$message.warning(res.statusMsg) + } + }) + }) + }, + addFormCol() { + let ruleFormItem = this.rawRuleFormInfos + let rulesItem = this.rules.infos[0] + + this.ruleForm.infos.push({...ruleFormItem}) + this.rules.infos.push({...rulesItem}) + }, + onSubmit(formName) { + this.$refs[formName].validate((valid) => { + if (!valid) return false + const {mixingSignboardId, proName, constructionUnit, saveStamp, construction, infos} = this.ruleForm + + let newInfos = JSON.parse(JSON.stringify(infos)) + newInfos.forEach(item => { + item.saveStamp = saveStamp + item.construction = construction + item.constructionUnit = constructionUnit + }) + const params = { + mixingSignboardId, + proName, + mixingConsume: newInfos + } + if (this.isUpdate) { + // 更新 + this.$http.update(params).then((res) => { + if (res.statusMsg === 'ok') { + this.closeDialog() + this.getLists() + this.$message.success('更新成功!') + } else { + this.$message.warning(res.statusMsg) + } + }) + } else { + // 添加 + this.$http.insert(params).then((res) => { + if (res.statusMsg === 'ok') { + this.closeDialog() + this.getLists() + this.$message.success('添加成功!') + } else { + this.$message.warning(res.statusMsg) + } + }) + } + }) + }, + changeTime(times) { + times = times || ['', ''] + this.queryInfo.strTime = times[0] + this.queryInfo.endTime = times[1] + }, + changeSelectForm(val) { + let item = this.selects.screenNames.find(obj => obj.value === val) + this.ruleForm.proName = item.proName + this.ruleForm.constructionUnit = item.constructionUnit + } + } +} </script> -<style lang="sass" scoped> -@import '../../style/layout-main.scss'; +<style lang="scss" scoped> +@import '@/style/layout-main.scss'; + +.main_content_wrap { + height: 100%; + overflow: auto; + + .table { + display: flex; + flex-direction: column; + font-size: 16px; + margin-bottom: 26px; + color: #fff; + + .row.table_head { + display: flex; + justify-content: space-between; + text-align: left; + color: #BEE2F0; + background: rgba(1, 142, 196, .35); + + .table_head_item { + margin: 0 20px; + + .title { + color: #39B5FE; + font-weight: bold; + } + + .text { + margin-right: 40px; + } + } + } + + .row { + flex: 1; + width: 100%; + height: 40px; + margin: 0 -1px -1px 0; + text-align: center; + line-height: 40px; + border: 1px solid #01B3EF; + + .name { + display: flex; + justify-content: center; + align-items: center; + float: left; + width: 160px; + height: 100%; + margin: -1px -1px -1px 0; + color: #BEE2F0; + border: 1px solid #01B3EF; + background: rgba(1, 142, 196, .75); + box-sizing: unset; + } + + .value { + display: flex; + justify-content: center; + align-items: center; + height: 100%; + overflow: hidden; + } + + .column { + display: flex; + height: 100%; + + .column-item { + display: flex; + justify-content: center; + align-items: center; + flex: 1; + margin: -1px -1px -1px 0; + border: 1px solid #01B3EF; + } + } + } + + .row.aline { + display: flex; + + > div { + flex: 1; + } + } + } +} + + +.rule_form { + overflow-x: hidden; + + ::v-deep .el-form-item__label { + min-width: 130px; + } +} </style> \ No newline at end of file diff --git a/web/src/views/GoodManage/MixingScreen.vue b/web/src/views/GoodManage/MixingScreen.vue index 5e6d786..0b2382f 100644 --- a/web/src/views/GoodManage/MixingScreen.vue +++ b/web/src/views/GoodManage/MixingScreen.vue @@ -1,17 +1,17 @@ -<!-- 设备管理 ==> 拌合站屏管理--> +<!-- 物资管理 ==> 拌合站屏管理--> <template> <div class="main"> <div class="main_header"> <div class="header_item"> - <span class="header_label">拌合站屏:</span> - <el-select size="mini" v-model="queryInfo.screen" placeholder="请选择拌合站屏"> - <el-option v-for="item in queryInfoScreens" :key="item.value" :label="item.label" - :value="item.value"></el-option> + <span class="header_label">拌和站屏:</span> + <el-select size="mini" v-model="queryInfo.types" placeholder="请选择拌和站屏" clearable> + <el-option v-for="item in selects.screenNames" :key="item.value" :label="item.label" + :value="item.value2"></el-option> </el-select> </div> <div class="header_item"> <span class="header_label">录入方式:</span> - <el-select size="mini" v-model="queryInfo.inmode" placeholder="请选择录入方式"> + <el-select size="mini" v-model="queryInfo.stata" placeholder="请选择录入方式" clearable> <el-option v-for="item in queryInfoInmodes" :key="item.value" :label="item.label" :value="item.value"></el-option> </el-select> @@ -19,40 +19,122 @@ <div class="header_item"> <span class="header_label">创建时间:</span> <el-date-picker type="daterange" v-model="times" value-format="yyyy-MM-dd" start-placeholder="起始时间" - end-placeholder="结束时间" @change="changeTime" clear></el-date-picker> + end-placeholder="结束时间" @change="changeTime" clearable></el-date-picker> </div> <div class="header_item"> - <el-button icon="el-icon-search" v-permission="'search'" @click="queryReset">查询</el-button> - <el-button icon="el-icon-plus" v-permission="'insert'" @click="addRow">新增</el-button> + <el-button v-permission="'search'" @click="queryReset">查询</el-button> + <el-button v-permission="'insert'" @click="addRow">新增</el-button> </div> </div> <div class="main_content"> - <div class="main_content_item" v-for="(item, index) in ['', '', '', '', '',]" :key="index"> - + <div class="main_content_wrap"> + <div class="main_content_item" v-for="(list, index) in dataLists" :key="index"> + <el-row> + <el-col :span="24 / list.length" v-for="(item, index) in list" :key="index"> + <div class="head"> + <span class="left_title">{{ item.siloName }}</span> + <span v-if="index + 1 === list.length" class="right_title">录入方式: <span style="color:#39B5FE">{{ + queryInfoInmodeMap[item.stata] }}</span></span> + </div> + <div class="list"> + <div class="item"> + <span class="name">屏幕编号:</span> + <span class="value">{{ item.types }}</span> + </div> + <div class="item"> + <span class="name">规格型号:</span> + <span class="value">{{ item.spec }}</span> + </div> + <div class="item"> + <span class="name">产地名称:</span> + <span class="value">{{ item.producer }}</span> + </div> + <div class="item"> + <span class="name">炉(批)号:</span> + <span class="value">{{ item.stove }}</span> + </div> + <div class="item"> + <span class="name">进场数量:</span> + <span class="value">{{ item.inNum }}</span> + </div> + <div class="item"> + <span class="name">进场日期:</span> + <span class="value">{{ item.inDate }}</span> + </div> + <div class="item"> + <span class="name">检验日期:</span> + <span class="value">{{ item.inspectDate }}</span> + </div> + <div class="item"> + <span class="name">检验状态:</span> + <span :class="['value', 'style' + item.inspectState]">{{ ruleFormStatuMap[item.inspectState] }}</span> + </div> + <div class="item"> + <span class="name">报告编号:</span> + <span class="value">{{ item.reportNumber }}</span> + </div> + </div> + </el-col> + </el-row> + <el-row class="foot"> + <el-button size="mini" v-permission="'delete'" @click="deleteRow(index)">删除</el-button> + <el-button size="mini" v-permission="'update'" @click="updateRow(index)">修改</el-button> + </el-row> + </div> </div> </div> - - <!-- 详情dialog --> - <el-dialog width="400px" class="prop_dialog" v-if="isRenderDialog" title="详情" :visible.sync="asyncVisible"> - - <el-form class="rule_form" label-width="auto"> - - <div class="divider"></div> - - <el-form-item label="巡检任务:">{{ info.task }}</el-form-item> - - <el-form-item label="巡检标准:">{{ info.standard }}</el-form-item> - - <el-form-item label="巡检人员:">{{ info.name }}</el-form-item> - - <div class="divider"><span>巡检路线</span></div> - - <div class="regions"> - <div class="region" v-for=" item in info.regions " :key="item.regionId">{{ - item.region }} - </div> - </div> + <!-- dialog --> + <el-dialog class="prop_dialog" v-if="isRenderDialog" :title="dialogTitle" :visible.sync="asyncVisible" + @close="closeDialog"> + <el-form ref="ruleForm" class="rule_form" :model="ruleForm" :rules="rules" label-width="auto"> + <el-form-item label="拌合站屏:" prop="name"> + <el-select size="mini" v-model="ruleForm.name" :disabled="isUpdate" placeholder="请选择拌合站屏" + @change="changeSelectForm($event)"> + <el-option v-for="item in selects.screenNames" :key="item.value" :label="item.label" + :value="item.value"></el-option> + </el-select> + </el-form-item> + <el-row :gutter="100"> + <el-col :class="'elCol elCol' + index" :span="12" v-for="(item, index) in ruleForm.infos" :key="index"> + <el-form-item label="屏幕编号:" :prop="`infos.${index}.num`"> + <el-input v-model="item.num" size="mini" disabled></el-input> + </el-form-item> + <el-form-item label="规格型号:" :prop="`infos.${index}.spec`"> + <el-input v-model="item.spec" size="mini" placeholder="请输入规格型号" clearable></el-input> + </el-form-item> + <el-form-item label="产地名称:" :prop="`infos.${index}.producer`"> + <el-input v-model="item.producer" size="mini" placeholder="请输入产地名称" clearable></el-input> + </el-form-item> + <el-form-item label="炉(批)号:" :prop="`infos.${index}.stove`"> + <el-input v-model="item.stove" size="mini" placeholder="请输入炉(批)号" clearable></el-input> + </el-form-item> + <el-form-item label="进场数量:" :prop="`infos.${index}.inNum`"> + <el-input v-model="item.inNum" size="mini" placeholder="请输入进场数量" clearable></el-input> + </el-form-item> + <el-form-item label="进场日期:" :prop="`infos.${index}.inDate`"> + <el-date-picker v-model="item.inDate" size="mini" value-format="yyyy-MM-dd" placeholder="请选择检验日期" + clearable></el-date-picker> + </el-form-item> + <el-form-item label="检验日期:" :prop="`infos.${index}.inspectDate`"> + <el-date-picker v-model="item.inspectDate" size="mini" value-format="yyyy-MM-dd" placeholder="请选择检验日期" + clearable></el-date-picker> + </el-form-item> + <el-form-item label="检验状态:" :prop="`infos.${index}.inspectState`"> + <el-select v-model="item.inspectState" size="mini" placeholder="请选择检验状态" clearable> + <el-option v-for="item in ruleFormStatus" :key="item.value" :label="item.label" + :value="item.value"></el-option> + </el-select> + </el-form-item> + <el-form-item label="报告编号:" :prop="`infos.${index}.reportNumber`"> + <el-input v-model="item.reportNumber" size="mini" placeholder="请输入报告编号" clearable></el-input> + </el-form-item> + </el-col> + </el-row> </el-form> + <div slot="footer"> + <el-button @click="asyncVisible = false">取 消</el-button> + <el-button class="submit_btn" @click="onSubmit('ruleForm')">提 交</el-button> + </div> </el-dialog> </div> @@ -64,75 +146,270 @@ loading: false, isRenderDialog: false, asyncVisible: false, - - info: { // 详情信息 - task: '', - standard: '', - name: '', - regions: [], + submitMode: '', // add update + dataLists: [], // [[],[],[]] + selects: { + screenNames: [], // 拌合站屏 + screenNameIds: {}, // 拌合站屏id map + }, // 下拉框状态选择汇总 + ruleForm: { + name: '', // 下拉框屏名称 + mixingIds: '', // 修改id [] + infos: [{ + material: '', // 原料名称 + siloId: '', // 屏幕编号id + num: '', // 屏幕编号 + spec: '', + producer: '', + stove: '', + inNum: '', + inDate: '', + inspectDate: '', + inspectState: '', + reportNumber: '', + }, { + material: '', + siloId: '', // 屏幕id + num: '', // 屏幕编号 + spec: '', + producer: '', + stove: '', + inNum: '', + inDate: '', + inspectDate: '', + inspectState: '', + reportNumber: '', + }] }, - userId: '', // 存储点击后的用户id - taskId: '', // 存储点击后的巡检任务id times: [], // 时间范围 + total: '', queryInfo: { pageNum: 1, - pageSize: 10, - inmode: '', // 录入方式 - screen: '', // 拌合站屏 - startTime: '', + pageSize: 9999, + stata: '', // 录入方式 + types: '', // 拌合站屏 + strTime: '', endTime: '', }, - regionInfos: { // 巡检路线详情 - isRenderDialog: false, - asyncVisible: false, - time: '', // 巡检时间 - region: '', // 巡检区域 - res: '', // 巡检结果 - img: '', // 上传的图片 - location: '', // 位置 - } } }, + computed: { + dialogTitle() { + return this.submitMode === 'update' ? '修改' : '添加' + }, + isUpdate() { + return this.submitMode === 'update' + }, + }, beforeCreate() { + this.rules = { + name: [{required: true, message: '请选择拌合站屏', trigger: 'change'}], + infos: [{ + num: [{required: true, message: '请输入', trigger: 'blur'}], + spec: [{required: true, message: '请输入', trigger: 'blur'}], + producer: [{required: true, message: '请输入', trigger: 'blur'}], + stove: [{required: true, message: '请输入', trigger: 'blur'}], + inNum: [{required: true, message: '请输入', trigger: 'blur'}], + inDate: [{required: true, message: '请输入', trigger: 'blur'}], + inspectDate: [{required: true, message: '请输入', trigger: 'blur'}], + inspectState: [{required: true, message: '请选择', trigger: 'blur'}], + reportNumber: [{required: true, message: '请输入', trigger: 'blur'}], + }, { + spec: [{required: true, message: '请输入', trigger: 'blur'}], + producer: [{required: true, message: '请输入', trigger: 'blur'}], + stove: [{required: true, message: '请输入', trigger: 'blur'}], + inNum: [{required: true, message: '请输入', trigger: 'blur'}], + inDate: [{required: true, message: '请输入', trigger: 'blur'}], + inspectDate: [{required: true, message: '请输入', trigger: 'blur'}], + inspectState: [{required: true, message: '请选择', trigger: 'blur'}], + reportNumber: [{required: true, message: '请输入', trigger: 'blur'}], + }] + } + this.queryInfoInmodes = [ - {value: '0', label: '手动'}, - {value: '1', label: '自动'}, + {value: 1, label: '自动'}, + {value: 2, label: '手动'}, ] - this.queryInfoScreens = [ - {value: '0', label: '1-1'}, - {value: '1', label: '1-2'}, + this.queryInfoInmodeMap = { + 1: '自动', + 2: '手动', + } + this.ruleFormStatus = [ + {value: 1, label: '合格'}, + {value: 2, label: '不合格'}, + {value: 3, label: '待检测'}, ] - this.$http = this.$api.Safety.RiskGrad.polling + this.ruleFormStatuMap = { + 1: '合格', + 2: '不合格', + 3: '待检测', + } + this.$http = this.$api.Materials.mixingSrcreen }, created() { - this.setTableColumn() this.getLists() + this.getScreenNames() }, methods: { - // 获取table列表数据 + // 获取table列表数据 [types相同的放一个数组] getLists() { let params = this.queryInfo this.loading = true - this.$http.taskcardGetlists(params).then(res => { - if (res.statusMsg === 'ok') { - console.log(res) + this.$http.getLists(params).then(res => { + if (res.statusMsg === 'ok' && res.data) { + let tempMap = {} + res.data.forEach(item => { + if (!tempMap[item.types]) { + tempMap[item.types] = [] + } + tempMap[item.types].push({...item}) + }) + this.dataLists = Object.values(tempMap) } this.loading = false }) }, - // 初始化 table 配置 - setTableColumn() { + // 获取配比屏名称 + async getScreenNames() { + const params = {pageNum: 1, pageSize: 9999} + let {data} = await this.$http.getScreenNames(params) + + let tempIds = {} + let tempTypes = {} + data.forEach(item => { + if (!tempIds[item.siloId]) { + tempIds[item.siloId] = {...item} + } + + if (!tempTypes[item.types]) { + tempTypes[item.types] = [] + } + tempTypes[item.types].push({...item}) + }) + + let temps = [] + Object.values(tempTypes).forEach(list => { + let value = '' + let label = '' + let type = '' + list.forEach((item, index) => { + value += item.siloId + ((index + 1) === list.length ? '' : ';') + label += item.siloName + ((index + 1) === list.length ? '' : ';') + type = item.types + }) + temps.push({ + label: label, + value: value, + value2: type, + }) + }) + + this.selects.screenNames.push(...temps) + this.selects.screenNameIds = tempIds }, - addRow() { }, // 查询按钮列表信息 queryReset() { - this.queryInfo.pageNum = 1 - this.queryInfo.pageSize = 10 this.getLists() + }, + resetForm(formName) { + this.$refs[formName].resetFields() + }, + showDialog() { + return new Promise(resolve => { + if (!this.isRenderDialog) { + this.isRenderDialog = true + } + + this.asyncVisible = true + + this.$nextTick(() => { + resolve() + }) + }) + }, + closeDialog() { + this.asyncVisible = false + this.resetForm('ruleForm') + }, + addRow() { + this.submitMode = 'add' + this.showDialog() + }, + updateRow(i) { + this.submitMode = 'update' + this.showDialog().then(() => { + let mixingIds = [] + let nameIds = '' + this.dataLists[i].forEach((item, index) => { + nameIds += item.siloId + ((index + 1) === this.dataLists[i].length ? '' : ';') + mixingIds.push(item.siloId) + this.ruleForm.infos[index] = Object.assign(this.ruleForm.infos[index], this.dataLists[i][index]) + }) + this.ruleForm.name = nameIds + this.ruleForm.mixingIds = mixingIds + this.changeSelectForm(nameIds) + }) + }, + deleteRow(i) { + this.$confirm("该操作将删除该信息,是否继续删除?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(() => { + let mixingIds = [] + this.dataLists[i].forEach(item => { + mixingIds.push(item.mixingId) + }) + this.$http.delete({mixingIds: mixingIds}).then(res => { + if (res.statusMsg === 'ok') { + this.getLists() + this.$message.success("删除成功!") + } else { + this.$message.warning(res.statusMsg) + } + }) + }) + }, + onSubmit(formName) { + this.$refs[formName].validate((valid) => { + if (!valid) return false + const params = {mixingList: this.ruleForm.infos} + if (this.isUpdate) { + // 更新 + this.$http.update(params).then((res) => { + if (res.statusMsg === 'ok') { + this.closeDialog() + this.getLists() + this.$message.success('更新成功!') + } else { + this.$message.warning(res.statusMsg) + } + }) + } else { + // 添加 + this.$http.insert(params).then((res) => { + if (res.statusMsg === 'ok') { + this.closeDialog() + this.getLists() + this.$message.success('添加成功!') + } else { + this.$message.warning(res.statusMsg) + } + }) + } + }) + }, + changeSelectForm(value) { + let ids = value && value.split(';') + ids.forEach((item, index) => { + this.ruleForm.infos[index].siloId = item + this.ruleForm.infos[index].material = this.selects.screenNameIds[item].siloName + this.ruleForm.infos[index].num = this.selects.screenNameIds[item].types + }) }, changeTime(times) { times = times || ['', ''] - this.queryInfo.startTime = times[0] + this.queryInfo.strTime = times[0] this.queryInfo.endTime = times[1] }, } @@ -142,61 +419,108 @@ <style lang="scss" scoped> @import '@/style/layout-main.scss'; -.rule_form { - color: #fff; - - ::v-deep .el-form-item__content { - display: block; - } - - .image { - flex: none; - width: 91px; - height: 120px; - margin-right: 15px; - border-radius: 5px; - border: 1px solid #0c5983; - - img { - width: 100%; - } - } +.main_content_wrap { + height: 100%; + overflow: auto; } -.regions { - text-align: center; - - .region { - line-height: 34px; - margin-bottom: 16px; - background: rgba(56, 175, 247, .25); - cursor: pointer; - } -} - -.divider { - position: relative; - margin-bottom: 30px; - text-indent: 10px; - color: #fff; - border-left: 3px solid #18F6F8; - - &::after { - content: ""; - position: absolute; - left: 0; - bottom: -8px; - width: 100%; - padding: 20px 0; - border-bottom: 1px solid #0C4D6F; - } -} - -.main_content .main_content_item { +.main_content_item { + overflow: hidden; float: left; width: 48%; - height: 200px; margin: 1%; - border: 1px solid red; + font-size: 15px; + color: #ddd; + border: 1px solid #39B5FE; + border-radius: 5px; + + .el-row { + border: 1px solid #39B5FE; + margin: -1px; + + .el-col { + height: 100%; + margin: 0 0 0 -1px; + border-left: 1px solid #39B5FE; + } + } + + .head { + height: 40px; + margin: -1px; + line-height: 40px; + text-indent: 30px; + background: rgba(30, 95, 147, .6); + border: 1px solid #39B5FE; + + .left_title { + float: left; + } + + .right_title { + float: right; + margin-right: 10px; + } + } + + .list { + padding: 0 10px 20px 10px; + + .item { + display: flex; + flex: 1; + margin-top: 20px; + + .name { + margin-right: 8px; + text-indent: 6px; + white-space: nowrap; + } + + .value { + color: #39B5FE; + + &.style1 { + font-size: 20px; + line-height: 20px; + color: #16F849; + } + + &.style2 { + font-size: 20px; + line-height: 20px; + color: red; + } + + &.style3 { + font-size: 20px; + line-height: 20px; + color: #FF6600; + } + } + + } + } + + .foot { + height: 40px; + line-height: 40px; + text-align: center; + + .el-button { + padding: 6px 20px + } + } + + + +} + +.rule_form { + overflow-x: hidden; + + .elCol0 { + border-right: 1px solid #39B5FE; + } } </style> \ No newline at end of file diff --git a/web/src/views/MixingInfo/mixRatio.vue b/web/src/views/MixingInfo/mixRatio.vue index b4a9937..3393117 100644 --- a/web/src/views/MixingInfo/mixRatio.vue +++ b/web/src/views/MixingInfo/mixRatio.vue @@ -1,7 +1,7 @@ <template> <div class="wrap"> <div class="header"> - <div class="header_name">中铁十四局通甬站前I标管片场拌合站</div> + <div class="header_name">中铁十四局通甬站前I标管片场拌和站</div> </div> <div class="table"> <div class="row title">{{ info.signboardName }}</div> @@ -105,7 +105,7 @@ methods: { getLists() { const params = { - pageNum: --this.type, // 传 0 1对应两个页面 + pageNum: this.type, // 传 1 2对应两个页面 pageSize: 1, } this.$api.Infos.getMixRatio(params).then(res => { @@ -117,12 +117,19 @@ this.info.signboardName = item.signboardName this.info.proName = item.proName - this.info.constructionUnit = item.constructionUnit if (tmixingConsumes && tmixingConsumes.length) { + this.info.constructionUnit = tmixingConsumes[0].constructionUnit this.info.saveStamp = tmixingConsumes[0].saveStamp this.info.construction = tmixingConsumes[0].construction - + this.dataLists = [ + {name: '材料名称', type: 'dictName', value: []}, // 材料名称 + {name: '规格型号', type: 'spec', value: []}, // 规格型号 + {name: '生产厂家', type: 'manufacturer', value: []}, // 生产厂家 + {name: '材料含水率(%)', type: 'watFull', value: []}, // 含水率 + {name: '理论用量(kg/m³)', type: 'planAmnt', value: []}, // 理论用量 + {name: '实际用量(kg/m³)', type: 'factAmnt', value: []}, // 实际用量 + ] tmixingConsumes.forEach(item => { this.dataLists.forEach(val => { item[val.type] && val.value.push(item[val.type]) @@ -160,7 +167,7 @@ background-size: 100% auto; .header_name { - font-size: 1.6rem; + font-size: 1.4rem; font-weight: bold; line-height: 3.2rem; letter-spacing: 2px; @@ -179,7 +186,7 @@ bottom: 2rem; left: 2rem; right: 2rem; - font-size: 0.8rem; + font-size: 0.74rem; color: #fff; .title { @@ -193,10 +200,9 @@ .row { flex: 1; width: 100%; - height: 2rem; margin: 0 -1px -1px 0; text-align: center; - line-height: 2rem; + line-height: 1.1rem; border: 1px solid #01B3EF; .name { diff --git a/web/src/views/MixingInfo/mixing.vue b/web/src/views/MixingInfo/mixing.vue index 5f0c01d..5ff8d87 100644 --- a/web/src/views/MixingInfo/mixing.vue +++ b/web/src/views/MixingInfo/mixing.vue @@ -1,7 +1,7 @@ <template> <div class="wrap"> <div class="header"> - <div class="header_name">中铁十四局通甬站前I标管片场拌合站</div> + <div class="header_name">中铁十四局通甬站前I标管片场拌和站</div> </div> <div class="container"> <div class="con_name"> @@ -162,7 +162,7 @@ background-size: 100% auto; .header_name { - font-size: 1.6rem; + font-size: 1.4rem; font-weight: bold; line-height: 3.2rem; letter-spacing: 2px; @@ -174,6 +174,7 @@ } .container { + overflow: hidden; flex: 1; display: flex; flex-direction: column; @@ -207,6 +208,7 @@ } .line { + overflow: hidden; flex: 1; height: 14px; @@ -221,6 +223,7 @@ } .con_main { + overflow: hidden; margin-top: 10px; flex: 1; display: flex; @@ -255,13 +258,13 @@ float: left; width: 50%; height: 100%; - min-height: 480px; text-align: center; > p { position: absolute; left: 50%; - top: 21%; + top: 18%; + font-size: 0.7rem; white-space: nowrap; transform: translate(-50%, -50%); } -- Gitblit v1.9.3