From 346ffdf4c528ecfa8471a13cdb6f3740a29262e8 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: 星期一, 08 十二月 2025 10:37:28 +0800
Subject: [PATCH] 修改

---
 src/views/build/conpanyFunctionConsult/Decree/qualityManuals/components/editDialog.vue  |  241 +++++++
 src/views/build/conpanyFunctionConsult/Decree/qualityPolicys/index.vue                  |  213 ++++++
 src/views/system/clauseManage/index.vue                                                 |    2 
 src/views/build/conpanyFunctionConsult/Decree/qualityObjects/components/editDialog.vue  |  241 +++++++
 src/views/build/conpanyFunctionConsult/Decree/appointmentBook/index.vue                 |  213 ++++++
 src/views/build/conpanyFunctionConsult/Decree/qualityManuals/index.vue                  |  213 ++++++
 src/api/decree/index.js                                                                 |   32 +
 src/views/build/conpanyFunctionConsult/Decree/qualityObjects/index.vue                  |  213 ++++++
 src/views/build/conpanyFunctionConsult/Decree/qualityPolicys/components/editDialog.vue  |  241 +++++++
 src/views/build/conpanyFunctionConsult/Decree/appointmentBook/components/editDialog.vue |  241 +++++++
 10 files changed, 1,849 insertions(+), 1 deletions(-)

diff --git a/src/api/decree/index.js b/src/api/decree/index.js
new file mode 100644
index 0000000..3b92ce0
--- /dev/null
+++ b/src/api/decree/index.js
@@ -0,0 +1,32 @@
+import request from "@/utils/request";
+
+export function getDecree(params) {
+    return request({
+        url: '/proclaim/list',
+        method: 'get',
+        params: params
+    })
+}
+
+export function addDecree(data) {
+    return request({
+        url: '/proclaim/policy/insert',
+        method: 'post',
+        data: data
+    })
+}
+
+export function editDecree(params) {
+    return request({
+        url: `/proclaim/policy/update`,
+        method: 'post',
+        data: params
+    })
+}
+
+export function delDecree(data) {
+    return request({
+        url: `/proclaim/policy/deleted?proclaimId=${data}`,
+        method: 'get'
+    })
+}
diff --git a/src/views/build/conpanyFunctionConsult/Decree/appointmentBook/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/Decree/appointmentBook/components/editDialog.vue
new file mode 100644
index 0000000..76e08d1
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/Decree/appointmentBook/components/editDialog.vue
@@ -0,0 +1,241 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title"
+        width="800px"
+        :before-close="handleClose"
+    >
+      <el-form :model="state.noticeForm" size="default" ref="noticeRef" :rules="title === '新增' || title === '编辑' ? state.formRules : {}" label-width="150px" >
+        <el-form-item label="单位名称:" prop="companyId" v-if="state.isAdmin">
+          <el-select v-model="state.noticeForm.companyId" placeholder="请选择" @change="changeCom" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin">
+            <el-option
+                v-for="item in state.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="管理者代表授权书:" v-if="showEditor"  required>
+          <t-editor style="width: 800px" ref="myEditor" :toolbar="toolbar" :value="state.noticeForm.content" ></t-editor>
+        </el-form-item>
+        <el-form-item label="管理者代表授权书:" v-else>
+          <div class="ql-container ql-snow" style="height: 500px;width: 100%;margin-top: 10px;" >
+            <div class="ql-editor">
+              <div class="reviewTable" v-html="state.noticeForm.content" ></div>
+            </div>
+          </div>
+        </el-form-item>
+        <el-form-item label="批准人:" prop="checkId">
+          <el-select clearable v-model="state.noticeForm.checkId" :disabled="title =='查看'" filterable placeholder="批准人" style="width: 100%">
+            <el-option
+                v-for="item in state.userList"
+                :key="item.userId"
+                :label="item.name"
+                :value="item.userId"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer v-if="!isReview">
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {nextTick, onMounted, reactive, ref, toRefs, watch} from 'vue'
+import WeEditor from "@/components/WeEditor/index.vue";
+import TEditor from "@/components/Tinymce/Tinymce.vue"
+import {ElMessage} from "element-plus";
+import Cookies from "js-cookie";
+import {getEmployeeRecords} from "@/api/onlineEducation/user";
+import {addDecree, editDecree} from "@/api/decree";
+
+
+const emit = defineEmits(["getList"]);
+
+const dialogVisible = ref(false);
+const toolbar = ref('fontsizeselect | undo redo')
+const title = ref("");
+const noticeRef = ref();
+const fileList = ref([]);
+const myEditor = ref();
+const isReview = ref(false);
+const showEditor = ref(true);
+const state = reactive({
+  noticeForm: {
+    id: '',
+    content: '',
+    companyId:null,
+    checkId:null,
+    type:4,
+    companyName: ''
+  },
+  formRules:{
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    content: [{ required: true, message: '请输入管理者代表授权书', trigger: 'blur' }],
+    checkId: [{ required: true, message: '请选择批准人', trigger: 'blur' }],
+  },
+  isAdmin: false,
+  companyList: [],
+  userList:[]
+
+})
+
+onMounted(() => {
+
+});
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  if(state.isAdmin){
+    state.companyList = companyList
+    state.noticeForm.companyId = null
+  }else  {
+    state.noticeForm.companyId = userInfo.companyId
+  }
+  isReview.value = false;
+  showEditor.value = false
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    Object.keys(state.noticeForm).forEach(key => {
+      if (key in value) {
+        state.noticeForm[key] = value[key]
+      }
+    })
+  }
+  if(type === 'review') {
+    showEditor.value = false
+    isReview.value = true;
+  }
+  if(type === 'edit' || type === 'add') {
+    showEditor.value = true;
+    isReview.value = false;
+  }
+  await getUserList()
+  dialogVisible.value = true;
+}
+
+const onSubmit = async () => {
+  state.noticeForm.content = tinyMCE.activeEditor.getContent();
+  if(!state.isAdmin){
+    const userInfo = JSON.parse(Cookies.get('userInfo'))
+    state.noticeForm.companyId = userInfo.companyId
+  }
+  const valid = await noticeRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      const {id,...data} = JSON.parse(JSON.stringify(state.noticeForm))
+      const res = await addDecree(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '新增成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      reset();
+      showEditor.value=false
+      myEditor.value.clear();
+      noticeRef.value.clearValidate();
+      dialogVisible.value = false;
+    }else if(title.value === '编辑') {
+      const {...data} = JSON.parse(JSON.stringify(state.noticeForm))
+      const res = await editDecree(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '编辑成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      reset();
+      showEditor.value=false
+      myEditor.value.clear();
+      noticeRef.value.clearValidate();
+      dialogVisible.value = false;
+    }
+  }
+}
+const getUserList = async ()=> {
+  if(state.isAdmin && (state.noticeForm.companyId == 0 || state.noticeForm.companyId == null)){
+    return
+  }
+  const res = await getEmployeeRecords({companyId: state.noticeForm.companyId})
+  if(res.code == 200){
+    state.userList = res.data ? res.data :[]
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
+const handleClose = () => {
+  if(title.value ==="新增"|| title.value ==='编辑'){
+    myEditor.value.clear();
+    showEditor.value=false
+  }
+
+  reset()
+  noticeRef.value.clearValidate();
+  dialogVisible.value = false;
+}
+const reset = () => {
+  state.noticeForm = {
+    id: '',
+    content: '',
+    companyId:null,
+    checkId:null,
+    type:4,
+    companyName: ''
+  }
+  state.companyList = []
+  state.userList = []
+}
+const changeCom = () => {
+  state.noticeForm.checkId = ''
+  getUserList()
+}
+
+
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+.reviewTable {
+  :deep(table){
+    border: 1px solid #ccc;
+    text-align: center;
+  }
+  :deep(table td){
+    border: 1px solid #ccc;
+    text-align: center;
+    padding: 0 5px;
+  }
+  :deep(table th){
+    border: 1px solid #ccc;
+  }
+}
+
+
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/Decree/appointmentBook/index.vue b/src/views/build/conpanyFunctionConsult/Decree/appointmentBook/index.vue
new file mode 100644
index 0000000..0b9df13
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/Decree/appointmentBook/index.vue
@@ -0,0 +1,213 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+              v-hasPermi="['qualityManual:add']"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="单位名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="data.isAdmin">
+          <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>
+          <el-button plain @click="reset">重置</el-button>
+        </el-form-item>
+
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true">
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="管理者代表授权书" prop="content" align="left" header-align="center" width="500">
+        <template #default="scope">
+          <div v-html="scope.row.content"></div>
+        </template>
+      </el-table-column>
+      <el-table-column label="批准人" prop="checkName" align="center" />
+      <el-table-column label="签名" prop="policy" align="center" >
+        <template #default="scope">
+          <div v-if="scope.row.sign ">
+            <el-image
+                style="width: 100px; height: 100%"
+                :src= "scope.row.sign ? scope.row.sign[0] : '' "
+                :zoom-rate="1.2"
+                :max-scale="7"
+                :min-scale="0.2"
+                :preview-src-list="scope.row.sign ? scope.row.sign : '' "
+                :initial-index="0"
+                fit="cover"
+                :preview-teleported=true
+            />
+          </div>
+          <div v-else></div>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160">
+        <template #default="scope">
+          <el-button link type="primary"  @click="openDialog('review',scope.row)" >查看</el-button>
+          <el-button link type="primary"  @click="openDialog('edit',scope.row)" v-hasPermi="['qualityManual:edit']">编辑</el-button>
+          <el-button link type="danger"  @click="handleDelete(scope.row)" v-hasPermi="['qualityManual:del']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pag-container">
+      <el-pagination
+          v-model:current-page="data.queryParams.pageNum"
+          v-model:page-size="data.queryParams.pageSize"
+          :page-sizes="[10,15,20,25]"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <policyDialog ref="noticeRef" @getList = "getList"></policyDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import policyDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {delCom, getCom} from "@/api/companyInfo/overview";
+import {delPolicy, getPolicy} from "@/api/companyInfo/policy";
+import {delDecree, getDecree} from "@/api/decree";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const noticeRef = ref();
+const loadingCompany = ref(false)
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    type:4,
+    companyId: null,
+  },
+  companyList: [],
+  isAdmin: false,
+  companyName: ''
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  const res = await getDecree(data.queryParams);
+  if(res.code === 200){
+    dataList.value = res.data.list.map(item => {
+      return {
+        ...item,
+        sign: item.sign ? [import.meta.env.VITE_APP_BASE_API + '/' + item.sign] :[]
+      }
+    })
+    total.value = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false;
+}
+
+const searchClick = () => {
+  getList();
+}
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+    // data.queryParams.companyId = data.companyList[0].id
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  data.queryParams = {
+    companyId: null,
+    pageNum: 1,
+    pageSize: 10,
+    type:4,
+  }
+  data.companyName = ''
+  data.companyList = [];
+  getList();
+  getCompanyList()
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delDecree(val.id);
+        if(res.code === 200){
+          ElMessage({
+            type: 'success',
+            message: '删除成功'
+          });
+          getList();
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/Decree/qualityManuals/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/Decree/qualityManuals/components/editDialog.vue
new file mode 100644
index 0000000..06fdfee
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/Decree/qualityManuals/components/editDialog.vue
@@ -0,0 +1,241 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title"
+        width="800px"
+        :before-close="handleClose"
+    >
+      <el-form :model="state.noticeForm" size="default" ref="noticeRef" :rules="title === '新增' || title === '编辑' ? state.formRules : {}" label-width="140px" >
+        <el-form-item label="单位名称:" prop="companyId" v-if="state.isAdmin">
+          <el-select v-model="state.noticeForm.companyId" placeholder="请选择" @change="changeCom" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin">
+            <el-option
+                v-for="item in state.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="质量手册颁布令:" v-if="showEditor"  required>
+          <t-editor style="width: 800px" ref="myEditor" :toolbar="toolbar" :value="state.noticeForm.content" ></t-editor>
+        </el-form-item>
+        <el-form-item label="质量手册颁布令:" v-else>
+          <div class="ql-container ql-snow" style="height: 500px;width: 100%;margin-top: 10px;" >
+            <div class="ql-editor">
+              <div class="reviewTable" v-html="state.noticeForm.content" ></div>
+            </div>
+          </div>
+        </el-form-item>
+        <el-form-item label="批准人:" prop="checkId">
+          <el-select clearable v-model="state.noticeForm.checkId" :disabled="title =='查看'" filterable placeholder="批准人" style="width: 100%">
+            <el-option
+                v-for="item in state.userList"
+                :key="item.userId"
+                :label="item.name"
+                :value="item.userId"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer v-if="!isReview">
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {nextTick, onMounted, reactive, ref, toRefs, watch} from 'vue'
+import WeEditor from "@/components/WeEditor/index.vue";
+import TEditor from "@/components/Tinymce/Tinymce.vue"
+import {ElMessage} from "element-plus";
+import Cookies from "js-cookie";
+import {getEmployeeRecords} from "@/api/onlineEducation/user";
+import {addDecree, editDecree} from "@/api/decree";
+
+
+const emit = defineEmits(["getList"]);
+
+const dialogVisible = ref(false);
+const toolbar = ref('fontsizeselect | undo redo')
+const title = ref("");
+const noticeRef = ref();
+const fileList = ref([]);
+const myEditor = ref();
+const isReview = ref(false);
+const showEditor = ref(true);
+const state = reactive({
+  noticeForm: {
+    id: '',
+    content: '',
+    companyId:null,
+    checkId:null,
+    type:1,
+    companyName: ''
+  },
+  formRules:{
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    content: [{ required: true, message: '请输入质量手册颁布令', trigger: 'blur' }],
+    checkId: [{ required: true, message: '请选择批准人', trigger: 'blur' }],
+  },
+  isAdmin: false,
+  companyList: [],
+  userList:[]
+
+})
+
+onMounted(() => {
+
+});
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  if(state.isAdmin){
+    state.companyList = companyList
+    state.noticeForm.companyId = null
+  }else  {
+    state.noticeForm.companyId = userInfo.companyId
+  }
+  isReview.value = false;
+  showEditor.value = false
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    Object.keys(state.noticeForm).forEach(key => {
+      if (key in value) {
+        state.noticeForm[key] = value[key]
+      }
+    })
+  }
+  if(type === 'review') {
+    showEditor.value = false
+    isReview.value = true;
+  }
+  if(type === 'edit' || type === 'add') {
+    showEditor.value = true;
+    isReview.value = false;
+  }
+  await getUserList()
+  dialogVisible.value = true;
+}
+
+const onSubmit = async () => {
+  state.noticeForm.content = tinyMCE.activeEditor.getContent();
+  if(!state.isAdmin){
+    const userInfo = JSON.parse(Cookies.get('userInfo'))
+    state.noticeForm.companyId = userInfo.companyId
+  }
+  const valid = await noticeRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      const {id,...data} = JSON.parse(JSON.stringify(state.noticeForm))
+      const res = await addDecree(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '新增成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      reset();
+      showEditor.value=false
+      myEditor.value.clear();
+      noticeRef.value.clearValidate();
+      dialogVisible.value = false;
+    }else if(title.value === '编辑') {
+      const {...data} = JSON.parse(JSON.stringify(state.noticeForm))
+      const res = await editDecree(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '编辑成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      reset();
+      showEditor.value=false
+      myEditor.value.clear();
+      noticeRef.value.clearValidate();
+      dialogVisible.value = false;
+    }
+  }
+}
+const getUserList = async ()=> {
+  if(state.isAdmin && (state.noticeForm.companyId == 0 || state.noticeForm.companyId == null)){
+    return
+  }
+  const res = await getEmployeeRecords({companyId: state.noticeForm.companyId})
+  if(res.code == 200){
+    state.userList = res.data ? res.data :[]
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
+const handleClose = () => {
+  if(title.value ==="新增"|| title.value ==='编辑'){
+    myEditor.value.clear();
+    showEditor.value=false
+  }
+
+  reset()
+  noticeRef.value.clearValidate();
+  dialogVisible.value = false;
+}
+const reset = () => {
+  state.noticeForm = {
+    id: '',
+    content: '',
+    companyId:null,
+    checkId:null,
+    type:1,
+    companyName: ''
+  }
+  state.companyList = []
+  state.userList = []
+}
+const changeCom = () => {
+  state.noticeForm.checkId = ''
+  getUserList()
+}
+
+
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+.reviewTable {
+  :deep(table){
+    border: 1px solid #ccc;
+    text-align: center;
+  }
+  :deep(table td){
+    border: 1px solid #ccc;
+    text-align: center;
+    padding: 0 5px;
+  }
+  :deep(table th){
+    border: 1px solid #ccc;
+  }
+}
+
+
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/Decree/qualityManuals/index.vue b/src/views/build/conpanyFunctionConsult/Decree/qualityManuals/index.vue
new file mode 100644
index 0000000..24f6ab4
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/Decree/qualityManuals/index.vue
@@ -0,0 +1,213 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+              v-hasPermi="['qualityManual:add']"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="单位名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="data.isAdmin">
+          <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>
+          <el-button plain @click="reset">重置</el-button>
+        </el-form-item>
+
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true">
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="质量手册颁布令" prop="content" align="left" header-align="center" width="500">
+        <template #default="scope">
+          <div v-html="scope.row.content"></div>
+        </template>
+      </el-table-column>
+      <el-table-column label="批准人" prop="checkName" align="center" />
+      <el-table-column label="签名" prop="policy" align="center" >
+        <template #default="scope">
+          <div v-if="scope.row.sign ">
+            <el-image
+                style="width: 100px; height: 100%"
+                :src= "scope.row.sign ? scope.row.sign[0] : '' "
+                :zoom-rate="1.2"
+                :max-scale="7"
+                :min-scale="0.2"
+                :preview-src-list="scope.row.sign ? scope.row.sign : '' "
+                :initial-index="0"
+                fit="cover"
+                :preview-teleported=true
+            />
+          </div>
+          <div v-else></div>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160">
+        <template #default="scope">
+          <el-button link type="primary"  @click="openDialog('review',scope.row)" >查看</el-button>
+          <el-button link type="primary"  @click="openDialog('edit',scope.row)" v-hasPermi="['qualityManual:edit']">编辑</el-button>
+          <el-button link type="danger"  @click="handleDelete(scope.row)" v-hasPermi="['qualityManual:del']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pag-container">
+      <el-pagination
+          v-model:current-page="data.queryParams.pageNum"
+          v-model:page-size="data.queryParams.pageSize"
+          :page-sizes="[10,15,20,25]"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <policyDialog ref="noticeRef" @getList = "getList"></policyDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import policyDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {delCom, getCom} from "@/api/companyInfo/overview";
+import {delPolicy, getPolicy} from "@/api/companyInfo/policy";
+import {delDecree, getDecree} from "@/api/decree";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const noticeRef = ref();
+const loadingCompany = ref(false)
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    type:1,
+    companyId: null,
+  },
+  companyList: [],
+  isAdmin: false,
+  companyName: ''
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  const res = await getDecree(data.queryParams);
+  if(res.code === 200){
+    dataList.value = res.data.list.map(item => {
+      return {
+        ...item,
+        sign: item.sign ? [import.meta.env.VITE_APP_BASE_API + '/' + item.sign] :[]
+      }
+    })
+    total.value = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false;
+}
+
+const searchClick = () => {
+  getList();
+}
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+    // data.queryParams.companyId = data.companyList[0].id
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  data.queryParams = {
+    companyId: null,
+    pageNum: 1,
+    pageSize: 10,
+    type:1,
+  }
+  data.companyName = ''
+  data.companyList = [];
+  getList();
+  getCompanyList()
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delDecree(val.id);
+        if(res.code === 200){
+          ElMessage({
+            type: 'success',
+            message: '删除成功'
+          });
+          getList();
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/Decree/qualityObjects/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/Decree/qualityObjects/components/editDialog.vue
new file mode 100644
index 0000000..94eec94
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/Decree/qualityObjects/components/editDialog.vue
@@ -0,0 +1,241 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title"
+        width="800px"
+        :before-close="handleClose"
+    >
+      <el-form :model="state.noticeForm" size="default" ref="noticeRef" :rules="title === '新增' || title === '编辑' ? state.formRules : {}" label-width="140px" >
+        <el-form-item label="单位名称:" prop="companyId" v-if="state.isAdmin">
+          <el-select v-model="state.noticeForm.companyId" placeholder="请选择" @change="changeCom" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin">
+            <el-option
+                v-for="item in state.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="质量目标颁布令:" v-if="showEditor"  required>
+          <t-editor style="width: 800px" ref="myEditor" :toolbar="toolbar" :value="state.noticeForm.content" ></t-editor>
+        </el-form-item>
+        <el-form-item label="质量目标颁布令:" v-else>
+          <div class="ql-container ql-snow" style="height: 500px;width: 100%;margin-top: 10px;" >
+            <div class="ql-editor">
+              <div class="reviewTable" v-html="state.noticeForm.content" ></div>
+            </div>
+          </div>
+        </el-form-item>
+        <el-form-item label="批准人:" prop="checkId">
+          <el-select clearable v-model="state.noticeForm.checkId" :disabled="title =='查看'" filterable placeholder="批准人" style="width: 100%">
+            <el-option
+                v-for="item in state.userList"
+                :key="item.userId"
+                :label="item.name"
+                :value="item.userId"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer v-if="!isReview">
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {nextTick, onMounted, reactive, ref, toRefs, watch} from 'vue'
+import WeEditor from "@/components/WeEditor/index.vue";
+import TEditor from "@/components/Tinymce/Tinymce.vue"
+import {ElMessage} from "element-plus";
+import Cookies from "js-cookie";
+import {getEmployeeRecords} from "@/api/onlineEducation/user";
+import {addDecree, editDecree} from "@/api/decree";
+
+
+const emit = defineEmits(["getList"]);
+
+const dialogVisible = ref(false);
+const toolbar = ref('fontsizeselect | undo redo')
+const title = ref("");
+const noticeRef = ref();
+const fileList = ref([]);
+const myEditor = ref();
+const isReview = ref(false);
+const showEditor = ref(true);
+const state = reactive({
+  noticeForm: {
+    id: '',
+    content: '',
+    companyId:null,
+    checkId:null,
+    type:3,
+    companyName: ''
+  },
+  formRules:{
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    content: [{ required: true, message: '请输入质量目标颁布令', trigger: 'blur' }],
+    checkId: [{ required: true, message: '请选择批准人', trigger: 'blur' }],
+  },
+  isAdmin: false,
+  companyList: [],
+  userList:[]
+
+})
+
+onMounted(() => {
+
+});
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  if(state.isAdmin){
+    state.companyList = companyList
+    state.noticeForm.companyId = null
+  }else  {
+    state.noticeForm.companyId = userInfo.companyId
+  }
+  isReview.value = false;
+  showEditor.value = false
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    Object.keys(state.noticeForm).forEach(key => {
+      if (key in value) {
+        state.noticeForm[key] = value[key]
+      }
+    })
+  }
+  if(type === 'review') {
+    showEditor.value = false
+    isReview.value = true;
+  }
+  if(type === 'edit' || type === 'add') {
+    showEditor.value = true;
+    isReview.value = false;
+  }
+  await getUserList()
+  dialogVisible.value = true;
+}
+
+const onSubmit = async () => {
+  state.noticeForm.content = tinyMCE.activeEditor.getContent();
+  if(!state.isAdmin){
+    const userInfo = JSON.parse(Cookies.get('userInfo'))
+    state.noticeForm.companyId = userInfo.companyId
+  }
+  const valid = await noticeRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      const {id,...data} = JSON.parse(JSON.stringify(state.noticeForm))
+      const res = await addDecree(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '新增成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      reset();
+      showEditor.value=false
+      myEditor.value.clear();
+      noticeRef.value.clearValidate();
+      dialogVisible.value = false;
+    }else if(title.value === '编辑') {
+      const {...data} = JSON.parse(JSON.stringify(state.noticeForm))
+      const res = await editDecree(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '编辑成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      reset();
+      showEditor.value=false
+      myEditor.value.clear();
+      noticeRef.value.clearValidate();
+      dialogVisible.value = false;
+    }
+  }
+}
+const getUserList = async ()=> {
+  if(state.isAdmin && (state.noticeForm.companyId == 0 || state.noticeForm.companyId == null)){
+    return
+  }
+  const res = await getEmployeeRecords({companyId: state.noticeForm.companyId})
+  if(res.code == 200){
+    state.userList = res.data ? res.data :[]
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
+const handleClose = () => {
+  if(title.value ==="新增"|| title.value ==='编辑'){
+    myEditor.value.clear();
+    showEditor.value=false
+  }
+
+  reset()
+  noticeRef.value.clearValidate();
+  dialogVisible.value = false;
+}
+const reset = () => {
+  state.noticeForm = {
+    id: '',
+    content: '',
+    companyId:null,
+    checkId:null,
+    type:3,
+    companyName: ''
+  }
+  state.companyList = []
+  state.userList = []
+}
+const changeCom = () => {
+  state.noticeForm.checkId = ''
+  getUserList()
+}
+
+
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+.reviewTable {
+  :deep(table){
+    border: 1px solid #ccc;
+    text-align: center;
+  }
+  :deep(table td){
+    border: 1px solid #ccc;
+    text-align: center;
+    padding: 0 5px;
+  }
+  :deep(table th){
+    border: 1px solid #ccc;
+  }
+}
+
+
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/Decree/qualityObjects/index.vue b/src/views/build/conpanyFunctionConsult/Decree/qualityObjects/index.vue
new file mode 100644
index 0000000..6ebd177
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/Decree/qualityObjects/index.vue
@@ -0,0 +1,213 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+              v-hasPermi="['qualityManual:add']"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="单位名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="data.isAdmin">
+          <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>
+          <el-button plain @click="reset">重置</el-button>
+        </el-form-item>
+
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true">
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="质量目标颁布令" prop="content" align="left" header-align="center" width="500">
+        <template #default="scope">
+          <div v-html="scope.row.content"></div>
+        </template>
+      </el-table-column>
+      <el-table-column label="批准人" prop="checkName" align="center" />
+      <el-table-column label="签名" prop="policy" align="center" >
+        <template #default="scope">
+          <div v-if="scope.row.sign ">
+            <el-image
+                style="width: 100px; height: 100%"
+                :src= "scope.row.sign ? scope.row.sign[0] : '' "
+                :zoom-rate="1.2"
+                :max-scale="7"
+                :min-scale="0.2"
+                :preview-src-list="scope.row.sign ? scope.row.sign : '' "
+                :initial-index="0"
+                fit="cover"
+                :preview-teleported=true
+            />
+          </div>
+          <div v-else></div>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160">
+        <template #default="scope">
+          <el-button link type="primary"  @click="openDialog('review',scope.row)" >查看</el-button>
+          <el-button link type="primary"  @click="openDialog('edit',scope.row)" v-hasPermi="['qualityManual:edit']">编辑</el-button>
+          <el-button link type="danger"  @click="handleDelete(scope.row)" v-hasPermi="['qualityManual:del']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pag-container">
+      <el-pagination
+          v-model:current-page="data.queryParams.pageNum"
+          v-model:page-size="data.queryParams.pageSize"
+          :page-sizes="[10,15,20,25]"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <policyDialog ref="noticeRef" @getList = "getList"></policyDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import policyDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {delCom, getCom} from "@/api/companyInfo/overview";
+import {delPolicy, getPolicy} from "@/api/companyInfo/policy";
+import {delDecree, getDecree} from "@/api/decree";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const noticeRef = ref();
+const loadingCompany = ref(false)
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    type:3,
+    companyId: null,
+  },
+  companyList: [],
+  isAdmin: false,
+  companyName: ''
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  const res = await getDecree(data.queryParams);
+  if(res.code === 200){
+    dataList.value = res.data.list.map(item => {
+      return {
+        ...item,
+        sign: item.sign ? [import.meta.env.VITE_APP_BASE_API + '/' + item.sign] :[]
+      }
+    })
+    total.value = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false;
+}
+
+const searchClick = () => {
+  getList();
+}
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+    // data.queryParams.companyId = data.companyList[0].id
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  data.queryParams = {
+    companyId: null,
+    pageNum: 1,
+    pageSize: 10,
+    type:3,
+  }
+  data.companyName = ''
+  data.companyList = [];
+  getList();
+  getCompanyList()
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delDecree(val.id);
+        if(res.code === 200){
+          ElMessage({
+            type: 'success',
+            message: '删除成功'
+          });
+          getList();
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/Decree/qualityPolicys/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/Decree/qualityPolicys/components/editDialog.vue
new file mode 100644
index 0000000..bca4f49
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/Decree/qualityPolicys/components/editDialog.vue
@@ -0,0 +1,241 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title"
+        width="800px"
+        :before-close="handleClose"
+    >
+      <el-form :model="state.noticeForm" size="default" ref="noticeRef" :rules="title === '新增' || title === '编辑' ? state.formRules : {}" label-width="140px" >
+        <el-form-item label="单位名称:" prop="companyId" v-if="state.isAdmin">
+          <el-select v-model="state.noticeForm.companyId" placeholder="请选择" @change="changeCom" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin">
+            <el-option
+                v-for="item in state.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="质量方针颁布令:" v-if="showEditor"  required>
+          <t-editor style="width: 800px" ref="myEditor" :toolbar="toolbar" :value="state.noticeForm.content" ></t-editor>
+        </el-form-item>
+        <el-form-item label="质量方针颁布令:" v-else>
+          <div class="ql-container ql-snow" style="height: 500px;width: 100%;margin-top: 10px;" >
+            <div class="ql-editor">
+              <div class="reviewTable" v-html="state.noticeForm.content" ></div>
+            </div>
+          </div>
+        </el-form-item>
+        <el-form-item label="批准人:" prop="checkId">
+          <el-select clearable v-model="state.noticeForm.checkId" :disabled="title =='查看'" filterable placeholder="批准人" style="width: 100%">
+            <el-option
+                v-for="item in state.userList"
+                :key="item.userId"
+                :label="item.name"
+                :value="item.userId"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer v-if="!isReview">
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {nextTick, onMounted, reactive, ref, toRefs, watch} from 'vue'
+import WeEditor from "@/components/WeEditor/index.vue";
+import TEditor from "@/components/Tinymce/Tinymce.vue"
+import {ElMessage} from "element-plus";
+import Cookies from "js-cookie";
+import {getEmployeeRecords} from "@/api/onlineEducation/user";
+import {addDecree, editDecree} from "@/api/decree";
+
+
+const emit = defineEmits(["getList"]);
+
+const dialogVisible = ref(false);
+const toolbar = ref('fontsizeselect | undo redo')
+const title = ref("");
+const noticeRef = ref();
+const fileList = ref([]);
+const myEditor = ref();
+const isReview = ref(false);
+const showEditor = ref(true);
+const state = reactive({
+  noticeForm: {
+    id: '',
+    content: '',
+    companyId:null,
+    checkId:null,
+    type:2,
+    companyName: ''
+  },
+  formRules:{
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    content: [{ required: true, message: '请输入质量方针颁布令', trigger: 'blur' }],
+    checkId: [{ required: true, message: '请选择批准人', trigger: 'blur' }],
+  },
+  isAdmin: false,
+  companyList: [],
+  userList:[]
+
+})
+
+onMounted(() => {
+
+});
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  if(state.isAdmin){
+    state.companyList = companyList
+    state.noticeForm.companyId = null
+  }else  {
+    state.noticeForm.companyId = userInfo.companyId
+  }
+  isReview.value = false;
+  showEditor.value = false
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    Object.keys(state.noticeForm).forEach(key => {
+      if (key in value) {
+        state.noticeForm[key] = value[key]
+      }
+    })
+  }
+  if(type === 'review') {
+    showEditor.value = false
+    isReview.value = true;
+  }
+  if(type === 'edit' || type === 'add') {
+    showEditor.value = true;
+    isReview.value = false;
+  }
+  await getUserList()
+  dialogVisible.value = true;
+}
+
+const onSubmit = async () => {
+  state.noticeForm.content = tinyMCE.activeEditor.getContent();
+  if(!state.isAdmin){
+    const userInfo = JSON.parse(Cookies.get('userInfo'))
+    state.noticeForm.companyId = userInfo.companyId
+  }
+  const valid = await noticeRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      const {id,...data} = JSON.parse(JSON.stringify(state.noticeForm))
+      const res = await addDecree(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '新增成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      reset();
+      showEditor.value=false
+      myEditor.value.clear();
+      noticeRef.value.clearValidate();
+      dialogVisible.value = false;
+    }else if(title.value === '编辑') {
+      const {...data} = JSON.parse(JSON.stringify(state.noticeForm))
+      const res = await editDecree(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '编辑成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      reset();
+      showEditor.value=false
+      myEditor.value.clear();
+      noticeRef.value.clearValidate();
+      dialogVisible.value = false;
+    }
+  }
+}
+const getUserList = async ()=> {
+  if(state.isAdmin && (state.noticeForm.companyId == 0 || state.noticeForm.companyId == null)){
+    return
+  }
+  const res = await getEmployeeRecords({companyId: state.noticeForm.companyId})
+  if(res.code == 200){
+    state.userList = res.data ? res.data :[]
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
+const handleClose = () => {
+  if(title.value ==="新增"|| title.value ==='编辑'){
+    myEditor.value.clear();
+    showEditor.value=false
+  }
+
+  reset()
+  noticeRef.value.clearValidate();
+  dialogVisible.value = false;
+}
+const reset = () => {
+  state.noticeForm = {
+    id: '',
+    content: '',
+    companyId:null,
+    checkId:null,
+    type:2,
+    companyName: ''
+  }
+  state.companyList = []
+  state.userList = []
+}
+const changeCom = () => {
+  state.noticeForm.checkId = ''
+  getUserList()
+}
+
+
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+.reviewTable {
+  :deep(table){
+    border: 1px solid #ccc;
+    text-align: center;
+  }
+  :deep(table td){
+    border: 1px solid #ccc;
+    text-align: center;
+    padding: 0 5px;
+  }
+  :deep(table th){
+    border: 1px solid #ccc;
+  }
+}
+
+
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/Decree/qualityPolicys/index.vue b/src/views/build/conpanyFunctionConsult/Decree/qualityPolicys/index.vue
new file mode 100644
index 0000000..29259cd
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/Decree/qualityPolicys/index.vue
@@ -0,0 +1,213 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+              v-hasPermi="['qualityManual:add']"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="单位名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="data.isAdmin">
+          <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>
+          <el-button plain @click="reset">重置</el-button>
+        </el-form-item>
+
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true">
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="质量方针颁布令" prop="content" align="left" header-align="center" width="500">
+        <template #default="scope">
+          <div v-html="scope.row.content"></div>
+        </template>
+      </el-table-column>
+      <el-table-column label="批准人" prop="checkName" align="center" />
+      <el-table-column label="签名" prop="policy" align="center" >
+        <template #default="scope">
+          <div v-if="scope.row.sign ">
+            <el-image
+                style="width: 100px; height: 100%"
+                :src= "scope.row.sign ? scope.row.sign[0] : '' "
+                :zoom-rate="1.2"
+                :max-scale="7"
+                :min-scale="0.2"
+                :preview-src-list="scope.row.sign ? scope.row.sign : '' "
+                :initial-index="0"
+                fit="cover"
+                :preview-teleported=true
+            />
+          </div>
+          <div v-else></div>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160">
+        <template #default="scope">
+          <el-button link type="primary"  @click="openDialog('review',scope.row)" >查看</el-button>
+          <el-button link type="primary"  @click="openDialog('edit',scope.row)" v-hasPermi="['qualityManual:edit']">编辑</el-button>
+          <el-button link type="danger"  @click="handleDelete(scope.row)" v-hasPermi="['qualityManual:del']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pag-container">
+      <el-pagination
+          v-model:current-page="data.queryParams.pageNum"
+          v-model:page-size="data.queryParams.pageSize"
+          :page-sizes="[10,15,20,25]"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <policyDialog ref="noticeRef" @getList = "getList"></policyDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import policyDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {delCom, getCom} from "@/api/companyInfo/overview";
+import {delPolicy, getPolicy} from "@/api/companyInfo/policy";
+import {delDecree, getDecree} from "@/api/decree";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const noticeRef = ref();
+const loadingCompany = ref(false)
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    type:2,
+    companyId: null,
+  },
+  companyList: [],
+  isAdmin: false,
+  companyName: ''
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  const res = await getDecree(data.queryParams);
+  if(res.code === 200){
+    dataList.value = res.data.list.map(item => {
+      return {
+        ...item,
+        sign: item.sign ? [import.meta.env.VITE_APP_BASE_API + '/' + item.sign] :[]
+      }
+    })
+    total.value = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false;
+}
+
+const searchClick = () => {
+  getList();
+}
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+    // data.queryParams.companyId = data.companyList[0].id
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  data.queryParams = {
+    companyId: null,
+    pageNum: 1,
+    pageSize: 10,
+    type:2,
+  }
+  data.companyName = ''
+  data.companyList = [];
+  getList();
+  getCompanyList()
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delDecree(val.id);
+        if(res.code === 200){
+          ElMessage({
+            type: 'success',
+            message: '删除成功'
+          });
+          getList();
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
+</style>
diff --git a/src/views/system/clauseManage/index.vue b/src/views/system/clauseManage/index.vue
index 2c86f35..b0d5fd1 100644
--- a/src/views/system/clauseManage/index.vue
+++ b/src/views/system/clauseManage/index.vue
@@ -33,7 +33,7 @@
       <el-table-column label="条款编号" prop="clauseNum" align="center" width="90"/>
       <el-table-column label="条款内容" prop="name" align="center" width="150"/>
 <!--      <el-table-column label="审核要点" prop="points" align="center"/>-->
-      <el-table-column label="审核要点" prop="points" align="center" >
+      <el-table-column label="审核要点" prop="points" align="left" header-align="center" >
         <template #default="scope">
           <div  v-html="scope.row.points"  ></div>
         </template>

--
Gitblit v1.9.2