1
lzhe
2024-04-18 dc4221341806e15f2a99520e7f763a8074c0eda1
1
已添加2个文件
已修改2个文件
388 ■■■■ 文件已修改
src/utils/request.js 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/add-feedback.vue 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/quesheng.bd026700.png 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/state-feedback.vue 251 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.js
@@ -212,12 +212,19 @@
            axios({
                method: 'delete',
                url: url,
                params: data,
                data: data,
                ...config
            }).then((response) => {
                resolve(response.data);
            }).catch((error) => {
                reject(error);
                if(error.status == 400) {
                    ElMessage({
                        message: error.data.msg,
                        type: 'warning',
                     })
                }else {
                    reject(error);
                }
            })
        })
    },
src/views/mdc/add-feedback.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,126 @@
<template>
    <el-dialog :title="titleMap[mode]" v-model="visible" :width="570" destroy-on-close @closed="$emit('closed')">
        <el-form :model="addDictForm" :rules="addDictRules" :disabled="mode=='show'" ref="dialogForm" label-width="120px" label-position="center">
            <el-row>
                <el-col :span="24">
                    <el-form-item label="状态时间">
                        <el-date-picker v-model="addDictForm.date" type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" align="right" value-format="YYYY-MM-DD HH:mm:ss" @change="dateChange">
                    </el-date-picker>
                    </el-form-item>
                </el-col>
                <el-col :span="24">
                    <el-form-item label="状态" prop="wcs">
                        <el-select v-model="addDictForm.wcs" style="width: 100%">
                            <el-option v-for="item in feedBackStatusList" :key="item.code" :label="item.name" :value="item.code"/>
                        </el-select>
                    </el-form-item>
                </el-col>
                <el-col :span="24">
                    <el-form-item label="描述">
                        <el-input v-model="addDictForm.description" placeholder="描述" clearable></el-input>
                    </el-form-item>
                </el-col>
            </el-row>
        </el-form>
        <template #footer>
            <el-button @click="visible=false" >取 æ¶ˆ</el-button>
            <el-button v-if="mode!='show'" type="primary" :loading="isSaveing" @click="dictSubmit()">保 å­˜</el-button>
        </template>
    </el-dialog>
</template>
<script>
    export default {
        emits: ['success', 'closed'],
        props: ['feedBackStatusList','workstationId'],
        data() {
            return {
                value1: true,
                mode: "add",
                titleMap: {
                    add: '状态反馈',
                    edit: '修改',
                    show: '查看'
                },
                visible: false,
                isSaveing: false,
                //表单数据
                addDictForm: {
                    description: "",
                    date: "",
                    endTime: "",
                    startTime: "",
                    wcs: ""
                },
                //验证规则
                addDictRules: {
                    wcs:[{required: true, message: '请选择状态', trigger: 'change'}]
                }
            }
        },
        mounted() {
        },
        methods: {
            dateChange(val) {
                this.addDictForm.startTime = val[0];
                this.addDictForm.endTime = val[1];
            },
            //显示
            open(mode='add'){
                this.mode = mode;
                this.visible = true;
                return this
            },
            //表单提交方法
            dictSubmit(){
                var obj = Object.assign({},this.addDictForm);
                obj.workstationIds = [this.workstationId]
                var that = this;
                this.$refs.dialogForm.validate(async (valid) => {
                    if (valid) {
                        this.isSaveing = true;
                        this.$HTTP.post("/api/blade-cps/workstation-wcs-feedback/overwrite-feedback-check",obj).then(res=> {
                            that.isSaveing = false;
                            if(res.code == 200) {
                                if(res.data) {
                                    that.$confirm(`反馈的时间与已有反馈重叠,是否覆盖`, '', {
                                        type: 'warning'
                                    }).then(() => {
                                        that.$HTTP.post("/api/blade-cps/workstation-wcs-feedback/start-feedback-by-no-immediate",obj).then(res=> {
                                            if(res.code == 200) {
                                                that.$message.success("操作成功");
                                                that.$emit('success', this.addDictForm, this.mode);
                                                that.visible = false;
                                            }
                                        })
                                    }).catch(() => {})
                                }else {
                                    that.$HTTP.post("/api/blade-cps/workstation-wcs-feedback/start-feedback-by-no-immediate",obj).then(res=> {
                                        if(res.code == 200) {
                                            that.$message.success("操作成功");
                                            that.$emit('success', this.addDictForm, this.mode);
                                            that.visible = false;
                                        }
                                    })
                                }
                            }else {
                                this.$alert(res.message, "提示", {type: 'error'});
                            }
                        })
                    }else{
                        return false;
                    }
                })
            },
            //表单注入数据
            setData(data){
                //可以和上面一样单个注入,也可以像下面一样直接合并进去
                //Object.assign(this.addDictForm, data);
            }
        }
    }
</script>
<style>
</style>
src/views/mdc/quesheng.bd026700.png
src/views/mdc/state-feedback.vue
@@ -2,7 +2,7 @@
 * @Author: lzhe lzhe@example.com
 * @Date: 2024-03-26 10:28:33
 * @LastEditors: lzhe lzhe@example.com
 * @LastEditTime: 2024-04-17 17:52:50
 * @LastEditTime: 2024-04-18 17:10:39
 * @FilePath: /smart-web/src/views/master/person/main/index.vue
 * @Description: è¿™æ˜¯é»˜è®¤è®¾ç½®,请设置`customMade`, æ‰“å¼€koroFileHeader查看配置 è¿›è¡Œè®¾ç½®: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
@@ -10,55 +10,80 @@
    <div class="aposcope-main">
        <div class="aposcope-left">
            <div class="left-title">工位</div>
            <el-tree :data="tableData" row-key="id" default-expand-all :expand-on-click-node="false" :props="defalutProps" @node-click="handleNodeClick" ref="treeRef"/>
            <el-tree :data="tableData" node-key="id" default-expand-all :expand-on-click-node="false" :props="defalutProps" @node-click="handleNodeClick" ref="treeRef" highlight-current />
        </div>
        <div class="aposcope-right">
            <div>
                <!-- <el-button type="primary" @click="addData">+ æ·»åŠ </el-button> -->
                <!-- <el-button type="danger" plain @click="delData">删除</el-button> -->
                <!-- <el-date-picker
                  v-model="value2"
                  type="datetimerange"
                  :picker-options="pickerOptions"
                  range-separator="至"
                  start-placeholder="开始日期"
                  end-placeholder="结束日期"
                  align="right">
                </el-date-picker> -->
            <div class="right-top">
                <div>
                    <el-button type="primary" @click="addData">反馈</el-button>
                    <el-button type="danger" plain @click="delData">批量删除</el-button>
                </div>
                <div>
                    <el-select v-model="searchData.feedBackStatus" multiple style="width: 185px;margin-right: 8px;;" @change="feedBackStatusChange">
                        <el-option v-for="item in feedBackStatusList" :key="item.code" :label="item.name" :value="item.code"/>
                    </el-select>
                    <el-date-picker v-model="searchData.date" type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" align="right" value-format="YYYY-MM-DD HH:mm:ss" @change="dateChange" style="vertical-align: middle;">
                    </el-date-picker>
                </div>
            </div>
            <el-table ref="searchDataListRef" :data="searchDataList" border style="width: 100%;margin-top: 20px;" class="multipleTableRef" @selection-change="searchHandleSelectionChange">
            <div class="right-content" v-if="searchDataList.length == 0">
                <img src="./quesheng.bd026700.png" />
                <div>
                    <span>暂无反馈状态数据</span>
                </div>
            </div>
            <el-table ref="searchDataListRef" v-if="searchDataList.length != 0" :data="searchDataList" border style="width: 100%;margin-top: 20px;" class="multipleTableRef" @selection-change="searchHandleSelectionChange">
                <el-table-column type="selection" width="55" />
                <el-table-column prop="moduleCode" label="工位名称"></el-table-column>
                <el-table-column prop="controllerCode" label="状态"></el-table-column>
                <el-table-column prop="scopeName" label="描述"></el-table-column>
                <el-table-column prop="httpMethod" label="持续时长"></el-table-column>
                <el-table-column prop="scopePath" label="状态时间"></el-table-column>
                <el-table-column prop="scopePath" label="反馈时间"></el-table-column>
                <el-table-column prop="workstationName" label="工位名称"></el-table-column>
                <el-table-column prop="wcsDesc" label="状态"></el-table-column>
                <el-table-column prop="feedbackDesc" label="描述"></el-table-column>
                <el-table-column prop="httpMethod" label="持续时长">
                    <template #default="scope">
                        <span>{{sumTime(scope.row.startTime,scope.row.endTime)}}</span>
                    </template>
                </el-table-column>
                <el-table-column prop="scopePath" label="状态时间">
                    <template #default="scope">
                        <span>{{scope.row.startTime}}~{{ scope.row.endTime }}</span>
                    </template>
                </el-table-column>
                <el-table-column fixed="right" label="操作">
                    <template #default="scope">
                        <el-button text type="primary" size="small" @click="showDrawer(scope.row, scope.$index)">删除</el-button>
                        <el-button text type="primary" size="small" @click="table_del(scope.row, scope.$index)">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
        </div>
    </div>
    <save-dialog v-if="dialog.save" ref="saveDialog" :feedBackStatusList="feedBackStatusList" :workstationId="lastLevelId" @success="addfeedbackSuccess" @closed="dialog.save=false"></save-dialog>
</template>
<script>
    import { useTransitionFallthroughEmits } from 'element-plus';
import saveDialog from './add-feedback'
    export default {
        name: "state-feedback",
        data(){
            return {
                dialog: {
                    save: false
                },
                lastLevelId: "",
                feedBackStatusList: [],
                current: "1",
                size: "15",
                searchData: {
                    menuId: "",
                    size: "15",
                    current: "1"
                    feedBackStatus: [],
                    date: [],
                    endDate: "",
                    startDate: ""
                },
                searchDataList: [],  //右侧数据list
                aList: [],
                defalutProps: {
                    label: 'title',
                      children: 'children',
                    isLeaf: 'hasChildren'
                    isLeaf: 'hasChildren',
                    disabled: 'disabled'
                },
                parentId: "0",
                tableData: [],
@@ -70,41 +95,123 @@
        },
        mounted(){
            this.getTreeList();
            this.getfeedBackStatusList();  //获取状态list
        },
        components: {
            saveDialog
        },
        methods: {
            table_del(row) {
                this.$confirm(`确定将选择数据删除?`, '', {
                    type: 'warning'
                }).then(() => {
                    var arr = [row.id]
                    this.$HTTP.delete("/api/blade-cps/workstation-wcs-feedback",arr).then(res=> {
                        if(res.code == 200) {
                            this.$message.success("操作成功");
                            this.getlist();
                        }
                    })
                }).catch(() => {
                })
            },
            addfeedbackSuccess() {
                this.getlist();
            },
            getfeedBackStatusList() {
                this.$HTTP.get("/api/blade-cps/global_wcs/wcs-achievements").then(res=> {
                    if(res.code == 200) {
                        this.feedBackStatusList.push(res.data[0]);
                        this.feedBackStatusList.push(res.data[1]);
                    }
                })
            },
            feedBackStatusChange(val) {
                this.getlist();
            },
            dateChange(val) {
                this.searchData.startDate = val[0];
                this.searchData.endDate = val[1];
                this.getlist();
            },
            searchHandleSelectionChange(selection) {
                this.searchSelection = selection;
            },
            handleClose(done) {
                done();
            },
            sumTime(startTime,endTime) {
                // å°†å­—符串转换为Date对象
                var startDate = new Date(startTime);
                var endDate = new Date(endTime);
                // è®¡ç®—时间差(毫秒)
                var timeDiff = endDate - startDate;
                // å°†æ—¶é—´å·®è½¬æ¢ä¸ºå¤©æ•°ã€å°æ—¶æ•°ã€åˆ†é’Ÿæ•°å’Œç§’æ•°
                var diffDays = Math.floor(timeDiff / (1000 * 60 * 60 * 24)); // å¤©
                timeDiff %= 1000 * 60 * 60 * 24; // å‰©ä½™æ¯«ç§’æ•°
                var diffHours = Math.floor(timeDiff / (1000 * 60 * 60)); // å°æ—¶
                timeDiff %= 1000 * 60 * 60; // å‰©ä½™æ¯«ç§’æ•°
                var diffMinutes = Math.floor(timeDiff / (1000 * 60)); // åˆ†é’Ÿ
                timeDiff %= 1000 * 60; // å‰©ä½™æ¯«ç§’æ•°
                var diffSeconds = Math.floor(timeDiff / 1000); // ç§’
                var d = diffDays == 0?"":diffDays + "天";
                return d + diffHours + "小时 " + diffMinutes + "分钟 " + diffSeconds + "秒"
            },
            handleNodeClick(data) {
                // var obj = {
                //     groupCategory: 1,
                //     groupType: "group_workstation"
                // }
                // this.$HTTP.post("/api/blade-cps/group/groupWorkstation/type",obj).then(res=> {
                //     if(res.code == 200) {
                //         this.searchDataList = res.data.records;
                //     }
                // })
                if(data.code) {
                    this.lastLevelId = data.id;
                    var obj = {
                        workstationId: this.lastLevelId,
                    }
                    if(this.searchData.feedBackStatus.length != 0) {
                        obj.feedBackStatus = this.searchData.feedBackStatus;
                    }
                    if(this.searchData.endDate) {
                        obj.endDate = this.searchData.endDate;
                    }
                    if(this.searchData.startDate) {
                        obj.startDate = this.searchData.startDate;
                    }
                    this.$HTTP.post("/api/blade-cps/workstation-wcs-feedback/page?current=1&size=15",obj).then(res=> {
                        if(res.code == 200) {
                            this.searchDataList = res.data.records;
                        }
                    })
                }
            },
            getLastLevelIds(tree) {
                if (tree.length === 0) return ""; // å¦‚果没有根节点,返回空
                const lastLevelIds = [];
                const lastLevelCodes = [];
                function traverseTree(node) {
                    if(!node.code) {
                        lastLevelCodes.push(node.id);
                    }
                    if (node.children.length > 0) {
                        node.children.forEach(traverseTree); // é€’归遍历子节点
                    } else {
                        if(node.code) {
                            lastLevelIds.push(node.id); // æœ‰code才行
                        }
                    }
                }
                // åªéåŽ†ç¬¬ä¸€ä¸ªæ ¹èŠ‚ç‚¹
                traverseTree(tree[0]);
                return {lastLevelCodes,lastLevelId:lastLevelIds[0]}; // è¿”回lastLevelCodes:没有code的数组。lastLevelId:有code的第一个id
            },
            buildTree(items) {  
              const idMap = {};  
              const tree = [];  
              // ç¬¬ä¸€æ­¥ï¼šåˆ›å»ºid到对象的映射  
              items.forEach(item => {  
                idMap[item.id] = { ...item, children: [] };  
              });
              });
              // ç¬¬äºŒæ­¥ï¼šæž„建树形结构  
              items.forEach(item => {  
                const currentNode = idMap[item.id];  
                // å¦‚æžœparentId为0,说明是根节点  
                if (item.parentId === 0) {  
                  tree.push(currentNode);  
@@ -116,8 +223,19 @@
                  }  
                }  
              });  
              return tree;  
            },
            addTreeDisable(treeData) {
                var tree = [];
                treeData.forEach(item=> {
                    if(item.code) {
                        item.disabled = false;
                    }else {
                        item.disabled = true;
                    }
                    tree.push(item);
                })
                return tree;
            },
            getTreeList(flag) {
                var obj = {
@@ -127,9 +245,34 @@
                this.$HTTP.post("/api/blade-cps/group/groupWorkstation/type",obj).then(res=> {
                    if(res.code == 200) {
                        if (res.code == 200) {
                            this.tableData = this.buildTree(res.data);
                            console.log(this.buildTree(res.data))
                            var treeDisabled = this.addTreeDisable(res.data);
                            this.tableData = this.buildTree(treeDisabled);  //从扁平化变为树状结构
                            this.$nextTick(()=> {
                                this.lastLevelId = this.getLastLevelIds(this.tableData).lastLevelId;
                                this.$refs.treeRef.setCurrentKey(this.lastLevelId);  //第一个节点的第一个子节点最后一级默认选中
                                this.getlist();  //渲染反馈列表
                            })
                        }
                    }
                })
            },
            getlist() {
                var obj = {
                    workstationId: this.lastLevelId,
                }
                if(this.searchData.feedBackStatus != 0) {
                    obj.feedBackStatus = this.searchData.feedBackStatus;
                }
                if(this.searchData.endDate) {
                    obj.endDate = this.searchData.endDate;
                }
                if(this.searchData.startDate) {
                    obj.startDate = this.searchData.startDate;
                }
                this.$HTTP.post("/api/blade-cps/workstation-wcs-feedback/page?current=1&size=15",obj).then(res=> {
                    if(res.code == 200) {
                        this.searchDataList = res.data.records;
                    }
                })
            },
@@ -149,7 +292,10 @@
                })
            },
            addData() {
                this.dialog.save = true
                this.$nextTick(() => {
                    this.$refs.saveDialog.open()
                })
            },
            delData() {
                if(this.searchSelection.length == 0) {
@@ -159,17 +305,21 @@
                    });
                    return;
                }
                var selStr = "";
                var sel = [];
                this.searchSelection.map(item=> {
                    selStr += item.id + ","
                    sel.push(item.id);
                })
                selStr = selStr.replace(/,$/, '');
                var that = this;
                this.$HTTP.delete("/api/blade-cps/workstation-wcs-feedback",sel).then(res=> {
                    if(res.code == 200) {
                        this.$message.success("操作成功");
                        this.getlist();
                    }
                })
            }
        }
    }
</script>
<style scoped>
.aposcope-main {
    display: flex;
@@ -212,4 +362,9 @@
    color: #409eff;
    cursor: pointer;
}
.right-top {
    display: flex;
    justify-content: space-between;
    align-items: center;
}
</style>