|
|
@@ -0,0 +1,473 @@
|
|
|
+<!--事后的检查登记-->
|
|
|
+<template>
|
|
|
+ <div class="app-container">
|
|
|
+ <el-form
|
|
|
+ ref="point_baseInfo"
|
|
|
+ :model="info"
|
|
|
+ :rules="baseInfoRules"
|
|
|
+ label-width="120px"
|
|
|
+ >
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="任务名称" prop="taskName">
|
|
|
+ <el-input
|
|
|
+ v-model="info.taskName"
|
|
|
+ placeholder="请输入任务名称"
|
|
|
+ maxlength="50"
|
|
|
+ ></el-input> </el-form-item
|
|
|
+ ></el-col>
|
|
|
+ <el-col :span="6"
|
|
|
+ ><el-form-item label="检查主体" prop="checkOrgId">
|
|
|
+ <orgDropDown
|
|
|
+ v-model="info.checkOrgId"
|
|
|
+ placeholder="选择检查主体"
|
|
|
+ @select="onCheckOrgSelect"
|
|
|
+ orgTreeType="org"
|
|
|
+ /> </el-form-item
|
|
|
+ ></el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="检查人员" prop="checkRoleId">
|
|
|
+ <el-select
|
|
|
+ v-model="info.checkRoleId"
|
|
|
+ placeholder="请选择检查人员"
|
|
|
+ style="width: 100%"
|
|
|
+ clearable
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="role in roleOptions"
|
|
|
+ :key="role.id"
|
|
|
+ :label="role.name"
|
|
|
+ :value="role.id"
|
|
|
+ ></el-option>
|
|
|
+ </el-select> </el-form-item
|
|
|
+ ></el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="受检机构" prop="beCheckedOrgId">
|
|
|
+ <orgDropDown
|
|
|
+ v-model="info.beCheckedOrgId"
|
|
|
+ placeholder="选择受检机构"
|
|
|
+ @select="onBecheckOrgSelect"
|
|
|
+ orgTreeType="org"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="检查组成员" prop="checkTeam">
|
|
|
+ <el-input
|
|
|
+ style="width: 100%"
|
|
|
+ placeHolder="请输入检查组成员"
|
|
|
+ v-model="info.checkTeam"
|
|
|
+ maxlength="100"
|
|
|
+ clearable
|
|
|
+ ></el-input> </el-form-item
|
|
|
+ ></el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="检查日期" prop="planStartTime">
|
|
|
+ <el-date-picker
|
|
|
+ style="width: 100%"
|
|
|
+ v-model="info.planStartTime"
|
|
|
+ type="date"
|
|
|
+ placeholder="选择检查日期"
|
|
|
+ clearable
|
|
|
+ >
|
|
|
+ </el-date-picker>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-form>
|
|
|
+ <div style="margin-left: 42px">
|
|
|
+ <span style="margin-right: 20px">检查区域</span>
|
|
|
+ <el-button type="primary" size="mini" @click="onAddPoint()"
|
|
|
+ >选择检查内容</el-button
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ <div class="content">
|
|
|
+ <div class="area_content" v-for="area in info.checkList">
|
|
|
+ <div>
|
|
|
+ {{ area.areaName }}
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <div class="safetycheck_item" v-for="(item, index) in area.itemList">
|
|
|
+ <span>{{ index + 1 }}、{{ item.itemName }}</span>
|
|
|
+ <div class="safetycheck_point" v-for="point in item.pointList">
|
|
|
+ <div>
|
|
|
+ <div class="pointName">
|
|
|
+ <i class="circle" />
|
|
|
+ <pre>{{ point.pointName }}</pre>
|
|
|
+ </div>
|
|
|
+ <el-radio-group v-model="point.status" style="margin-top: 5px">
|
|
|
+ <el-radio :label="0">正常</el-radio>
|
|
|
+ <el-radio :label="1">异常</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ <div>
|
|
|
+ <el-button
|
|
|
+ type="danger"
|
|
|
+ size="mini"
|
|
|
+ v-if="point.isAdd"
|
|
|
+ style="margin-left: 50px"
|
|
|
+ @click="onDeletePoint(area, item, point)"
|
|
|
+ >删除</el-button
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-if="point.status == 1">
|
|
|
+ <el-form
|
|
|
+ :ref="'point_' + point.pointId"
|
|
|
+ :model="point"
|
|
|
+ :rules="exceptionRules"
|
|
|
+ label-width="100px"
|
|
|
+ >
|
|
|
+ <el-form-item label="情况描述" prop="remark">
|
|
|
+ <el-input
|
|
|
+ v-model="point.remark"
|
|
|
+ style="width: 250px"
|
|
|
+ placeholder="请输入情况描述"
|
|
|
+ maxlength="255"
|
|
|
+ ></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="整改期限" prop="rectificationDeadline">
|
|
|
+ <el-select
|
|
|
+ v-model="point.rectificationDeadline"
|
|
|
+ placeholder="请选择整改期限"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="item in dict.type.rectification_deadline"
|
|
|
+ :key="item.value"
|
|
|
+ :value="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ ></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="异常图片" prop="image">
|
|
|
+ <imgUpload
|
|
|
+ type="more"
|
|
|
+ :value="
|
|
|
+ point.imgData
|
|
|
+ ? point.imgData.map((d) => d.imgPath).join(',')
|
|
|
+ : ''
|
|
|
+ "
|
|
|
+ @input="onImageChanged(point, $event)"
|
|
|
+ ></imgUpload>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button @click="onClose">取消</el-button>
|
|
|
+ <!-- <el-button @click="onSave" v-if="showSaveBtn">保存</el-button> -->
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ @click="onSubmit()"
|
|
|
+ v-hasPermi="['core:safetycheck:tempregister']"
|
|
|
+ >提交</el-button
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ <SelectPoint
|
|
|
+ ref="SelectPoint"
|
|
|
+ :orgType="[info.beCheckOrgType]"
|
|
|
+ @select="onSelectPoint"
|
|
|
+ ></SelectPoint>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+<script>
|
|
|
+import { mapGetters } from "vuex";
|
|
|
+import * as api from "@/api/safetycheck/checkRegister.js";
|
|
|
+import dayjs from "dayjs";
|
|
|
+import SelectPoint from "../../ruleManager/dialog.select.point.vue";
|
|
|
+import imgUpload from "@/components/ImageUpload/index.vue";
|
|
|
+import { getLabel } from "@/views/commonOption.js";
|
|
|
+import { getNamesByOrgId } from "@/api/system/role.js";
|
|
|
+import orgDropDown from "@/components/orgTree/orgDropDown.vue";
|
|
|
+export default {
|
|
|
+ name: "safetyCheckRegister",
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ info: {
|
|
|
+ taskName: null,
|
|
|
+ checkOrgId: null,
|
|
|
+ checkRoleId: null,
|
|
|
+ beCheckedOrgId: null,
|
|
|
+ beCheckOrgType: null,
|
|
|
+ planStartTime: new Date(),
|
|
|
+ checkTeam: null,
|
|
|
+ checkList: [],
|
|
|
+ },
|
|
|
+ roleOptions: [],
|
|
|
+ prevCheckOrgType: null, //上一个选中检查机构的类型
|
|
|
+ prevBecheckedOrgType: null, //上一个受检机构的类型
|
|
|
+ exceptionRules: {
|
|
|
+ remark: [{ required: true, message: "请输入情况描述" }],
|
|
|
+ rectificationDeadline: [{ required: true, message: "请选择整改期限" }],
|
|
|
+ },
|
|
|
+ baseInfoRules: {
|
|
|
+ taskName: [{ required: true, message: "请输入任务名称" }],
|
|
|
+ checkOrgId: [{ required: true, message: "请选择检查主体" }],
|
|
|
+ checkRoleId: [{ required: true, message: "请选择检查人员" }],
|
|
|
+ beCheckedOrgId: [{ required: true, message: "请选择受检机构" }],
|
|
|
+ planStartTime: [{ required: true, message: "请选择检查日期" }],
|
|
|
+ },
|
|
|
+ pointIdsWhenAdd: [],
|
|
|
+ mode: null,
|
|
|
+ };
|
|
|
+ },
|
|
|
+ dicts: ["rectification_deadline", "sys_user_is_lock"],
|
|
|
+ components: { SelectPoint, imgUpload, orgDropDown },
|
|
|
+ computed: {
|
|
|
+ ...mapGetters(["orgId", "roleList", "userId"]),
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ this.info.checkOrgId = this.orgId;
|
|
|
+ this.info.checkRoleId = this.roleList[0].roleId;
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ dayjs,
|
|
|
+ getLabel,
|
|
|
+ onCheckOrgSelect(node) {
|
|
|
+ if (node == null) {
|
|
|
+ this.prevCheckOrgType = null;
|
|
|
+ this.roleOptions = [];
|
|
|
+ this.checkRoleId = null;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (node.type == this.prevCheckOrgType) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ getNamesByOrgId(node.id).then((r) => {
|
|
|
+ this.roleOptions = r.data;
|
|
|
+ this.prevCheckOrgType = node.type;
|
|
|
+ if (!this.roleOptions.find((op) => op.id == this.info.checkRoleId)) {
|
|
|
+ this.info.checkRoleId = null;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ onBecheckOrgSelect(node) {
|
|
|
+ if (node == null) {
|
|
|
+ this.prevBecheckedOrgType = null;
|
|
|
+ this.info.checkList = [];
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (node.type == this.prevBecheckedOrgType) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.info.checkList = [];
|
|
|
+ this.prevBecheckedOrgType = node.type;
|
|
|
+ this.info.beCheckOrgType = node.type;
|
|
|
+ },
|
|
|
+ onAddPoint() {
|
|
|
+ if (!this.info.beCheckedOrgId) {
|
|
|
+ this.$message.info("请先选择受检机构");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!this.info.beCheckOrgType) {
|
|
|
+ this.$message.warning("受检机构的机构类型未知");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.pointIdsWhenAdd = [];
|
|
|
+ this.info.checkList.forEach((a) => {
|
|
|
+ a.itemList.forEach((i) => {
|
|
|
+ i.pointList.forEach((p) => {
|
|
|
+ this.pointIdsWhenAdd.push(p.pointId);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+ this.$refs.SelectPoint.show(this.pointIdsWhenAdd);
|
|
|
+ },
|
|
|
+ onSelectPoint(selectedList) {
|
|
|
+ let hasNew = false;
|
|
|
+ for (let index in selectedList) {
|
|
|
+ let p = selectedList[index];
|
|
|
+ if (this.pointIdsWhenAdd.indexOf(p.id) >= 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ let info = this.info;
|
|
|
+ let area = info.checkList.find((a) => a.areaId === p.areaId);
|
|
|
+ if (!area) {
|
|
|
+ area = { areaId: p.areaId, areaName: p.areaName, itemList: [] };
|
|
|
+ info.checkList.push(area);
|
|
|
+ }
|
|
|
+
|
|
|
+ let item = area.itemList.find((i) => i.itemId == p.itemId);
|
|
|
+ if (!item) {
|
|
|
+ item = { itemId: p.itemId, itemName: p.itemName, pointList: [] };
|
|
|
+ area.itemList.push(item);
|
|
|
+ }
|
|
|
+
|
|
|
+ let point = item.pointList.find((i) => i.pointId == p.id);
|
|
|
+ if (!point) {
|
|
|
+ point = {
|
|
|
+ pointId: p.id,
|
|
|
+ pointName: p.pointName,
|
|
|
+ mustCheck: 1,
|
|
|
+ isAdd: 1,
|
|
|
+ status: 0,
|
|
|
+ remark: null,
|
|
|
+ imgData: null,
|
|
|
+ rectificationDeadline: null,
|
|
|
+ submitBy: null,
|
|
|
+ submitTime: null,
|
|
|
+ };
|
|
|
+
|
|
|
+ item.pointList.push(point);
|
|
|
+ hasNew = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!hasNew) {
|
|
|
+ this.$message.info("没有可新增的检查内容");
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ onDeletePoint(area, item, point) {
|
|
|
+ if (point.isAdd === 0) {
|
|
|
+ this.$message.warning("不可删除计划的检查内容");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ let index = item.pointList.indexOf(point);
|
|
|
+ if (index >= 0) {
|
|
|
+ item.pointList.splice(index, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (item.pointList.length === 0) {
|
|
|
+ index = area.itemList.indexOf(item);
|
|
|
+ area.itemList.splice(index, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (area.itemList.length === 0) {
|
|
|
+ index = this.info.checkList.indexOf(area);
|
|
|
+ this.info.checkList.splice(index, 1);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onImageChanged(point, value) {
|
|
|
+ point.imgData = value
|
|
|
+ .split(",")
|
|
|
+ .map((img) => ({ id: null, imgPath: img }));
|
|
|
+ },
|
|
|
+ onClose() {
|
|
|
+ this.$tab.closePageAndPushPrev();
|
|
|
+ },
|
|
|
+ onSave() {
|
|
|
+ this.info.isSubmit = 0;
|
|
|
+ api.tempSubmit(this.info).then((r) => {
|
|
|
+ this.$message.info("保存成功");
|
|
|
+ });
|
|
|
+ },
|
|
|
+ async onSubmit() {
|
|
|
+ let isOk = true;
|
|
|
+ let rs = this.$refs;
|
|
|
+ for (let p in this.$refs) {
|
|
|
+ if (p.startsWith("point")) {
|
|
|
+ try {
|
|
|
+ let form = this.$refs[p];
|
|
|
+ if (form.length) {
|
|
|
+ isOk &= await this.$refs[p][0].validate();
|
|
|
+ } else {
|
|
|
+ isOk &= await this.$refs[p].validate();
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ isOk &= false;
|
|
|
+ console.error(e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (isOk) {
|
|
|
+ this.info.isSubmit = 1;
|
|
|
+ let data = { ...this.info };
|
|
|
+ data.checkRoles = [{ id: this.info.checkRoleId }];
|
|
|
+ api.tempSubmit(data).then((r) => {
|
|
|
+ this.$message.info("提交成功");
|
|
|
+ this.$tab.closePageAndPushPrev();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ },
|
|
|
+};
|
|
|
+</script>
|
|
|
+<style lang="scss" scoped>
|
|
|
+.content {
|
|
|
+ max-height: calc(100% - 300px);
|
|
|
+ overflow-y: auto;
|
|
|
+ margin-bottom: 20px;
|
|
|
+ margin-top: 20px;
|
|
|
+}
|
|
|
+.area_content {
|
|
|
+ border: #b8bdc0 1px solid;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+}
|
|
|
+
|
|
|
+.content > .area_content:first-child {
|
|
|
+ border-bottom: none;
|
|
|
+}
|
|
|
+
|
|
|
+.content > .area_content:last-child {
|
|
|
+ border-bottom: #b8bdc0 1px solid;
|
|
|
+}
|
|
|
+
|
|
|
+.area_content > div:nth-child(1) {
|
|
|
+ background-color: #e6e6e6;
|
|
|
+ border-right: #b8bdc0 1px solid;
|
|
|
+ padding-top: auto;
|
|
|
+ width: 15%;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ justify-content: center;
|
|
|
+ text-align: center;
|
|
|
+}
|
|
|
+
|
|
|
+.area_content > div:nth-child(2) {
|
|
|
+ width: 80%;
|
|
|
+ padding-left: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.safetycheck_item {
|
|
|
+ margin: 10px;
|
|
|
+ margin-bottom: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.safetycheck_point {
|
|
|
+ padding-top: 10px;
|
|
|
+ padding-left: 30px;
|
|
|
+
|
|
|
+ & > div {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.pointName {
|
|
|
+ width: 200px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+}
|
|
|
+.dialog-footer {
|
|
|
+ width: 100%;
|
|
|
+ text-align: right;
|
|
|
+ border-top: #b8bdc0 1px solid;
|
|
|
+ padding-top: 10px;
|
|
|
+ padding-right: 30px;
|
|
|
+ position: absolute;
|
|
|
+ bottom: 30px;
|
|
|
+ right: 0px;
|
|
|
+}
|
|
|
+.circle {
|
|
|
+ display: inline-block;
|
|
|
+ width: 5px;
|
|
|
+ height: 5px;
|
|
|
+ border-radius: 5px;
|
|
|
+ background-color: #000;
|
|
|
+ border: none;
|
|
|
+ margin-top: 10px;
|
|
|
+ margin-right: 10px;
|
|
|
+}
|
|
|
+</style>
|