From 90044289b992e5df6506c70b1e9bb299df321869 Mon Sep 17 00:00:00 2001 From: zhaowei <zhaowei> Date: 星期三, 21 五月 2025 16:22:20 +0800 Subject: [PATCH] 1、全局加载名称调整为MDC智慧车间 2、消息确认页面调整设备异常反馈功能 --- public/index.html | 2 src/views/mdc/base/MdcMessageconfirmationList.vue | 141 ++++++++------ src/views/mdc/base/modules/MdcMessageApproval/SelectDeviceDrawer-SingleSelection.vue | 240 ++++++++++++++++++++++++++ src/views/mdc/base/modules/MdcMessageApproval/MdcMessageApprovalModal.vue | 101 ++++++++--- 4 files changed, 393 insertions(+), 91 deletions(-) diff --git a/public/index.html b/public/index.html index 0645826..8eff331 100644 --- a/public/index.html +++ b/public/index.html @@ -251,7 +251,7 @@ <div id="loader"></div> <div class="loader-section section-left"></div> <div class="loader-section section-right"></div> - <div class="load_title">姝e湪鍔犺浇缁熻鍒嗘瀽,璇疯�愬績绛夊緟 + <div class="load_title">姝e湪鍔犺浇MDC鏅烘収杞﹂棿,璇疯�愬績绛夊緟 </div> </div> diff --git a/src/views/mdc/base/MdcMessageconfirmationList.vue b/src/views/mdc/base/MdcMessageconfirmationList.vue index f619525..6ccacad 100644 --- a/src/views/mdc/base/MdcMessageconfirmationList.vue +++ b/src/views/mdc/base/MdcMessageconfirmationList.vue @@ -5,30 +5,46 @@ <a-form layout="inline" @keyup.enter.native="searchQuery"> <a-row :gutter="24"> - <a-col :span="6"> + <a-col :span="4"> <a-form-item label="璁惧缂栧彿"> <a-input placeholder="璇疯緭鍏ヨ澶囩紪鍙�" v-model="queryParam.equipmentId"></a-input> </a-form-item> </a-col> - <a-col :span="6"> + <a-col :span="4"> <a-form-item label="娑堟伅鐘舵��"> - <a-select v-model='queryParam.msgStatus' placeholder="璇烽�夋嫨娑堟伅鐘舵��"> - <a-select-option v-for="item in msgStatusOptionList" :key="item.value" :value="item.value"> - {{item.title}} - </a-select-option> + <j-dict-select-tag dictCode="mdcMsgStatus" v-model='queryParam.msgStatus' placeholder="璇烽�夋嫨娑堟伅鐘舵��"/> + </a-form-item> + </a-col> + + <a-col :span="4"> + <a-form-item label="寮傚父绫诲瀷"> + <j-dict-select-tag dictCode="mdcMsgType" v-model='queryParam.msgType' placeholder="璇烽�夋嫨寮傚父绫诲瀷"/> + </a-form-item> + </a-col> + + <a-col :span="4"> + <a-form-item label="娑堟伅鏉ユ簮"> + <a-select v-model="queryParam.msgSource" placeholder="璇烽�夋嫨娑堟伅鏉ユ簮"> + <a-select-option key="鎵嬪姩涓婃姤">鎵嬪姩涓婃姤</a-select-option> + <a-select-option key="绯荤粺鐢熸垚">绯荤粺鐢熸垚</a-select-option> </a-select> </a-form-item> </a-col> - <a-col :span="8"> - <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-col :span="6"> + <a-space> <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button> - <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">閲嶇疆</a-button> - </span> + <a-button type="primary" @click="searchReset" icon="reload">閲嶇疆</a-button> + </a-space> </a-col> </a-row> </a-form> + </div> + + <!-- 鎿嶄綔鎸夐挳鍖哄煙路 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">鏂板</a-button> </div> <a-table @@ -42,11 +58,10 @@ :loading="loading" @change="handleTableChange"> <span slot="action" slot-scope="text, record"> - <a @click="showModal(record,0)">鏌ョ湅</a> + <a @click="showModal(record,1)">鏌ョ湅</a> <a-divider type="vertical" v-if="record.hasProcess||record.hasConfirm"></a-divider> - <a @click="showModal(record,1)" v-if="record.hasProcess">涓婃姤</a> - <a-divider type="vertical" v-if="record.hasConfirm&&record.hasProcess"></a-divider> - <a @click="showModal(record,2)" v-if="record.hasConfirm">纭</a> + <a @click="showModal(record,2)" v-if="record.hasProcess">涓婃姤</a> + <a @click="showModal(record,3)" v-if="record.hasConfirm">纭</a> <!--<a @click="showModal(record,0)">鏌ョ湅</a>--> <!--<a-divider type="vertical"></a-divider>--> <!--<a @click="showModal(record,1)">涓婃姤</a>--> @@ -54,7 +69,8 @@ <!--<a @click="showModal(record,2)">纭</a>--> </span> </a-table> - <mdc-message-approval-modal ref="modalRef" :title="modalTitle" :visible="modalVisible" :buttonId="buttonId" + <mdc-message-approval-modal ref="modalForm" :title="modalTitle" :visible="modalVisible" :buttonId="buttonId" + :disableSubmit="disableSubmit" @closeModal="modalVisible = false" @formHasSubmitted="loadData"/> </a-card> </template> @@ -75,53 +91,63 @@ queryParam: {}, columns: [ { + title: '娑堟伅鏉ユ簮', + align: 'center', + dataIndex: 'msgSource', + width: 150 + }, + { title: '璁惧缂栧彿', align: 'center', - dataIndex: 'equipmentId' + dataIndex: 'equipmentId', + width: 150 + }, + { + title: '寮傚父绫诲瀷', + align: 'center', + dataIndex: 'msgType', + width: 150 }, { title: '鏍囬', align: 'center', dataIndex: 'titile' - }, { + }, + { title: '鍐呭', align: 'center', - dataIndex: 'msgContent', - width: 450 - }, { + dataIndex: 'msgContent' + }, + { title: '鍘熷洜', align: 'center', - dataIndex: 'reportContent', - width: 450 - }, { - title: '澶勭悊浜�', + dataIndex: 'reportContent' + }, + { + title: '鍙嶉浜�', align: 'center', - dataIndex: 'senderNames' - }, { + dataIndex: 'senderNames', + width: 120 + }, + { title: '纭浜�', align: 'center', - dataIndex: 'approverNames' - }, { + dataIndex: 'approverNames', + width: 120 + }, + { title: '鐘舵��', align: 'center', - dataIndex: 'msgStatus', - customRender: function(text) { - if (text == '0') { - return '寰呭鐞�' - } else if (text == '1') { - return '寰呯‘璁�' - } else if (text == '2') { - return '宸茬‘璁�' - } else { - return '宸叉嫆缁�' - } - } - }, { + dataIndex: 'msgStatus_dictText', + width: 120, + }, + { title: '鎿嶄綔', dataIndex: 'action', align: 'center', scopedSlots: { customRender: 'action' } - }], + } + ], url: { list: '/mdc/mdcMessageApproval/list' }, @@ -129,25 +155,17 @@ msgStatusOptionList: [], modalTitle: '', modalVisible: false, + disableSubmit: false, buttonId: null } }, - created() { - this.initDictData('mdcMsgStatus') - }, methods: { - /** - * 璋冪敤鎺ュ彛鑾峰彇鏁版嵁瀛楀吀閰嶇疆msgStatus - * @param dictCode 鏁版嵁瀛楀吀缂栧彿 - */ - initDictData(dictCode) { - //鏍规嵁瀛楀吀Code, 鍒濆鍖栧瓧鍏告暟缁� - ajaxGetDictItems(dictCode, null).then((res) => { - if (res.success) { - console.log('res================', res) - this.msgStatusOptionList = res.result - } - }) + handleAdd() { + this.modalTitle = '鏂板' + this.buttonId = null + this.disableSubmit = false + this.$refs.modalForm.formParams = {} + this.modalVisible = true }, /** @@ -157,20 +175,21 @@ */ showModal(record, buttonId) { this.buttonId = buttonId + this.disableSubmit = true switch (buttonId) { - case 0: + case 1: this.modalTitle = '娑堟伅鍐呭' break - case 1: + case 2: this.modalTitle = '涓婃姤鍘熷洜' break - case 2: + case 3: this.modalTitle = '纭娑堟伅' break default: this.modalTitle = '娑堟伅鍐呭' } - this.$refs.modalRef.formParams = Object.assign({}, record) + this.$refs.modalForm.formParams = Object.assign({}, record) this.modalVisible = true } } diff --git a/src/views/mdc/base/modules/MdcMessageApproval/MdcMessageApprovalModal.vue b/src/views/mdc/base/modules/MdcMessageApproval/MdcMessageApprovalModal.vue index 30d9cbf..b6e0511 100644 --- a/src/views/mdc/base/modules/MdcMessageApproval/MdcMessageApprovalModal.vue +++ b/src/views/mdc/base/modules/MdcMessageApproval/MdcMessageApprovalModal.vue @@ -4,28 +4,32 @@ @cancel="closeModal" :visible="visible" :footer="null"> - <a-spin :spinning="confirmLoading"> - <a-form-model ref="form" :form="form" :model="formParams" :rules="validatorRules"> - <a-form-model-item label="璁惧缂栧彿" :labelCol="{span: 4}" :wrapperCol="{span: 8}"> - <a-input v-model="formParams.equipmentId" disabled></a-input> + <a-spin :spinning="spinning"> + <a-form-model ref="form" :form="form" :model="formParams" :rules="validatorRules" :labelCol="{span: 4}" + :wrapperCol="{span: 20}"> + <a-form-model-item label="璁惧缂栧彿" :labelCol="{span: 4}" :wrapperCol="{span: 10}" prop="equipmentId"> + <a-input-search :readOnly="true" :disabled="disableSubmit" v-model="formParams.equipmentId" + @search="deviceSearch" enter-button + placeholder="璇烽�夋嫨璁惧"/> </a-form-model-item> - <a-form-model-item label="鏍囬" :labelCol="{span: 4}" :wrapperCol="{span: 20}"> - <a-input v-model="formParams.titile" disabled></a-input> + <a-form-model-item label="寮傚父绫诲瀷" :labelCol="{span: 4}" :wrapperCol="{span: 10}" + :prop="!buttonId?'msgType':''"> + <j-dict-select-tag dictCode="mdcMsgType" v-model='formParams.msgType' placeholder="璇烽�夋嫨寮傚父绫诲瀷" + :disabled="disableSubmit&&buttonId!==2"/> </a-form-model-item> - <a-form-model-item label="鍐呭" :labelCol="{span: 4}" :wrapperCol="{span: 20}"> - <a-input v-model="formParams.msgContent" disabled></a-input> + <a-form-model-item label="鏍囬"> + <a-input placeholder="璇疯緭鍏ユ爣棰�" v-model="formParams.titile" :disabled="disableSubmit"/> + </a-form-model-item> + <a-form-model-item label="鍐呭"> + <a-input placeholder="璇疯緭鍏ュ唴瀹�" v-model="formParams.msgContent" :disabled="disableSubmit"/> </a-form-model-item> - <a-form-model-item label="鍘熷洜" :labelCol="{span: 4}" :wrapperCol="{span: 20}" prop="reportContent" - v-if="buttonId===1"> - <a-textarea v-model="formParams.reportContent" :disabled="buttonId!==1"></a-textarea> - </a-form-model-item> - <a-form-model-item label="鍘熷洜" :labelCol="{span: 4}" :wrapperCol="{span: 20}" v-else> - <a-textarea v-model="formParams.reportContent" :disabled="buttonId!==1"></a-textarea> + <a-form-model-item label="鍘熷洜" prop="reportContent" v-if="buttonId"> + <a-textarea v-model="formParams.reportContent" :disabled="buttonId!==2"/> </a-form-model-item> <a-form-model-item label="纭" :labelCol="{span: 4}" :wrapperCol="{span: 12}" prop="isConfirm" - v-if="buttonId==2"> + v-if="buttonId==3"> <a-select v-model='formParams.isConfirm' placeholder="璇烽�夋嫨鏄惁纭"> <a-select-option value="2">纭</a-select-option> <a-select-option value="3">鎷掔粷</a-select-option> @@ -34,20 +38,26 @@ </a-form-model> </a-spin> - <div class="drawer-bottom-button" v-show="buttonId!==0"> - <a-popconfirm title="纭畾鏀惧純鎿嶄綔锛�" @confirm="closeModal" okText="纭畾" cancelText="鍙栨秷"> - <a-button style="margin-right: .8rem">鍙栨秷</a-button> - </a-popconfirm> - <a-button @click="handleSubmit" type="primary" :loading="confirmLoading">鎻愪氦</a-button> + <div class="drawer-bottom-button" v-show="buttonId!==1"> + <a-space> + <a-popconfirm title="纭畾鏀惧純鎿嶄綔锛�" @confirm="closeModal" okText="纭畾" cancelText="鍙栨秷"> + <a-button>鍙栨秷</a-button> + </a-popconfirm> + <a-button @click="handleSubmit" type="primary" :loading="confirmLoading">鎻愪氦</a-button> + </a-space> </div> + + <SelectDeviceDrawerSingleSelection ref="selectDeviceDrawer" @selectFinished="selectOK" :title="'閫夋嫨璁惧'"/> </a-modal> </template> <script> import { postAction } from '@/api/manage' + import SelectDeviceDrawerSingleSelection from './SelectDeviceDrawer-SingleSelection' export default { name: 'MdcMessageApprovalModal', + components: { SelectDeviceDrawerSingleSelection }, props: { visible: { type: Boolean @@ -57,11 +67,16 @@ }, buttonId: { type: Number + }, + disableSubmit: { + type: Boolean } }, data() { return { form: this.$form.createForm(this), + treeData: [], + treeDefaultExpandedKeys: [], formParams: { equipmentId: '', titile: '', @@ -71,7 +86,14 @@ isConfirm: '' }, confirmLoading: false, + spinning: false, validatorRules: { + equipmentId: [ + { required: true, message: '璇烽�夋嫨璁惧', trigger: 'change' } + ], + msgType: [ + { required: true, message: '璇烽�夋嫨寮傚父绫诲瀷' } + ], reportContent: [ { required: true, message: '璇疯緭鍏ヤ笂鎶ュ師鍥�' } ], @@ -80,29 +102,45 @@ ] }, url: { + add: '/mdc/mdcMessageApproval/add', reportUrl: '/mdc/mdcMessageApproval/reportReason', confirmUrl: '/mdc/mdcMessageApproval/handleConfirm' } } }, methods: { - closeModal() { - this.$refs.form.clearValidate() - this.$emit('closeModal') + deviceSearch() { + this.$refs.selectDeviceDrawer.visible = true + this.$refs.selectDeviceDrawer.checkedKeys = this.formParams.equipmentId ? [this.formParams.equipmentId] : [] + this.$refs.selectDeviceDrawer.selectedKeys = this.formParams.equipmentId ? [this.formParams.equipmentId] : [] }, + + /** + * 閫夋嫨宸叉湁璁惧鍚庣偣鍑荤‘瀹氭椂瑙﹀彂 + * @param data 宸查�夋嫨鐨勮澶� + */ + selectOK(data) { + this.$set(this.formParams, 'equipmentId', data[0]) + }, + handleSubmit() { const that = this // 瑙﹀彂琛ㄥ崟楠岃瘉 this.$refs.form.validate(valid => { if (valid) { - that.confirmLoading = true + that.confirmLoading = that.spinning = true this.formParams.msgStatus = this.formParams.isConfirm let obj - if (this.buttonId === 1) { - obj = postAction(this.url.reportUrl, this.formParams) + if (!this.buttonId) { + obj = postAction(this.url.add, this.formParams) } else { - obj = postAction(this.url.confirmUrl, this.formParams) + if (this.buttonId === 2) { + obj = postAction(this.url.reportUrl, this.formParams) + } else { + obj = postAction(this.url.confirmUrl, this.formParams) + } } + obj.then((res) => { if (res.success) { that.$notification.success({ @@ -110,6 +148,7 @@ description: res.message }) that.$emit('formHasSubmitted') + that.closeModal() } else { that.$notification.warning({ message: '娑堟伅', @@ -117,13 +156,17 @@ }) } }).finally(() => { - that.confirmLoading = false - that.closeModal() + that.confirmLoading = that.spinning = false }) } else { return false } }) + }, + + closeModal() { + this.$refs.form.clearValidate() + this.$emit('closeModal') } } } diff --git a/src/views/mdc/base/modules/MdcMessageApproval/SelectDeviceDrawer-SingleSelection.vue b/src/views/mdc/base/modules/MdcMessageApproval/SelectDeviceDrawer-SingleSelection.vue new file mode 100644 index 0000000..e796512 --- /dev/null +++ b/src/views/mdc/base/modules/MdcMessageApproval/SelectDeviceDrawer-SingleSelection.vue @@ -0,0 +1,240 @@ +<template> + <a-drawer + :title="title" + :visible="visible" + width="500" + @ok="handleOk" + @close="handleCancel" + > + + <a-spin :spinning="loading"> + <!-- showLine --> + <a-form> + <a-form-item> + <a-input-search @search="handleSearch" style="width:100%;" placeholder="妫�绱� 绫诲埆缂栫爜/鍚嶇О" allowClear + v-model="searchInput" @change="handleSearch"/> + </a-form-item> + <a-form-item label="杞﹂棿灞傜骇锛�"> + <a-tree showLine ref="tree" :expandedKeys.sync="expandedKeys" :selectedKeys="selectedKeys" + :autoExpandParent="autoExpandParent" checkStrictly + :treeData="treeDataSource" checkable @check="onCheck" @select="onSelect" v-model="checkedKeys" + @expand="onExpand"> + <template slot="title" slot-scope="{ title, parentId, entity, key}"> + <span v-if="title.indexOf(searchValue) > -1">{{ title.substr(0, title.indexOf(searchValue)) }} + <span class="replaceSearch">{{ searchValue }}</span> + {{ title.substr(title.indexOf(searchValue) + searchValue.length) }} + </span> + <span v-else>{{ title }}</span> + </template> + </a-tree> + </a-form-item> + </a-form> + + </a-spin> + + <div class="drawer-bottom-button"> + <a-dropdown + style="float: left" + :trigger="['click']" + placement="topCenter" + > + <a-menu slot="overlay"> + <a-menu-item key="1" @click="expandedKeys=allTreeKeys">灞曞紑鎵�鏈�</a-menu-item> + <a-menu-item key="2" @click="expandedKeys=['-1']">鍚堝苟鎵�鏈�</a-menu-item> + <a-menu-item key="3" @click="queryTreeData">鍒锋柊</a-menu-item> + </a-menu> + <a-button> + 鏍戞搷浣� + <a-icon type="up"/> + </a-button> + </a-dropdown> + <a-popconfirm title="纭畾鏀惧純缂栬緫锛�" @confirm="handleCancel" okText="纭畾" cancelText="鍙栨秷"> + <a-button style="margin-right: .8rem">鍏抽棴</a-button> + </a-popconfirm> + <a-button @click="handleOk" type="primary">纭畾</a-button> + </div> + </a-drawer> +</template> + +<script> + import { getAction, postAction, deleteAction } from '@/api/manage' + import { mapActions } from 'vuex' + + export default { + name: 'SelectDeviceDrawer-SingleSelection', + props: { + editDisable: { + type: Boolean, + default() { + return true + } + }, + title: { + type: String + } + }, + data() { + return { + searchInput: '', + searchValue: '', + cardLoading: false, + loading: false, + treeDataSource: [], + expandedKeys: [], + checkedKeys: [], + selectedKeys: [], + autoExpandParent: true, + dataList: [], + allTreeKeys: [], + visible: false, + dataSource: [] + } + }, + created() { + this.queryTreeData() + }, + methods: { + ...mapActions(['QueryProduction']), + + queryTreeData() { + this.loading = true + this.cardLoading = true + this.QueryProduction().then(res => { + if (res.success) { + this.dataList = [] + this.allTreeKeys = [] + this.getTreeDataSource(res.result) + this.treeDataSource = res.result + this.generateList(this.treeDataSource) + this.expandedKeys = this.allTreeKeys + } else { + this.$message.warn(res.message) + } + }).finally(() => { + this.loading = false + this.cardLoading = false + }) + }, + + generateList(data) { + for (let i = 0; i < data.length; i++) { + const node = data[i] + const key = node.key + const title = node.title + this.dataList.push({ + key, + title: title + }) + this.allTreeKeys.push(key) + if (node.children) { + this.generateList(node.children) + } + } + }, + + handleSearch(value) { + let search = this.searchInput + let expandedKeys = this.dataList + .map(item => { + if (item.title != null) { + if (item.title.indexOf(search) > -1) { + return this.getParentKey(item.key, this.treeDataSource) + } + return null + } + }) + .filter((item, i, self) => item && self.indexOf(item) === i) + console.log('expandedKeys', expandedKeys) + Object.assign(this, { + expandedKeys, + searchValue: search, + autoExpandParent: true + }) + }, + + getParentKey(key, tree) { + let parentKey + for (let i = 0; i < tree.length; i++) { + const node = tree[i] + if (node.children) { + if (node.children.some(item => item.key === key)) { + parentKey = node.key + } else if ( + this.getParentKey(key, node.children)) { + parentKey = this.getParentKey(key, node.children) + } + } + } + return parentKey + }, + + getTreeDataSource(data) { + data.forEach(item => { + if (item.children && item.children.length > 0) { + this.getTreeDataSource(item.children) + } + item.key = item.equipmentId ? item.equipmentId : item.key + item.value = item.equipmentId ? item.equipmentId : item.value + }) + }, + + /** + * 澶氶�夋閫変腑鏃惰Е鍙� + * @param selectedKeys 鏍戣妭鐐归�変腑鍒楄〃锛坈heck浜嬩欢绗竴涓弬鏁版湭鐢ㄥ埌锛屾鍙傛暟鏄敱select浜嬩欢浼犲叆鐨勶級 + * @param event 澶氶�夋浜嬩欢瀵硅薄 + */ + onCheck(selectedKeys, event) { + let checkedKeys + if (event) checkedKeys = event.checkedNodes.filter(item => item.data.props.equipmentId).map(item => item.data.props.equipmentId) + else checkedKeys = selectedKeys + this.checkedKeys = this.selectedKeys = checkedKeys.slice(-1) + }, + + /** + * 鏍戣妭鐐归�変腑鏃惰Е鍙� + * @param selectedKeys 鏍戣妭鐐归�変腑鍒楄〃锛堜紶鍏heck浜嬩欢绗竴涓弬鏁帮級 + * @param event 鏍戣妭鐐归�変腑浜嬩欢瀵硅薄 + */ + onSelect(selectedKeys, event) { + if (event.selectedNodes[0].data.props.equipmentId) this.onCheck(selectedKeys) + }, + + /** + * 鏍戝睍寮�鍚堝苟鏃惰Е鍙� + * @param expandedKeys + */ + onExpand(expandedKeys) { + this.expandedKeys = expandedKeys + this.autoExpandParent = false + }, + + handleOk() { + this.$emit('selectFinished', this.checkedKeys) + this.handleCancel() + }, + + handleCancel() { + this.visible = false + } + } + } +</script> +<style lang="less" scoped> + .replaceSearch { + color: #40a9ff; + font-weight: bold; + background-color: rgb(204, 204, 204); + } + + .drawer-bottom-button { + position: absolute; + bottom: 0; + width: 100%; + border-top: 1px solid #e8e8e8; + padding: 10px 16px; + text-align: right; + left: 0; + background: #fff; + border-radius: 0 0 2px 2px; + } +</style> \ No newline at end of file -- Gitblit v1.9.3