Jelajahi Sumber

Merge remote-tracking branch 'origin/master'

yusm 1 tahun lalu
induk
melakukan
9a4e0e5e82
28 mengubah file dengan 1505 tambahan dan 479 penghapusan
  1. 68 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/api.ts
  2. 330 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/index.vue
  3. 29 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/type.d.ts
  4. 5 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/api.ts
  5. 92 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/component/relatedProducts.vue
  6. 30 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/detail/index.vue
  7. 87 35
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/index.vue
  8. 38 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/type.d.ts
  9. 5 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/customForm/index.vue
  10. 0 141
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/TaskModal.vue
  11. 1 30
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/api.ts
  12. 42 6
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue
  13. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/styles/global.scss
  14. 14 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/type.d.ts
  15. 4 2
      fhKeeper/formulahousekeeper/customerBuler-crm/vite.config.ts
  16. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java
  17. 41 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalCheckController.java
  18. 122 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalController.java
  19. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApproval.java
  20. 57 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApprovalCheck.java
  21. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectApprovalCheckMapper.java
  22. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectApprovalCheckService.java
  23. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectApprovalService.java
  24. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalCheckServiceImpl.java
  25. 39 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalServiceImpl.java
  26. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  27. 19 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectApprovalCheckMapper.xml
  28. 419 244
      fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue

+ 68 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/api.ts

@@ -0,0 +1,68 @@
+export const defalutModalForm = {
+  taskName: "", //任务名称
+  priority: "", //优先级
+  taskType: "0", //  任务类型
+  customerId: null, //  客户id 0
+  businessId: null, //商机id 1
+  orderId: null, //  订单id 2
+  clueId: null, //线索id 3
+  contactsId: null, //联系人id
+  executorId: null, //执行人id
+  repeat: "0", //是否重复
+  repeatType: "0", //重复类型
+  endType: "1", //结束类型
+  repeatEndNever: "1",
+  repeatEndCount: null, //重复指定次数次数后结束
+  repeatEndDate: null, //重复到指定日期后结束
+  repeatDesignDay: null, //自定义日期
+  repeatDesignSameday: null, //自定义周期
+  startDate: "", //开始日期
+  endDate: "", //截止日期
+  taskDesc: "", //任务描述
+  taskLogs: [],
+};
+export const PRIORITY = [
+  //优先级
+  { label: "高", value: "0" },
+  { label: "中", value: "1" },
+  { label: "低", value: "2" },
+];
+
+export const TASK_TYPE = [
+  // 弹窗任务类型
+  { label: "客户", value: "0", show: true },
+  { label: "商机", value: "1", show: true },
+  { label: "销售订单", value: "2", show: true },
+  { label: "线索", value: "3", show: false },
+];
+export const TASK_TYPE_FIELD = [
+  {
+    type: "0",
+    field: "customerId",
+  },
+  {
+    type: "1",
+    field: "businessId",
+  },
+  {
+    type: "2",
+    field: "orderId",
+  },
+  {
+    type: "3",
+    field: "clueId",
+  },
+];
+
+export const REPEAT_TYPE = [
+  { label: "每天", value: "0" },
+  { label: "每周", value: "1" },
+  { label: "每月", value: "2" },
+  { label: "自定义周期", value: "3" },
+  { label: "自定义日期", value: "4" },
+];
+export const defaultGenerateFormData = {
+  list: [],
+  config: {},
+};
+export const CUSTOMER_FORM_URL = "/sys-form/getListByCode/tasks";

+ 330 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/index.vue

@@ -0,0 +1,330 @@
+<template>
+  <el-dialog v-model="modalVisible" width="800px" :show-close="false" :close-on-click-modal="false" top="10vh">
+    <template #header="{ titleId, titleClass }">
+      <div class="flex justify-between items-center border-b pb-3">
+        <h4 :id="titleId" :class="titleClass">{{ editForm ? '编辑任务' : '新增任务' }}</h4>
+        <div>
+          <el-button v-if="!editForm" type="primary" :loading="['2'].includes(props.saveLoading)"
+            @click="submitForm(formRef, true)">保存并新建</el-button>
+          <el-button type="primary" :loading="['2'].includes(props.saveLoading)"
+            @click="submitForm(formRef, false)">保存</el-button>
+          <el-button @click="closeVisible()">取消</el-button>
+        </div>
+      </div>
+    </template>
+    <div class="h-[55vh] overflow-y-auto scroll-bar">
+      <el-form ref="formRef" :model="form" label-width="100px" :rules="rules" class="flex flex-wrap form">
+        <el-form-item label="任务名称" prop="taskName" required>
+          <el-input v-model="form.taskName" type="textarea" placeholder="请输入任务名称" clearable maxlength="100"
+            show-word-limit />
+        </el-form-item>
+        <el-form-item prop="priority" label="优先级" required>
+          <el-select v-model="form.priority" placeholder="请选择" clearable>
+            <el-option v-for="item in PRIORITY " :key="item.value" :value="item.value" :label="item.label" />
+          </el-select>
+        </el-form-item>
+        <el-form-item :label="form.taskType">
+          <template #label>
+            <el-select v-model="form.taskType" class="border resetSelect" style="width: 100px" @change="changeTaskType">
+              <el-option v-for="item in TASK_TYPE" :key="item.value" :value="item.value" :label="item.label" />
+            </el-select>
+          </template>
+          <template v-for="item in TASK_TYPE_FIELD">
+            <el-select v-model="form[item.field]" v-if="form.taskType == item.type" placeholder="请选择" clearable
+              filterable>
+              <el-option v-for="item in taskTypeValueData" :key="item.value" :value="item.value" :label="item.label" />
+            </el-select>
+          </template>
+        </el-form-item>
+        <el-form-item label="联系人" v-if="TASK_TYPE.find(v => v.value === (form.taskType || '1'))?.show">
+          <el-select v-model="form.contactsId" placeholder="请选择" clearable filterable>
+            <el-option v-for="item in contactValueData" :key="item.value" :value="item.value" :label="item.label" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="执行人">
+          <el-select v-model="form.executorId" placeholder="请选择" clearable multiple filterable>
+            <el-option v-for="item in executorValueData" :key="item.value" :value="item.value" :label="item.label" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="重复提醒">
+          <el-switch v-model="form.repeat" active-value="1" inactive-value="0" @change="changeRepeat" />
+        </el-form-item>
+        <template v-if="form.repeat === '1'">
+          <el-form-item label="重复类型" label-width="7em">
+            <el-select v-model="form.repeatType" placeholder="请选择" @change="changeRepeatType">
+              <el-option v-for="item in REPEAT_TYPE" :key="item.value" :value="item.value" :label="item.label" />
+            </el-select>
+          </el-form-item>
+          <template v-if="['0', '1', '2', '3'].includes(form.repeatType)">
+            <el-form-item label="每" label-width="7em" v-if="form.repeatType == 3">
+              <el-input-number v-model="form.repeatDesignSameday" controls-position="right" :min="1" />天
+            </el-form-item>
+            <el-form-item label="结束" label-width="7em">
+              <el-radio-group v-model="form.endType" @change="changeEndType">
+                <el-radio label="1" class="w-full">永不</el-radio>
+                <el-radio label="2" class="w-full mb-3"><el-input-number v-model="form.repeatEndCount" :min="1"
+                    controls-position="right" />
+                  次以后
+                </el-radio>
+                <el-radio label="3" class="w-full">
+                  <el-date-picker v-model="form.repeatEndDate" type="date" placeholder="选择日期" style="width:65%"
+                    :disabled-date="(value: Date) => (new Date() > new Date(value))" />
+                  以后
+                </el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </template>
+          <template v-if="['4'].includes(form.repeatType)">
+            <el-form-item v-for="(v, i) in customeDate" class="flex justify-between items-center customeDate">
+              <div>
+                第{{ i + 1 }}次重复在
+                <el-input-number :model-value="Number(v)" controls-position="right" @change="changeDate(i, $event)"
+                  :min="1" />
+                天后
+              </div>
+              <div>
+                <el-icon size="24" @click="deleteCustomeDateItem(i)" class=" hover:text-blue-500 cursor-pointer">
+                  <Delete />
+                </el-icon>
+              </div>
+            </el-form-item>
+            <el-form-item>
+              <div>
+                <el-icon size="24" @click="addCustomeDateItem()" class=" hover:text-blue-500 cursor-pointer">
+                  <Plus />
+                </el-icon>
+              </div>
+            </el-form-item>
+          </template>
+        </template>
+        <el-form-item label="开始时间" label-width="7em" class="w50">
+          <el-date-picker v-model="form.startDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
+        </el-form-item>
+        <el-form-item label="截止时间" label-width="7em" class="w50">
+          <el-date-picker v-model="form.endDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
+        </el-form-item>
+      </el-form>
+      <GenerateForm ref="generateFormRef" :data="generateFormData" :value="form" />
+      <div v-if="editForm">
+        <el-form-item label="操作记录" label-width="7em">
+        </el-form-item>
+      </div>
+    </div>
+  </el-dialog>
+</template>
+
+<script lang="ts" setup>
+import { ref, watch } from 'vue';
+import { PRIORITY, TASK_TYPE, TASK_TYPE_FIELD, defalutModalForm, REPEAT_TYPE, CUSTOMER_FORM_URL, defaultGenerateFormData } from "./api";
+import { GenerateForm } from "@zmjs/form-design"
+import { get } from '@/utils/request';
+import { Delete, Plus } from "@element-plus/icons-vue"
+import { FormInstance } from 'element-plus';
+import { getFromValue } from '@/utils/tools';
+import { Props, Emits, TASK_VALUE_TYPE, REPEAT_VALUE_TYPE, } from './type';
+const props = defineProps<Props>()
+const emits = defineEmits<Emits>();
+watch(() => props.saveLoading, (val) => {
+  if (val == "3") {
+    formRef.value?.resetFields();
+    form.value = { ...defalutModalForm };
+  }
+})
+watch(() => props.visible, (val) => {
+  formRef.value?.resetFields();
+  modalVisible.value = val
+  if (val) {
+    get(CUSTOMER_FORM_URL).then(res => {
+      if (Array.isArray(res.data) && res.data.length > 0) {
+        generateFormData.value = JSON.parse(res.data[0].config)
+      }
+    })
+  }
+})
+watch(() => props.editForm, (val) => {
+  if (!val) {
+    //TODO 如果是新增
+    form.value = { ...defalutModalForm };
+    taskTypeValueData.value = [{ label: '客户1', value: '1' }, { label: '客户2', value: '2' }];
+    contactValueData.value = [{ label: '联系人1', value: '1' }, { label: '联系人2', value: '2' }];
+    executorValueData.value = [{ label: '执行人1', value: '1' }, { label: '执行人2', value: '2' }];
+    return
+  }
+  //TODO 如果是编辑
+  form.value = { ...val };
+  customeDate.value = (form.value.repeatDesignSameday || "").split(',').filter(Boolean);
+  changeTaskType(form.value.taskType)
+  contactValueData.value = [{ label: '联系人1', value: '1' }, { label: '联系人2', value: '2' }];
+  executorValueData.value = [{ label: '执行人1', value: '1' }, { label: '执行人2', value: '2' }];
+
+})
+const rules = ref({
+  taskName: [
+    { required: true, message: '请输入任务名称', trigger: 'blur' }
+  ],
+  priority: [
+    { required: true, message: '请选择优先级', trigger: 'change' }
+  ]
+})
+const form = ref<any>({});
+const formRef = ref<FormInstance>();
+const generateFormRef = ref<typeof GenerateForm>();
+const generateFormData = ref<any>(defaultGenerateFormData);
+
+const modalVisible = ref(false);
+function closeVisible() {
+  generateFormData.value = defaultGenerateFormData;
+  emits('close')
+}
+function submitForm(formEl: FormInstance | undefined, isClose: boolean) {
+  if (!formEl) return
+  formEl.validate((valid) => {
+    if (!valid) {
+      return false
+    }
+    const repeatDesignDay = customeDate.value.join(",")
+    generateFormRef.value?.getData().then((res: any) => {
+      let submitData = getFromValue({
+        ...form.value,
+        repeatDesignDay,
+        ...res
+      })
+      emits('submit', submitData, isClose)
+    }).catch((err: any) => {
+      console.log(err);
+    })
+  })
+}
+
+const taskTypeValueData = ref<any>([])
+function changeTaskType(value: TASK_VALUE_TYPE) {
+  form.value = {
+    ...form.value,
+    taskType: value,
+    customerId: null, //  客户id 0
+    businessId: null, //商机id 1
+    orderId: null, //  订单id 2
+    clueId: null, //线索id 3
+    contactsId: null, //联系人id
+  }
+  switch (value) {
+    case "0":
+      taskTypeValueData.value = [];
+      setTimeout(() => {
+        taskTypeValueData.value = [{ label: '客户1', value: '1' }, { label: '客户2', value: '2' }];
+      }, 500)
+      break;
+    case '1':
+      taskTypeValueData.value = [];
+      setTimeout(() => {
+        taskTypeValueData.value = [{ label: "商机1", value: "1" }, { label: "商机2", value: "2" }]
+      }, 500)
+      break;
+    case '2':
+      taskTypeValueData.value = [];
+      setTimeout(() => {
+        taskTypeValueData.value = [{ label: "订单1", value: "1" }, { label: "订单2", value: "2" }]
+      }, 500)
+      break;
+    case '3':
+      taskTypeValueData.value = [];
+      setTimeout(() => {
+        taskTypeValueData.value = [{ label: "线索1", value: "1" }, { label: "线索2", value: "2" }]
+      }, 500)
+      break;
+    default:
+      const _n: never = value;
+      break;
+  }
+}
+
+const contactValueData = ref<any>([])
+
+const executorValueData = ref<any>([])
+
+function changeRepeat(value: string | number | boolean) {
+  form.value = {
+    ...form.value,
+    repeat: value,
+    repeatType: "0", //重复类型
+    endType: "1", //结束类型
+    repeatEndNever: "1",
+    repeatEndCount: null, //重复指定次数次数后结束
+    repeatEndDate: null, //重复到指定日期后结束
+    repeatDesignDay: null, //自定义日期
+    repeatDesignSameday: null, //自定义周期
+  }
+  customeDate.value = [];
+}
+
+function changeRepeatType(value: REPEAT_VALUE_TYPE) {
+  form.value = {
+    ...form.value,
+    repeatType: value, //重复类型
+    endType: "1", //结束类型
+    repeatEndNever: "1",
+    repeatEndCount: null, //重复指定次数次数后结束
+    repeatEndDate: null, //重复到指定日期后结束
+    repeatDesignDay: null, //自定义日期
+    repeatDesignSameday: null, //自定义周期
+  }
+  customeDate.value = [];
+}
+
+function changeEndType(value: string | number | boolean) {
+  form.value = {
+    ...form.value,
+    endType: value, //重复类型
+    repeatEndNever: value == "1" ? "1" : null,//永不结束
+    repeatEndCount: null, //重复指定次数次数后结束
+    repeatEndDate: null, //重复到指定日期后结束
+    repeatDesignDay: null, //自定义日期
+    repeatDesignSameday: null, //自定义周期
+  }
+}
+
+const customeDate = ref<any>([])
+function changeDate(index: number, value: number | undefined) {
+  customeDate.value[index] = value;
+}
+function deleteCustomeDateItem(index: number) {
+  customeDate.value = customeDate.value.filter((_item: number, i: number) => i !== index);
+}
+function addCustomeDateItem() {
+  customeDate.value.push(undefined)
+}
+
+
+</script>
+
+<style lang="scss">
+.resetSelect {
+  border: 0;
+
+  .el-select__wrapper {
+    box-shadow: none;
+    padding-right: 0;
+  }
+
+  .el-select__selected-item {
+    text-align: right;
+  }
+}
+
+.customeDate {
+
+  .el-form-item__content {
+    justify-content: space-between;
+  }
+}
+
+.el-form-item {
+  width: 100%;
+}
+
+.form {
+  .w50 {
+    @apply w-1/2;
+  }
+}
+</style>

+ 29 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/type.d.ts

@@ -0,0 +1,29 @@
+type TASK_VALUE_TYPE = "0" | "1" | "2" | "3";
+type REPEAT_VALUE_TYPE = "0" | "1" | "2" | "3" | "4";
+export interface Props {
+  /**
+   *  弹窗是否显示
+   */
+  visible: boolean;
+  /**
+   *  保存按钮loading
+   */
+  saveLoading: saveLoadingType;
+  /**
+   * form表单的值
+   */
+  editForm: Object;
+}
+
+export interface Emits {
+  /**
+   *  关闭弹窗事件
+   */
+  (event: "close"): void;
+  /**
+   * 提交表单事件
+   * @param submitData 表单数据
+   * @param isClose 是否关闭弹窗
+   */
+  (event: "submit", submitData: Object, isClose: boolean): void;
+}

+ 5 - 4
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/api.ts

@@ -1,4 +1,5 @@
-export const MOD = '/business'
-export const prefix = '/clue'
-export const GETSYSFILED = '/sys-dict/getListByCode'
-export const GETPERSONNEL = '/user/getSimpleActiveUserList'
+export const MOD = "/business";
+export const prefix = "/clue";
+export const GETSYSFILED = "/sys-dict/getListByCode";
+export const GETPERSONNEL = "/user/getSimpleActiveUserList";
+export const GETGENERATEFOEM = `sys-form/getListByCode${MOD}`

+ 92 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/component/relatedProducts.vue

@@ -0,0 +1,92 @@
+<template>
+    <div>
+        <el-table ref="productTableRef" :data="productTable" border :row-class-name="tableRowClassName"
+            @row-click="tableRowItem" style="width: 100%;height: 200px">
+            <el-table-column label="序号" width="80">
+                <template #default="scope">
+                    <span>{{ scope.$index + 1 }}</span>
+                </template>
+            </el-table-column>
+            <el-table-column prop="productName" label="产品名称" width="180">
+                <template #default="scope">
+                    <el-select v-model="productTable[scope.$index].productName" placeholder="请选择"
+                        v-if="productTableIndex == scope.$index" clearable @clear="clearTableItem(scope.$index)"
+                        @change="selectChange(scope.$index, productTable[scope.$index].productName)">
+                        <el-option v-for="item in productArrar" :key="item.id" :label="item.productName" :value="item.id" />
+                    </el-select>
+                    <span v-else>{{ productTable[scope.$index].productName }}</span>
+                </template>
+            </el-table-column>
+            <el-table-column prop="productType" label="产品类型" width="180"></el-table-column>
+            <el-table-column prop="unit" label="单位" width="80"></el-table-column>
+            <el-table-column prop="price" label="标准价格" width="120"></el-table-column>
+            <el-table-column prop="stock" label="库存" width="80"></el-table-column>
+            <el-table-column prop="sellingPrice" label="售价" width="180">
+                <template #default="scope">
+                    <el-input-number v-model="productTable[scope.$index].sellingPrice" class="mx-4" :min="0" :max="100000000" controls-position="right" v-if="productTableIndex == scope.$index" />
+                    <span v-else>{{ productTable[scope.$index].sellingPrice }}</span>
+                </template>
+            </el-table-column>
+            <el-table-column prop="quantity" label="数量" width="180">
+                <template #default="scope">
+                    <el-input-number v-model="productTable[scope.$index].quantity" class="mx-4" :min="0" :max="100000000" controls-position="right" v-if="productTableIndex == scope.$index" />
+                    <span v-else>{{ productTable[scope.$index].quantity }}</span>
+                </template>
+            </el-table-column>
+            <el-table-column prop="discount" label="折扣(%)" width="180">
+                <template #default="scope">
+                    <el-input-number v-model="productTable[scope.$index].discount" class="mx-4" :min="0" :max="100" controls-position="right" v-if="productTableIndex == scope.$index" />
+                    <span v-else>{{ productTable[scope.$index].discount }}</span>
+                </template>
+            </el-table-column>
+            <el-table-column prop="total" label="合计" width="180"></el-table-column>
+            <el-table-column label="操作" fixed="right" width="120">
+                <template #default="scope">
+                    <el-button link type="primary" size="large" @click.stop="addTableItem(scope.$index)">添加</el-button>
+                    <el-button link type="danger" size="large" v-if="productTable.length > 1"
+                        @click.stop="deteleTableItem(scope.$index)">删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+    </div>
+</template>
+  
+<script lang="ts" setup>
+import { ref, reactive, onMounted, inject } from "vue";
+
+const productTable: any = ref([{}])
+const productTableIndex = ref(0) // 可以编辑索引
+const productArrar = ref([
+    { id: 1, productName: '产品1', productType: '类别1', unit: '台', price: '1122', stock: '100', sellingPrice: 0, quantity: 0, discount: 0, total: '' },
+    { id: 2, productName: '产品2', productType: '类别2', unit: '台', price: '2211', stock: '300', sellingPrice: 0, quantity: 0, discount: 0, total: '' },
+])
+
+function selectChange(index: number, val: number | string) {
+    let newObj = productArrar.value.find((item: any) => item.id == val)
+    console.log(newObj)
+    productTable.value.splice(index, 1, newObj)
+}
+
+function tableRowItem(row: any) {
+    productTableIndex.value = row.index
+}
+
+function tableRowClassName({ row, rowIndex, }: { row: any, rowIndex: number }) {
+    row.index = rowIndex
+    return ''
+}
+
+function addTableItem(index: number) {
+    productTable.value.splice(index + 1, 0, {})
+}
+
+function clearTableItem(index: number) {
+    productTable.value.splice(index, 0, {})
+}
+
+function deteleTableItem(index: number) {
+    productTable.value.splice(index, 1)
+}
+</script>
+  
+<style lang="scss" scoped></style>

+ 30 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/detail/index.vue

@@ -0,0 +1,30 @@
+<template>
+    <div class="h-full flex">
+      <div class="p-5 w-80 pr-0">
+        <div class="bg-white w-full h-full shadow-md rounded-md flex flex-col">
+          <div class="flex-1 p-3 overflow-y-auto">
+            
+          </div>
+          <div class="w-full flex p-3 shadow-[0_-3px_5px_0px_rgba(0,0,0,0.2)]">
+            <El-button class="w-full">重置</El-Button>
+            <El-button type="primary" class="w-full">搜索</El-Button>
+          </div>
+        </div>
+      </div>
+      <div class="flex-1 p-5 overflow-auto">
+        <div class="bg-white w-full h-full p-3 shadow-md rounded-md flex flex-col">
+
+        </div>
+      </div>
+    </div>
+  </template>
+  
+  <script lang="ts" setup>
+  import { ref, reactive, onMounted, inject } from "vue";
+  import type { FormInstance, FormRules } from 'element-plus'
+
+  </script>
+  
+  <style lang="scss" scoped>
+
+  </style>

+ 87 - 35
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/index.vue

@@ -47,9 +47,11 @@
     <div class="flex-1 p-5 overflow-auto">
       <div class="bg-white w-full h-full p-3 shadow-md rounded-md flex flex-col">
         <div class="flex justify-end pb-3">
-          <el-button type="primary">新建商机</el-button>
+          <el-button type="primary" @click="showVisible('newBusinessisible')">新建商机</el-button>
           <el-button type="primary">批量转移</el-button>
           <el-button type="primary">批量删除</el-button>
+          <el-button type="primary">阶段设置</el-button>
+          <el-button type="primary">回收站</el-button>
           <el-button type="primary">导入</el-button>
           <el-button type="primary">导出</el-button>
         </div>
@@ -59,7 +61,7 @@
             <el-table-column type="selection" width="55" />
             <el-table-column prop="name" label="商机名称" width="180">
               <template #default="scope">
-                <el-button link type="primary" size="large">{{
+                <el-button link type="primary" size="large" @click="toBusinessTableDetail(scope.row)">{{
                   scope.row.name
                 }}</el-button>
               </template>
@@ -93,51 +95,61 @@
         </div>
       </div>
     </div>
+    <!-- 弹窗 -->
+    <el-dialog v-model="allVisible.newBusinessisible" width="1000" :show-close="false" top="10vh"
+      :before-close="handleClose">
+      <template #header="{ close, titleId, titleClass }">
+        <div class="flex justify-between items-center border-b pb-3 dialog-header">
+          <h4 :id="titleId">{{ allText.newBusinessisibleText }}</h4>
+          <div>
+            <el-button type="primary">保存并新建</el-button>
+            <el-button type="primary" @click="editBusiness()">保存</el-button>
+            <el-button @click="closeVisible('newBusinessisible')">取消</el-button>
+          </div>
+        </div>
+      </template>
+      <div class="h-[60vh] overflow-y-auto scroll-bar">
+        <GenerateForm ref="generateForm" :data="generateFormData" />
+        <div>相关产品</div>
+        <RelatedProducts />
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script lang="ts" setup>
 import { ref, reactive, onMounted, inject } from "vue";
-import { GETSYSFILED, MOD, GETPERSONNEL } from './api'
+import type { FormInstance, FormRules } from 'element-plus'
+import { useRouter, useRoute } from "vue-router";
+import { GETSYSFILED, MOD, GETPERSONNEL, GETGENERATEFOEM } from './api'
 import { post, get } from "@/utils/request";
 import { getAllListByCode, getFromValue, resetFromValue, getFirstDayOfMonth, getLastDayOfMonth, formatDate } from '@/utils/tools'
+import { GenerateForm } from '@zmjs/form-design';
+import RelatedProducts from './component/relatedProducts.vue'
 
-// 定义类型
-interface businessOpportunityFormType { // 线索筛选条件类型
-  name: string,
-  stageId: string | number,
-  customerName: string,
-  contactPerson: string,
-  product: string | number,
-  inchargerId: string | number,
-  startTime: string | number,
-  endTime: string | number,
-  pageIndex: string | number,
-  pageFrom: string | number
-}
-
-interface fixedDataInterface {
-  id: string | number,
-  companyId: string | number,
-  code: string,
-  name: string,
-  seq: string | number,
-}
-
-interface personnelInterface {
-  id: string | number,
-  name: string,
-  phone: string,
-  jobNumber: string
-}
-
+const route = useRoute()
+const router = useRouter()
+const globalPopup = inject<GlobalPopup>('globalPopup')
 const businessTotalTable = ref(0)
+const generateForm = ref<typeof GenerateForm>() // 自定义表单dom
+const generateFormData = ref({
+  config: {},
+  list: []
+}) // 自定义表单数据
 const businessTable = ref([
-  {name: '商机040101',phone: '张山'}
+  { name: '商机040101', phone: '张山' }
 ])
-const allLoading = reactive({
+const allLoading = reactive<AllLoadingInterface>({
   businessTableLading: false
 })
+const allVisible = reactive<AllVisibleInterface>({
+  newBusinessisible: false,
+  recycleVisible: false,
+})
+const allText = reactive({
+  newBusinessisibleText: '新建商机'
+}) // 所有文本
+
 const businessOpportunityForm = reactive<businessOpportunityFormType>({
   name: '',
   stageId: '',
@@ -155,6 +167,28 @@ const fixedData = reactive({
   Personnel: [] as personnelInterface[]
 })
 
+
+function editBusiness() {
+  generateForm.value?.getData().then((res: any) => {
+    console.log('正确')
+    console.log(res)
+  }).catch( (_err: any) => {
+    globalPopup?.showError('请填写完整')
+  })
+}
+
+function showVisible(type: keyof AllVisibleInterface) { // 显示弹窗
+  allVisible[type] = true
+}
+
+function closeVisible(type: keyof AllVisibleInterface) {
+  allVisible[type] = false
+}
+
+function handleClose(done: () => void) {
+  done()
+}
+
 async function getSystemField() {
   const systemField = getAllListByCode(['商机阶段'])
   for (let i in systemField) {
@@ -173,6 +207,17 @@ async function getSystemField() {
       id, name, phone, jobNumber
     }
   })
+
+  const res = await get(GETGENERATEFOEM)
+  generateFormData.value = JSON.parse(res.data[0].config)
+}
+
+function toBusinessTableDetail(row: any) {
+  console.log('点击跳转详情')
+  router.push({ 
+    path: `${MOD}/detail`, 
+    query: { id: row.id } 
+  })
 }
 
 onMounted(() => {
@@ -180,4 +225,11 @@ onMounted(() => {
 })
 </script>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped>
+.dialog-header {
+  h4 {
+    font-size: 18px;
+    line-height: 24px;
+  }
+}
+</style>

+ 38 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/type.d.ts

@@ -0,0 +1,38 @@
+interface businessOpportunityFormType {
+  // 线索筛选条件类型
+  name: string;
+  stageId: string | number;
+  customerName: string;
+  contactPerson: string;
+  product: string | number;
+  inchargerId: string | number;
+  startTime: string | number;
+  endTime: string | number;
+  pageIndex: string | number;
+  pageFrom: string | number;
+}
+
+interface fixedDataInterface {
+  id: string | number;
+  companyId: string | number;
+  code: string;
+  name: string;
+  seq: string | number;
+}
+
+interface personnelInterface {
+  id: string | number;
+  name: string;
+  phone: string;
+  jobNumber: string;
+}
+
+type AllLoadingInterface = {
+  businessTableLading: boolean;
+}
+
+type AllVisibleInterface = {
+  newBusinessisible: boolean;
+  recycleVisible: boolean;
+}
+

+ 5 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/customForm/index.vue

@@ -160,6 +160,8 @@ function showModel() {
   setTimeout(() => {
     designForm.value.setJson(JSON.parse(config))
     // designForm.value.setJson(JSON.parse(localStorage.getItem('threadDataJson') || ''))
+    // designForm.value.setJson(JSON.parse(localStorage.getItem('business') || ''))
+    // designForm.value.setJson(JSON.parse(localStorage.getItem('tasks') || ''))
   }, 500)
 }
 
@@ -173,7 +175,9 @@ function handleClose(done: any) {
 }
 
 function setData() {
-  let data = JSON.parse(localStorage.getItem('threadDataJson') || '')
+  // let data = JSON.parse(localStorage.getItem('threadDataJson') || '')
+  // let data = JSON.parse(localStorage.getItem('business') || '')
+  let data = JSON.parse(localStorage.getItem('tasks') || '')
   data.list.forEach((element: any) => {
     element.allDisable = true
   });

+ 0 - 141
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/TaskModal.vue

@@ -1,141 +0,0 @@
-<template>
-  <el-dialog v-model="modalVisible" width="30%" :show-close="false" :close-on-click-modal="false">
-    <template #header="{ titleId, titleClass }">
-      <div class="flex justify-between items-center border-b pb-3">
-        <h4 :id="titleId" :class="titleClass">{{ editForm ? '编辑任务' : '新增任务' }}</h4>
-        <div>
-          <el-button type="primary" @click="submitForm(false)">保存并新建</el-button>
-          <el-button type="primary" @click="submitForm(true)">保存</el-button>
-          <el-button @click="closeVisible()">取消</el-button>
-        </div>
-      </div>
-    </template>
-    <el-form ref="formRef" :model="form" label-width="100px" :rules="rules" class="flex flex-wrap form">
-      <el-form-item label="任务名称" prop="taskName" required>
-        <el-input v-model="form.taskName" type="textarea" placeholder="请输入任务名称" clearable maxlength="100"
-          show-word-limit />
-      </el-form-item>
-      <el-form-item prop="priority" label="优先级" required>
-        <el-select v-model="form.priority" placeholder="请选择" clearable>
-          <el-option v-for="item in PRIORITY " :key="item.value" :value="item.value" :label="item.label" />
-        </el-select>
-      </el-form-item>
-      <el-form-item prop="taskType" :label="form.taskType">
-        <template #label>
-          <el-select v-model="form.taskType" class="border resetSelect" style="width: 100px">
-            <el-option v-for="item in TASK_TYPE" :key="item.value" :value="item.value" :label="item.label" />
-          </el-select>
-        </template>
-        <el-select v-model="form.priority" placeholder="请选择" clearable filterable>
-          <el-option v-for="item in PRIORITY" :key="item.value" :value="item.value" :label="item.label" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="联系人" v-if="TASK_TYPE.find(v => v.value === (form.taskType || '1'))?.show">
-        <el-select v-model="form.contact" placeholder="请选择" clearable filterable>
-          <el-option v-for="item in PRIORITY" :key="item.value" :value="item.value" :label="item.label" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="执行人">
-        <el-select v-model="form.executeor" placeholder="请选择" clearable multiple filterable>
-          <el-option v-for="item in PRIORITY" :key="item.value" :value="item.value" :label="item.label" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="重复提醒">
-        <el-switch v-model="form.repeat" active-value="1" inactive-value="0" />
-      </el-form-item>
-      <template v-if="form.repeat === '1'">
-        <el-form-item label="重复类型" label-width="7em" prop="startDate">
-          <el-select v-model="form.repeatType" placeholder="请选择">
-            <el-option v-for="item in REPEAT_TYPE" :key="item.value" :value="item.value" :label="item.label" />
-          </el-select>
-        </el-form-item>
-        <template v-if="['0', '1', '2'].includes(form.repeatType)">
-          <div>
-            {{ REPEAT_TYPE[form.repeatType].label }}
-          </div>
-        </template>
-        <template v-if="['3'].includes(form.repeatType)">
-          <div>
-            {{ '自定义周期' }}
-          </div>
-        </template>
-        <template v-if="['4'].includes(form.repeatType)">
-          <div>
-            {{ '自定义日期' }}
-          </div>
-        </template>
-      </template>
-      <el-form-item label="开始时间" label-width="7em" prop="startDate" class="w50">
-        <el-date-picker v-model="form.startDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
-      </el-form-item>
-      <el-form-item label="截止时间" label-width="7em" prop="endDate" class="w50">
-        <el-date-picker v-model="form.endDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
-      </el-form-item>
-    </el-form>
-    <el-form-item label="详细描述" prop="taskName">
-      <el-input v-model="form.taskName" type="textarea" placeholder="请输入任务名称" clearable maxlength="1000" show-word-limit
-        :autosize="{ minRows: 4 }" />
-    </el-form-item>
-  </el-dialog>
-</template>
-
-<script lang="ts" setup>
-import { ref, watch } from 'vue';
-import { PRIORITY, TASK_TYPE, modalForm, REPEAT_TYPE } from "./api"
-const props = defineProps({
-  visible: {
-    type: Boolean,
-    default: false
-  },
-  editForm: {
-    type: Object,
-  }
-})
-const emit = defineEmits(['closeModalVisible', 'submitForm'])
-const modalVisible = ref(false)
-const form = ref<any>({})
-const rules = ref({
-  taskName: [
-    { required: true, message: '请输入任务名称', trigger: 'blur' }
-  ],
-  priority: [
-    { required: true, message: '请选择优先级', trigger: 'blur' }
-  ]
-})
-function closeVisible() {
-  emit('closeModalVisible')
-}
-function submitForm(isClose: boolean) {
-  console.log("form", form.value, isClose);
-  // emit('submitForm', { form: form.value, isClose })
-}
-watch(props, (val) => {
-  modalVisible.value = val.visible
-  form.value = val.editForm ? { ...val.editForm } : modalForm
-})
-</script>
-
-<style lang="scss">
-.resetSelect {
-  border: 0;
-
-  .el-select__wrapper {
-    box-shadow: none;
-    padding-right: 0;
-  }
-
-  .el-select__selected-item {
-    text-align: right;
-  }
-}
-
-.el-form-item {
-  width: 100%;
-}
-
-.form {
-  .w50 {
-    @apply w-1/2;
-  }
-}
-</style>

+ 1 - 30
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/api.ts

@@ -1,6 +1,7 @@
 import { EpPropMergeType } from "element-plus/es/utils";
 
 export const MDO = "/tasks";
+
 type StatusType = {
   label: "全部" | "未开始" | "进行中" | "已完成" | "已超时";
   value: string;
@@ -22,22 +23,6 @@ export const defaultSearchForm = {
   page: 1,
   pageSize: 10,
 };
-export const modalForm = {
-  taskName: "", //任务名称
-  priority: "", //优先级
-  taskType: "1", //  任务类型
-  customerId: "0", //  客户id 0
-  businessId: "1", //商机id 1
-  orderId: "2", //  订单id 2
-  clueid: "3", //线索id 3
-  contactsId: "", //联系人id
-  executorId: "", //执行人id
-  repeat: "0", //是否重复
-  repeatType: "0", //重复类型
-  startDate: "", //开始日期
-  endDate: "", //截止日期
-  taskDesc: "", //任务描述
-};
 export const PRIORITY = [
   //优先级
   { label: "高", value: "0" },
@@ -51,17 +36,3 @@ export const STATUS: StatusType[] = [
   { label: "已完成", value: "2", type: "success" },
   { label: "已超时", value: "3", type: "danger" },
 ];
-export const TASK_TYPE = [
-  // 弹窗任务类型
-  { label: "客户", value: "0", show: true },
-  { label: "商机", value: "1", show: true },
-  { label: "销售订单", value: "2", show: true },
-  { label: "线索", value: "3", show: false },
-];
-export const REPEAT_TYPE = [
-  { label: "每天", value: "0" },
-  { label: "每周", value: "1" },
-  { label: "每月", value: "2" },
-  { label: "自定义周期", value: "3" },
-  { label: "自定义日期", value: "4" },
-];

+ 42 - 6
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue

@@ -2,7 +2,7 @@
   <div class="h-full flex">
     <div class="p-5 w-80 pr-0">
       <div class="bg-white w-full h-full shadow-md rounded-md flex flex-col">
-        <div class="flex-1 p-3 overflow-y-auto">
+        <div class="flex-1 p-3 overflow-y-auto scroll-bar">
           <el-form :model="searchForm">
             <el-form-item label="任务名称:" label-width="7em" prop="taskName">
               <el-input v-model="searchForm.taskName" placeholder="请输入" />
@@ -114,7 +114,8 @@
         </div>
       </div>
     </div>
-    <TaskModal :visible="taskModalVisible" :edit-form="taskForm" @close-modal-visible="closeModal()" />
+    <TaskModal :visible="true" :saveLoading="taskLoading" :edit-form="taskForm" @close="closeModal()"
+      @submit="submitForm" />
   </div>
 </template>
 
@@ -123,17 +124,26 @@ import { onBeforeMount, ref } from 'vue';
 import { useStore } from '@/store';
 import { MDO, PRIORITY, STATUS, defaultSearchForm } from './api';
 import { dayjs } from 'element-plus';
-import TaskModal from './TaskModal.vue';
+import TaskModal from '@/components/TaskModal/index.vue';
 const { getFunctionList } = useStore()
 
 const pagePermission = ref<any[]>();
 const taskModalVisible = ref(false);
 const taskForm = ref<any>();
+const taskLoading = ref<saveLoadingType>("1");
 function closeModal() {
   taskModalVisible.value = false;
   taskForm.value = null;
 }
+function submitForm(data: any, isClose: boolean) {
+  console.log("提交的数据水水水水", data, isClose);
+  taskLoading.value = "2";
+  setTimeout(() => {
+    taskLoading.value = "3";
+    taskModalVisible.value = isClose;
+  }, 2000)
 
+}
 const searchForm = ref<any>();
 const tableData = ref<any[]>([
   {
@@ -145,7 +155,33 @@ const tableData = ref<any[]>([
     priority: '0',
     startDate: dayjs().format('YYYY-MM-DD'),
     endDate: dayjs().format('YYYY-MM-DD'),
-    taskType: '1'
+    taskType: '1',
+    endType: '1',
+    taskDesc: "任务秒数",
+    repeat_design_sameday: "1,4,3,4",
+    taskLogs: [
+      {
+        id: 3,
+        operateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+        operateType: '3',
+        operateUser: '张三',
+        operateDesc: '删除任务'
+
+      },
+      {
+        id: 2,
+        operateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+        operateType: '2',
+        operateUser: '张三',
+        operateDesc: '修改任务'
+      }, {
+        id: 1,
+        operateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+        operateType: '1',
+        operateUser: '张三',
+        operateDesc: '创建任务'
+      }
+    ]
   },
   {
     taskName: '任务222',
@@ -203,7 +239,7 @@ function search() {
   console.log("searchForm", searchForm.value);
 }
 function reset() {
-  searchForm.value = defaultSearchForm;
+  searchForm.value = { ...defaultSearchForm };
 }
 function createTasks() {
   taskModalVisible.value = true;
@@ -237,7 +273,7 @@ function deleteRow(index: any) {
 }
 onBeforeMount(() => {
   pagePermission.value = getFunctionList(MDO);
-  searchForm.value = defaultSearchForm;
+  searchForm.value = { ...defaultSearchForm };
 })
 </script>
 

+ 2 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/styles/global.scss

@@ -23,7 +23,7 @@ $modena: #6f4afe;
 }
 
 .scroll-bar::-webkit-scrollbar-thumb {
-  background: linear-gradient(to bottom right, #075985 0%, #075985 100%);
+  background: linear-gradient(to bottom right, #C1C1C1 0%, #C1C1C1 100%);
   border-radius: 5px;
 }
 
@@ -33,7 +33,7 @@ $modena: #6f4afe;
 }
 
 .scroll-bar::-webkit-scrollbar-button {
-  background-color: #075985;
+  background-color: #C1C1C1;
   border-radius: 2px;
   height: 4px;
 }

+ 14 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/type.d.ts

@@ -6,8 +6,19 @@ interface GlobalPopup extends Notify {
 }
 
 interface Tree {
-  label: string
-  children?: Tree[]
+  label: string;
+  children?: Tree[];
 }
 
-type ListByCodeType = ('线索来源'|'客户级别'|'客户行业'|'客户来源'|'商机阶段'|'产品类型'|'产品单位'|'订单类型')[] 
+type ListByCodeType = (
+  | "线索来源"
+  | "客户级别"
+  | "客户行业"
+  | "客户来源"
+  | "商机阶段"
+  | "产品类型"
+  | "产品单位"
+  | "订单类型"
+)[];
+
+type saveLoadingType = "1" | "2" | "3" | "4"; //1是没有保存, 2是正在保存, 3是保存成功, 4是保存失败

+ 4 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/vite.config.ts

@@ -3,12 +3,14 @@ import vue from "@vitejs/plugin-vue";
 
 import { resolve } from "path";
 
-const target = "http://47.101.180.183:10010";
+// const target = "http://192.168.2.8:10010";
+const target = "http://192.168.2.118:10010";
+// const target = "http://47.101.180.183:10010";
 
 export default defineConfig({
   plugins: [vue()],
   server: {
-    host: "127.0.0.1",
+    host: "0.0.0.0",
     port: 19123,
     open: true,
     proxy: {

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java

@@ -139,7 +139,7 @@ public class GroupBudgetReviewController {
             String corpwxUserid = user.getCorpwxUserid();
             if (corpwxUserid != null) {
                 WxCorpInfo info = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",checker.getCompanyId()));
-                wxCorpInfoService.sendWXCorpMsg(info, corpwxUserid,sb.toString(), "groupBudget", WxCorpInfoServiceImpl.TEXT_CARD_MSG_REPORT_DENY);
+                wxCorpInfoService.sendWXCorpMsg(info, corpwxUserid,sb.toString(), "budgetReview", WxCorpInfoServiceImpl.TEXT_CARD_MSG_REPORT_DENY);
             }
         }
         return  httpRespMsg;

+ 41 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalCheckController.java

@@ -0,0 +1,41 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.ProjectApprovalBasecost;
+import com.management.platform.entity.ProjectApprovalCheck;
+import com.management.platform.service.ProjectApprovalBasecostService;
+import com.management.platform.service.ProjectApprovalCheckService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-20
+ */
+@RestController
+@RequestMapping("/project-approval-check")
+public class ProjectApprovalCheckController {
+
+    @Resource
+    private ProjectApprovalCheckService projectApprovalCheckservice;
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer projectId){
+        HttpRespMsg msg=new HttpRespMsg();
+        List<ProjectApprovalCheck> list = projectApprovalCheckservice.list(new LambdaQueryWrapper<ProjectApprovalCheck>().eq(ProjectApprovalCheck::getProjectApprovalId, projectId));
+        msg.setData(list);
+        return msg;
+    }
+
+}
+

+ 122 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalController.java

@@ -7,7 +7,9 @@ import com.management.platform.mapper.ProjectMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.*;
 import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.BeanUtils;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 
@@ -17,8 +19,10 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDate;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -48,6 +52,18 @@ public class ProjectApprovalController {
     private ProjectApprovalBasecostService projectApprovalBasecostService;
     @Resource
     private ProjectCategoryService projectCategoryService;
+    @Resource
+    private ProjectApprovalCheckService projectApprovalCheckService;
+    @Resource
+    private ProjectService projectService;
+    @Resource
+    private ProjectBasecostService projectBasecostService;
+    @Resource
+    private ProjectAuditorService projectAuditorService;
+    @Resource
+    private ParticipationService participationService;
+    @Resource
+    private SysFunctionService sysFunctionService;
 
     /**
      * 分页获取项目列表
@@ -56,8 +72,8 @@ public class ProjectApprovalController {
      */
     @RequestMapping("/listByPage")
     public HttpRespMsg getProjectPage(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, String keyword,
-                                      @RequestParam(required = false, defaultValue = "1") Integer searchField,@RequestParam(defaultValue = "3") String statuses,Integer category) {
-        return projectApprovalService.listByPage(pageIndex, pageSize, keyword,searchField,statuses,category,request);
+                                      @RequestParam(required = false, defaultValue = "1") Integer searchField,@RequestParam(defaultValue = "3") String statuses,Integer category,Integer viewId) {
+        return projectApprovalService.listByPage(pageIndex, pageSize, keyword,searchField,statuses,category,viewId,request);
     }
 
     @RequestMapping("/editProjectApproval")
@@ -91,6 +107,7 @@ public class ProjectApprovalController {
         participationApprovalService.remove(new LambdaQueryWrapper<ParticipationApproval>().eq(ParticipationApproval::getProjectApprovalId,projectApproval.getId()));
         projectApprovalBasecostService.remove(new LambdaQueryWrapper<ProjectApprovalBasecost>().eq(ProjectApprovalBasecost::getProjectApprovalId,projectApproval.getId()));
         projectApprovalAuditorService.remove(new LambdaQueryWrapper<ProjectApprovalAuditor>().eq(ProjectApprovalAuditor::getProjectApprovalId,projectApproval.getId()));
+        projectApprovalCheckService.remove(new LambdaQueryWrapper<ProjectApprovalCheck>().eq(ProjectApprovalCheck::getProjectApprovalId,projectApproval.getId()).eq(ProjectApprovalCheck::getStatus,0));
         if(projectApproval.getParticipationApprovalList()!=null&&projectApproval.getParticipationApprovalList().size()>0){
             List<ParticipationApproval> participationApprovalList = projectApproval.getParticipationApprovalList();
             participationApprovalList.forEach(p->{
@@ -120,6 +137,17 @@ public class ProjectApprovalController {
             });
             projectApprovalAuditorService.saveBatch(projectApprovalAuditorList);
         }
+        if(projectApproval.getProjectApprovalCheckList()!=null&&projectApproval.getProjectApprovalCheckList().size()>0){
+            List<ProjectApprovalCheck> projectApprovalCheckList = projectApproval.getProjectApprovalCheckList();
+            projectApprovalCheckList.forEach(p->{
+                p.setProjectApprovalId(projectApproval.getId());
+            });
+            projectApprovalCheckList=projectApprovalCheckList.stream().filter(p-> !StringUtils.isEmpty(p.getUserId())).collect(Collectors.toList());
+            for (int i = 0; i < projectApprovalCheckList.size(); i++) {
+                projectApprovalCheckList.get(i).setSeq(i+1);
+            }
+            projectApprovalCheckService.saveOrUpdateBatch(projectApprovalCheckList);
+        }
         return msg;
     }
 
@@ -150,5 +178,97 @@ public class ProjectApprovalController {
         return msg;
     }
 
+    @RequestMapping("/delete")
+    @Transactional(rollbackFor = Exception.class)
+    public HttpRespMsg delete(Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        ProjectApproval projectApproval = projectApprovalService.getById(id);
+        participationApprovalService.remove(new LambdaQueryWrapper<ParticipationApproval>().eq(ParticipationApproval::getProjectApprovalId,projectApproval.getId()));
+        projectApprovalBasecostService.remove(new LambdaQueryWrapper<ProjectApprovalBasecost>().eq(ProjectApprovalBasecost::getProjectApprovalId,projectApproval.getId()));
+        projectApprovalAuditorService.remove(new LambdaQueryWrapper<ProjectApprovalAuditor>().eq(ProjectApprovalAuditor::getProjectApprovalId,projectApproval.getId()));
+        projectApprovalCheckService.remove(new LambdaQueryWrapper<ProjectApprovalCheck>().eq(ProjectApprovalCheck::getProjectApprovalId,projectApproval.getId()));
+        if(!projectApprovalService.removeById(id)){
+            msg.setData("验证失败");
+        }
+        return msg;
+    }
+
+    @RequestMapping("/check")
+    @Transactional(rollbackFor = Exception.class)
+    public HttpRespMsg check(Integer id,Integer checkType,Integer revokeType){
+        HttpRespMsg msg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        ProjectApproval projectApproval = projectApprovalService.getById(id);
+        List<ProjectApprovalCheck> projectApprovalChecks = projectApprovalCheckService.list(new LambdaQueryWrapper<ProjectApprovalCheck>().eq(ProjectApprovalCheck::getProjectApprovalId, id));
+        Optional<ProjectApprovalCheck> first = projectApprovalChecks.stream().filter(p -> p.getUserId().equals(user.getId())&&p.getStatus()==0).findFirst();
+//        boolean hasAllPriviledge = sysFunctionService.hasPriviledge(user.getRoleId(), "管理全部立项申请");
+//        boolean hasCheckPriviledge = sysFunctionService.hasPriviledge(user.getRoleId(), "审核立项申请");
+        if(projectApprovalChecks.size()>0){
+            if(!first.isPresent()){
+                msg.setError("审核人验证失败,请按照审核人顺序审核");
+                return msg;
+            }
+        }
+        switch (checkType){
+            /*审核通过*/
+            case 1:
+                ProjectApprovalCheck projectApprovalCheck = first.get();
+                projectApprovalCheck.setStatus(1);
+                projectApprovalCheckService.updateById(projectApprovalCheck);
+                //检查剩余的数据
+                List<ProjectApprovalCheck> approvalChecks = projectApprovalChecks.stream().filter(p -> !p.getId().equals(first.get().getId())).collect(Collectors.toList());
+                boolean b = approvalChecks.stream().anyMatch(a -> a.getStatus() != 1);
+                if(!b){
+                    projectApproval.setStatus(1);
+                    projectApprovalService.updateById(projectApproval);
+                    //立项审核通过后创建项目数据
+                    Project project=new Project();
+                    BeanUtils.copyProperties(projectApproval,project);
+                    project.setId(null);
+                    project.setCreateDate(LocalDate.now());
+                    List<ProjectApprovalBasecost> projectApprovalBasecostList = projectApprovalBasecostService.list(new LambdaQueryWrapper<ProjectApprovalBasecost>().eq(ProjectApprovalBasecost::getProjectApprovalId, id));
+                    List<ParticipationApproval> participationApprovalList = participationApprovalService.list(new LambdaQueryWrapper<ParticipationApproval>().eq(ParticipationApproval::getProjectApprovalId, id));
+                    List<ProjectApprovalAuditor> projectApprovalAuditorList = projectApprovalAuditorService.list(new LambdaQueryWrapper<ProjectApprovalAuditor>().eq(ProjectApprovalAuditor::getProjectApprovalId, id));
+                    projectService.save(project);
+                    List<ProjectBasecost> projectBasecostList=new ArrayList<>();
+                    List<Participation> participationList=new ArrayList<>();
+                    List<ProjectAuditor> projectAuditorList=new ArrayList<>();
+                    projectApprovalBasecostList.forEach(p->{
+                        ProjectBasecost projectBasecost=new ProjectBasecost();
+                        BeanUtils.copyProperties(p,projectBasecost);
+                        projectBasecost.setId(null);
+                        projectBasecost.setProjectId(project.getId());
+                        projectBasecostList.add(projectBasecost);
+                    });
+                    participationApprovalList.forEach(p->{
+                        Participation participation=new Participation();
+                        BeanUtils.copyProperties(p,participation);
+                        participation.setId(null);
+                        participation.setProjectId(project.getId());
+                        participationList.add(participation);
+                    });
+                    projectApprovalAuditorList.forEach(p->{
+                        ProjectAuditor projectAuditor=new ProjectAuditor();
+                        BeanUtils.copyProperties(p,projectAuditor);
+                        projectAuditor.setId(null);
+                        projectAuditor.setProjectId(project.getId());
+                        projectAuditorList.add(projectAuditor);
+                    });
+                    projectBasecostService.saveBatch(projectBasecostList);
+                    participationService.saveBatch(participationList);
+                    projectAuditorService.saveBatch(projectAuditorList);
+                }
+                break;
+            /*驳回*/
+            case 2:
+                projectApproval.setStatus(2);
+                projectApprovalService.updateById(projectApproval);
+                break;
+            /*撤销*/
+            case 3:
+                break;
+        }
+        return msg;
+    }
 }
 

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApproval.java

@@ -250,9 +250,15 @@ public class ProjectApproval extends Model<ProjectApproval> {
     @TableField(exist = false)
     private List<ProjectApprovalAuditor> projectApprovalAuditorList;
 
+    @TableField(exist = false)
+    private List<ProjectApprovalCheck> projectApprovalCheckList;
+
     @TableField(exist = false)
     private String inchargerName;
 
+    @TableField(exist = false)
+    private Integer canChecked;
+
 
     @Override
     protected Serializable pkVal() {

+ 57 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApprovalCheck.java

@@ -0,0 +1,57 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectApprovalCheck extends Model<ProjectApprovalCheck> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("project_approval_id")
+    private Integer projectApprovalId;
+
+    /**
+     * 人员id
+     */
+    @TableField("user_id")
+    private String userId;
+
+    /**
+     * 审核状态 0-待审核 1-审核通过 2-已驳回
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 审核顺序(审核流程)
+     */
+    @TableField("seq")
+    private Integer seq;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectApprovalCheckMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ProjectApprovalCheck;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-20
+ */
+public interface ProjectApprovalCheckMapper extends BaseMapper<ProjectApprovalCheck> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectApprovalCheckService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ProjectApprovalCheck;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-20
+ */
+public interface ProjectApprovalCheckService extends IService<ProjectApprovalCheck> {
+
+}

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectApprovalService.java

@@ -17,6 +17,6 @@ import javax.servlet.http.HttpServletRequest;
  */
 public interface ProjectApprovalService extends IService<ProjectApproval> {
 
-    HttpRespMsg listByPage(Integer pageIndex, Integer pageSize, String keyword, Integer searchField, String statuses, Integer category, HttpServletRequest request);
+    HttpRespMsg listByPage(Integer pageIndex, Integer pageSize, String keyword, Integer searchField, String statuses, Integer category,Integer viewId, HttpServletRequest request);
 
 }

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalCheckServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ProjectApprovalCheck;
+import com.management.platform.mapper.ProjectApprovalCheckMapper;
+import com.management.platform.service.ProjectApprovalCheckService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-20
+ */
+@Service
+public class ProjectApprovalCheckServiceImpl extends ServiceImpl<ProjectApprovalCheckMapper, ProjectApprovalCheck> implements ProjectApprovalCheckService {
+
+}

+ 39 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalServiceImpl.java

@@ -7,10 +7,7 @@ import com.management.platform.entity.*;
 import com.management.platform.mapper.ProjectApprovalMapper;
 import com.management.platform.mapper.ProjectMapper;
 import com.management.platform.mapper.UserMapper;
-import com.management.platform.service.ParticipationApprovalService;
-import com.management.platform.service.ProjectApprovalAuditorService;
-import com.management.platform.service.ProjectApprovalBasecostService;
-import com.management.platform.service.ProjectApprovalService;
+import com.management.platform.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.stereotype.Service;
@@ -20,6 +17,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -36,14 +34,22 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
     private ProjectApprovalMapper projectApprovalMapper;
     @Resource
     private UserMapper userMapper;
+    @Resource
+    private SysFunctionService sysFunctionService;
+    @Resource
+    private ProjectApprovalCheckService projectApprovalCheckService;
 
 
 
     @Override
-    public HttpRespMsg listByPage(Integer pageIndex, Integer pageSize, String keyword, Integer searchField, String statuses, Integer category, HttpServletRequest request) {
+    public HttpRespMsg listByPage(Integer pageIndex, Integer pageSize, String keyword, Integer searchField, String statuses, Integer category,Integer viewId, HttpServletRequest request) {
         HttpRespMsg msg=new HttpRespMsg();
-        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        User user = userMapper.selectById(request.getHeader("token"));
+        Integer companyId = user.getCompanyId();
         List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        boolean hasPriviledge = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部立项申请");
+        boolean hasAllPriviledge = sysFunctionService.hasPriviledge(user.getRoleId(), "管理全部立项申请");
+        boolean hasCheckPriviledge = sysFunctionService.hasPriviledge(user.getRoleId(), "审核立项申请");
         LambdaQueryWrapper<ProjectApproval> queryWrapper = new LambdaQueryWrapper<>();
         if(!StringUtils.isEmpty(keyword)){
             switch (searchField){
@@ -53,6 +59,17 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
                     break;
             }
         }
+        switch (viewId){
+            case 0:
+                if(!hasPriviledge){
+                    queryWrapper.and(wrapper->wrapper.eq(ProjectApproval::getCreatorId,user.getId()).or().inSql(ProjectApproval::getCreatorId,"select pc.user_id from project_approval_check pc where pc.project_approval_id=project_approval.id"));
+                }
+                break;
+            case 1:queryWrapper.eq(ProjectApproval::getCreatorId,user.getId());
+                break;
+            case 2:queryWrapper.inSql(ProjectApproval::getCreatorId,"select pc.user_id from project_approval_check pc where pc.project_approval_id=project_approval.id");
+                break;
+        }
         if(category!=null){
             queryWrapper.eq(ProjectApproval::getCategory,category);
         }
@@ -70,11 +87,27 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
         IPage<ProjectApproval> iPage = projectApprovalMapper.selectPage(new Page<>(pageIndex, pageSize), queryWrapper);
         Map<String,Object> result=new HashMap<>();
         List<ProjectApproval> records = iPage.getRecords();
+        List<Integer> projectApprovalIds = records.stream().map(r -> r.getId()).collect(Collectors.toList());
+        projectApprovalIds.add(-1);
+        List<ProjectApprovalCheck> approvalCheckList = projectApprovalCheckService.list(new LambdaQueryWrapper<ProjectApprovalCheck>().in(ProjectApprovalCheck::getProjectApprovalId,projectApprovalIds));
         records.forEach(r->{
             Optional<User> optional = userList.stream().filter(u -> u.getId().equals(r.getInchargerId())).findFirst();
             if(optional.isPresent()){
                 r.setInchargerName(optional.get().getName());
             }
+            Integer canCheck=0;
+            List<ProjectApprovalCheck> checkList = approvalCheckList.stream().filter(a -> a.getProjectApprovalId().equals(r.getId())).collect(Collectors.toList());
+            Optional<ProjectApprovalCheck> first = checkList.stream().filter(c -> c.getUserId().equals(user.getId())&&c.getStatus()==0).findFirst();
+            if(first.isPresent()){
+                boolean anyMatch = checkList.stream().anyMatch(c -> c.getSeq() < first.get().getSeq() && c.getStatus() == 0);
+                if(!anyMatch){
+                    canCheck=1;
+                }
+            }
+            if(hasAllPriviledge||hasCheckPriviledge){
+                canCheck=1;
+            }
+            r.setCanChecked(canCheck);
         });
         result.put("records",records);
         result.put("total",iPage.getTotal());

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -310,7 +310,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     //费用报销
                     title = "工时管家:任务到期通知";
                 }
-                else if ("groupBudget".equals(pageRouter)) {
+                else if ("budgetReview".equals(pageRouter)) {
                     //预估工时审核
                     title = "预估工时审核通知";
                 }

+ 19 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectApprovalCheckMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ProjectApprovalCheckMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectApprovalCheck">
+        <id column="id" property="id" />
+        <result column="project_approval_id" property="projectApprovalId" />
+        <result column="user_id" property="userId" />
+        <result column="status" property="status" />
+        <result column="seq" property="seq" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, project_approval_id, user_id, status, seq
+    </sql>
+
+</mapper>

+ 419 - 244
fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue

@@ -27,238 +27,264 @@
                 </el-form-item>
             </el-form>
         </el-col>
-        <!--列表-->
-        <el-table ref="projectlistOfWudulist" border @cell-mouse-enter="hoverCall" @cell-mouse-leave="handCall" :cell-class-name="tableCellClassName" :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;" @selection-change="checkedWudulist">
-            <el-table-column type="selection" width="60" :selectable="isSelectable">
-            </el-table-column>
-            <el-table-column prop="projectCode" :label="$t('Itemno')"  width="150"></el-table-column>
-            <el-table-column prop="projectName" :label="$t('headerTop.projectName')" min-width="250" ></el-table-column>
-            <el-table-column prop="categoryName" :label="$t('projectclassification')"  width="140"></el-table-column>
-            <el-table-column prop="isPublic" :label="'项目类型'"  width="140">
-                <template slot-scope="scope">{{scope.row.isPublic==0?"正式项目":"非项目"}}</template>
-            </el-table-column>
-            <el-table-column prop="inchargerName" :label="$t('projectmanager')"  min-width="150">
-                <template slot-scope="scope">
-                    <el-link type="primary" :underline="false" @click="showUser(scope.row.inchargerId)">
-                        <span v-if="user.userNameNeedTranslate != 1">
-                            {{scope.row.inchargerName}}
-                        </span>
-                        <span v-if="user.userNameNeedTranslate == 1">
-                            <ww-open-data type='userName' :openid='scope.row.inchargerName'></ww-open-data>
-                        </span>
-                    </el-link>
-                </template>
-            </el-table-column>
-            <!-- 级别 -->
-            <el-table-column :prop="user.timeType.projectLevelState == 1 ? 'levelName' : 'level'" :label="$t('ji-bie')" min-width="190"   v-if="user.company.packageProject == 1">
-                <template slot-scope="scope">
-                    <span v-if="user.timeType.projectLevelState == 1">{{scope.row.levelName}}</span>
-                    <span v-else>{{importanceListLable[scope.row.level - 1]}}</span>
-                </template>
-            </el-table-column>
-            <el-table-column prop="status" :label="'审核状态'" min-width="100" >
-                <template slot-scope="scope">
-                    {{scope.row.status == null?"-":approvalStatusStr[scope.row.status]}}
-                </template>
-            </el-table-column>
-            <el-table-column :label="$t('operation')" :width="300" align="left" fixed="right">
-                <template slot-scope="scope">
-                    <el-button size="mini" type="primary" @click="handleAdd(scope.$index, scope.row)">{{'编辑'}}</el-button>
-                    <el-button size="mini"  @click="restartPro(scope.row)">{{'通过'}}</el-button>
-                    <el-button size="mini"  @click="restartPro(scope.row)">{{'驳回'}}</el-button>
-                    <el-button size="mini"  @click="restartPro(scope.row)">{{'撤销'}}</el-button>
-                </template>
-            </el-table-column>
-        </el-table>
+        <div style="display: flex;width: 100%;">
+                <div class="classification">
+                    <div>
+                        <p :class="idx == 0 ? 'on' : ''" @click="switchs(0)" v-if="permissions.projectApprovalEdit">{{'全部项目'}}</p>
+                        <p :class="idx == 1 ? 'on' : ''" @click="switchs(1)">{{'我发起的'}}</p>
+                        <p :class="idx == 2 ? 'on' : ''" @click="switchs(2)">{{'我审核的'}}</p>
+                    </div>
+                </div>
+                <div style="max-width: 94%;min-width: 90%">
+                    <el-table ref="projectlistOfWudulist" border @cell-mouse-enter="hoverCall" @cell-mouse-leave="handCall" :cell-class-name="tableCellClassName" :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;" @selection-change="checkedWudulist">
+                        <el-table-column type="selection" width="60" :selectable="isSelectable">
+                        </el-table-column>
+                        <el-table-column prop="projectCode" :label="$t('Itemno')"  width="150"></el-table-column>
+                        <el-table-column prop="projectName" :label="$t('headerTop.projectName')" min-width="250" ></el-table-column>
+                        <el-table-column prop="categoryName" :label="$t('projectclassification')"  width="140"></el-table-column>
+                        <el-table-column prop="isPublic" :label="'项目类型'"  width="140">
+                            <template slot-scope="scope">{{scope.row.isPublic==0?"正式项目":"非项目"}}</template>
+                        </el-table-column>
+                        <el-table-column prop="inchargerName" :label="$t('projectmanager')"  min-width="150">
+                            <template slot-scope="scope">
+                                <el-link type="primary" :underline="false" @click="showUser(scope.row.inchargerId)">
+                                    <span v-if="user.userNameNeedTranslate != 1">
+                                        {{scope.row.inchargerName}}
+                                    </span>
+                                    <span v-if="user.userNameNeedTranslate == 1">
+                                        <ww-open-data type='userName' :openid='scope.row.inchargerName'></ww-open-data>
+                                    </span>
+                                </el-link>
+                            </template>
+                        </el-table-column>
+                        <!-- 级别 -->
+                        <el-table-column :prop="user.timeType.projectLevelState == 1 ? 'levelName' : 'level'" :label="$t('ji-bie')" min-width="190"   v-if="user.company.packageProject == 1">
+                            <template slot-scope="scope">
+                                <span v-if="user.timeType.projectLevelState == 1">{{scope.row.levelName}}</span>
+                                <span v-else>{{importanceListLable[scope.row.level - 1]}}</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="status" :label="'审核状态'" min-width="100" >
+                            <template slot-scope="scope">
+                                {{scope.row.status == null?"-":approvalStatusStr[scope.row.status]}}
+                            </template>
+                        </el-table-column>
+                        <el-table-column :label="$t('operation')" :width="300" align="left" fixed="right">
+                            <template slot-scope="scope">
+                                <el-button size="mini" type="primary" @click="handleAdd(scope.$index, scope.row)">{{'编辑'}}</el-button>
+                                <el-button size="mini" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck) && scope.row.status==0 &&scope.row.canChecked==1 "  @click="check(scope.row,1)">{{'通过'}}</el-button>
+                                <el-button size="mini" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck) && scope.row.status!=2 &&scope.row.canChecked==1" @click="check(scope.row,2)">{{'驳回'}}</el-button>
+                                <el-button size="mini" v-if="(permissions.projectApprovalEdit ||permissions.projectApprovalCheck)&&scope.row.canChecked==1 && scope.row.status==1" @click="check(scope.row,3)">{{'撤销'}}</el-button>
+                            </template>
+                        </el-table-column>
+                    </el-table>
 
-        <!--工具条 footer-->
-        <el-col :span="24" class="toolbar">
-            <el-pagination :key="projectListPageComponentKey"
-                @size-change="handleSizeChange"
-                @current-change="handleCurrentChange"
-                :page-sizes="[20 , 50 , 80 , 100]"
-                :page-size="size"
-                :current-page.sync="page"
-                layout="total, sizes, prev, pager, next"
-                :total="total"
-                style="float:right;"
-            ></el-pagination>
-        </el-col>
+                    <!--工具条 footer-->
+                    <el-col :span="24" class="toolbar">
+                        <el-pagination :key="projectListPageComponentKey"
+                            @size-change="handleSizeChange"
+                            @current-change="handleCurrentChange"
+                            :page-sizes="[20 , 50 , 80 , 100]"
+                            :page-size="size"
+                            :current-page.sync="page"
+                            layout="total, sizes, prev, pager, next"
+                            :total="total"
+                            style="float:right;"
+                        ></el-pagination>
+                    </el-col>
 
-        <!--新增界面-->
-        <el-dialog :title="title" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="960px" :top="'6vh'">
-            <div style="height: 72vh;overflow-y: auto;overflow-x: hidden;">
-                <el-form ref="form1" :model="addForm" :rules="rules" label-width="120px">
-                    <el-form-item :label="$t('Itemno')" :class="title == $t('newproject')" v-if="user.companyId!=936">
-                        <!-- <el-input v-model="addForm.code" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目编号" clearable></el-input> -->
-                        <el-input v-model="addForm.code" :placeholder="$t('peaseenterthe')" clearable :disabled="canOnlyModParticipator || (!permissions.projectManagement && addForm.creatorId != user.id && !permissions.projectCodeAndName)" maxlength="50" show-word-limit="true"></el-input>
-                    </el-form-item>
-                    <el-form-item :label="$t('headerTop.projectName')" prop="name">
-                        <!-- <el-input v-model="addForm.name" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目名称" clearable></el-input> -->
-                        <el-input v-model="addForm.name" :placeholder="$t('peaseenterthe')" clearable :disabled="canOnlyModParticipator || (!permissions.projectManagement && addForm.creatorId != user.id && !permissions.projectCodeAndName) || isShowProjectName" maxlength="255" show-word-limit="true"></el-input>
-                    </el-form-item>
-                    <el-form-item :label="$t('projectclassification')" v-if="user.timeType.mainProjectState != '1'">
-                        <!-- <el-select v-model="addForm.category"  style="width:32%;" clearable :disabled="!permissions.projectManagement && addForm.creatorId != user.id"> -->
-                        <el-select v-model="addForm.category"  style="width:32%;" clearable filterable :disabled="canOnlyModParticipator">
-                            <el-option v-for="(item) in baseClfList" :key="item.id" :value="item.id" :label="item.name"></el-option>
-                        </el-select>
-                    </el-form-item>
-                    <el-form-item :label="$t('projecttype')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" prop="isPublic">
-                        <el-select v-model="addForm.isPublic" style="width:32%;" @change="selectPublic" :disabled="canOnlyModParticipator">
-                            <el-option :value="0" :label="$t('zheng-shi-xiang-mu')"></el-option>
-                            <el-option :value="1" :label="$t('fei-xiang-mu')"></el-option>
-                        </el-select>
-                    </el-form-item>
-                    <el-form-item :label="$t('other.projectDescription')" prop="projectDesc">
-                        <!-- <el-input v-model="addForm.projectDesc" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目描述" clearable maxlength="4000"></el-input> -->
-                        <el-input v-model="addForm.projectDesc" :placeholder="$t('peaseenterthe')" clearable maxlength="4000" :disabled="canOnlyModParticipator" show-word-limit></el-input>
-                    </el-form-item>
-                    <el-form-item :label="$t('Allparticipants')" v-show="addForm.isPublic == 0" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
-                        <el-tooltip placement="top" effect="light" v-if="user.userNameNeedTranslate != 1">
+                    <!--新增界面-->
+                    <el-dialog :title="title" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="960px" :top="'6vh'">
+                        <div style="height: 72vh;overflow-y: auto;overflow-x: hidden;">
+                            <el-form ref="form1" :model="addForm" :rules="rules" label-width="120px">
+                                <el-form-item :label="$t('Itemno')" :class="title == $t('newproject')" v-if="user.companyId!=936">
+                                    <!-- <el-input v-model="addForm.code" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目编号" clearable></el-input> -->
+                                    <el-input v-model="addForm.code" :placeholder="$t('peaseenterthe')" clearable :disabled="canOnlyModParticipator || (!permissions.projectManagement && addForm.creatorId != user.id && !permissions.projectCodeAndName)" maxlength="50" show-word-limit="true"></el-input>
+                                </el-form-item>
+                                <el-form-item :label="$t('headerTop.projectName')" prop="name">
+                                    <!-- <el-input v-model="addForm.name" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目名称" clearable></el-input> -->
+                                    <el-input v-model="addForm.name" :placeholder="$t('peaseenterthe')" clearable :disabled="canOnlyModParticipator || (!permissions.projectManagement && addForm.creatorId != user.id && !permissions.projectCodeAndName) || isShowProjectName" maxlength="255" show-word-limit="true"></el-input>
+                                </el-form-item>
+                                <el-form-item :label="$t('projectclassification')" v-if="user.timeType.mainProjectState != '1'">
+                                    <!-- <el-select v-model="addForm.category"  style="width:32%;" clearable :disabled="!permissions.projectManagement && addForm.creatorId != user.id"> -->
+                                    <el-select v-model="addForm.category"  style="width:32%;" clearable filterable :disabled="canOnlyModParticipator">
+                                        <el-option v-for="(item) in baseClfList" :key="item.id" :value="item.id" :label="item.name"></el-option>
+                                    </el-select>
+                                </el-form-item>
+                                <el-form-item :label="$t('projecttype')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" prop="isPublic">
+                                    <el-select v-model="addForm.isPublic" style="width:32%;" @change="selectPublic" :disabled="canOnlyModParticipator">
+                                        <el-option :value="0" :label="$t('zheng-shi-xiang-mu')"></el-option>
+                                        <el-option :value="1" :label="$t('fei-xiang-mu')"></el-option>
+                                    </el-select>
+                                </el-form-item>
+                                <el-form-item :label="$t('other.projectDescription')" prop="projectDesc">
+                                    <!-- <el-input v-model="addForm.projectDesc" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目描述" clearable maxlength="4000"></el-input> -->
+                                    <el-input v-model="addForm.projectDesc" :placeholder="$t('peaseenterthe')" clearable maxlength="4000" :disabled="canOnlyModParticipator" show-word-limit></el-input>
+                                </el-form-item>
+                                <el-form-item :label="$t('Allparticipants')" v-show="addForm.isPublic == 0" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
+                                    <el-tooltip placement="top" effect="light" v-if="user.userNameNeedTranslate != 1">
 
-                            <div slot="content" style="width:780px">{{addForm.userNames}}</div>
-                            <el-input  @focus="showChooseMembTree" v-model="addForm.userNames"></el-input>
-                        </el-tooltip>
+                                        <div slot="content" style="width:780px">{{addForm.userNames}}</div>
+                                        <el-input  @focus="showChooseMembTree" v-model="addForm.userNames"></el-input>
+                                    </el-tooltip>
 
-                        <el-tooltip placement="top" effect="light" v-if="user.userNameNeedTranslate == 1">
-                            <div slot="content" style="width:780px">
-                                <span v-for="(item, index) in addFormUserNames" :key="index">
-                                    <!-- {{item}} -->
-                                    <ww-open-data type='userName' :openid='item'></ww-open-data>
-                                    <span v-if="index < addFormUserNames.length - 1">,</span>
-                                </span>
-                            </div>
-                            <div @click="showChooseMembTree" style="width: 800px;overflow:hidden;white-space:nowrap;height:40px;border: 1px solid #DCDFE6;border-radius: 4px;box-sizing: border-box;padding: 0 10px">
-                                <span v-for="(item, index) in addFormUserNames" :key="index">
-                                    <!-- {{item}} -->
-                                    <ww-open-data type='userName' :openid='item'></ww-open-data>
-                                    <span v-if="index < addFormUserNames.length - 1">,</span>
-                                </span>
-                            </div>
-                        </el-tooltip>
-                    </el-form-item>
-                    <el-form-item :label="$t('projectmanager')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" v-if="user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0)">
-                       <el-select v-if="user.userNameNeedTranslate != 1" v-model="addForm.inchargerId" filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" :disabled="canOnlyModParticipator || projectManagerEdit">
-                            <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id">
-                                <span style="float: left">{{ item.name }}</span>
-                            </el-option>
-                        </el-select>
-                        <selectCat v-if="user.userNameNeedTranslate == 1" :size="'medium'" :subject="participator" :subjectId="addForm.inchargerId" :distinction="'3'" @selectCal="selectCal" :disabled="canOnlyModParticipator || projectManagerEdit || isShowProjectName"></selectCat>
-                    </el-form-item>
+                                    <el-tooltip placement="top" effect="light" v-if="user.userNameNeedTranslate == 1">
+                                        <div slot="content" style="width:780px">
+                                            <span v-for="(item, index) in addFormUserNames" :key="index">
+                                                <!-- {{item}} -->
+                                                <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                                <span v-if="index < addFormUserNames.length - 1">,</span>
+                                            </span>
+                                        </div>
+                                        <div @click="showChooseMembTree" style="width: 800px;overflow:hidden;white-space:nowrap;height:40px;border: 1px solid #DCDFE6;border-radius: 4px;box-sizing: border-box;padding: 0 10px">
+                                            <span v-for="(item, index) in addFormUserNames" :key="index">
+                                                <!-- {{item}} -->
+                                                <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                                <span v-if="index < addFormUserNames.length - 1">,</span>
+                                            </span>
+                                        </div>
+                                    </el-tooltip>
+                                </el-form-item>
+                                <el-form-item :label="$t('projectmanager')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''" v-if="user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0)">
+                                <el-select v-if="user.userNameNeedTranslate != 1" v-model="addForm.inchargerId" filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" :disabled="canOnlyModParticipator || projectManagerEdit">
+                                        <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id">
+                                            <span style="float: left">{{ item.name }}</span>
+                                        </el-option>
+                                    </el-select>
+                                    <selectCat v-if="user.userNameNeedTranslate == 1" :size="'medium'" :subject="participator" :subjectId="addForm.inchargerId" :distinction="'3'" @selectCal="selectCal" :disabled="canOnlyModParticipator || projectManagerEdit || isShowProjectName"></selectCat>
+                                </el-form-item>
 
-                    <el-form-item :label="$t('newspaperauditor')">
-                        <el-select v-if="user.userNameNeedTranslate != '1'" @change="$forceUpdate()" v-model="addForm.auditUserIds"  :disabled="!(permissions.projectManagement|| user.id == addForm.inchargerId || user.id == addForm.creatorId)" filterable :placeholder="$t('defaultistheprojectleader')" style="width:100%;" :multiple="user.timeType.reportAuditType != 6" >
-                            <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
-                        </el-select>
-                        <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'medium'" :tile="true" :widthStr="'800'" :disabled="!(permissions.projectManagement|| user.id == addForm.inchargerId || user.id == addForm.creatorId)" :subjectId="addForm.auditUserIds" :subject="participator" :clearable="false" :distinction="'10'"  :multiSelect="user.timeType.reportAuditType != 6" @selectCal="selectCal"></selectCat>
-                    </el-form-item>
-                    <el-form-item :label="$t('ommencementDate')" prop="planStartDate"  v-if="(user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0))">
-                        <el-date-picker v-model="addForm.planStartDate" :disabled="canOnlyModParticipator"
-                        :editable="false" style="width:32%;" 
-                        format="yyyy-MM-dd" 
-                        value-format="yyyy-MM-dd"
-                        :clearable="false" type="date" 
-                        :placeholder="$t('optiondate')"></el-date-picker>
+                                <el-form-item :label="$t('newspaperauditor')">
+                                    <el-select v-if="user.userNameNeedTranslate != '1'" @change="$forceUpdate()" v-model="addForm.auditUserIds"  :disabled="!(permissions.projectManagement|| user.id == addForm.inchargerId || user.id == addForm.creatorId)" filterable :placeholder="$t('defaultistheprojectleader')" style="width:100%;" :multiple="user.timeType.reportAuditType != 6" >
+                                        <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                                    </el-select>
+                                    <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'medium'" :tile="true" :widthStr="'800'" :disabled="!(permissions.projectManagement|| user.id == addForm.inchargerId || user.id == addForm.creatorId)" :subjectId="addForm.auditUserIds" :subject="participator" :clearable="false" :distinction="'10'"  :multiSelect="user.timeType.reportAuditType != 6" @selectCal="selectCal"></selectCat>
+                                </el-form-item>
+                                <el-form-item :label="$t('ommencementDate')" prop="planStartDate"  v-if="(user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0))">
+                                    <el-date-picker v-model="addForm.planStartDate" :disabled="canOnlyModParticipator"
+                                    :editable="false" style="width:32%;" 
+                                    format="yyyy-MM-dd" 
+                                    value-format="yyyy-MM-dd"
+                                    :clearable="false" type="date" 
+                                    :placeholder="$t('optiondate')"></el-date-picker>
 
-                        <span style="margin-left:63px;margin-right:10px;" >{{ $t('ji-hua-jie-shu-ri-qi') }}</span>
-                        <el-date-picker v-model="addForm.planEndDate" style="width:33%;"
-                        :editable="false" :disabled="canOnlyModParticipator"
-                        format="yyyy-MM-dd" 
-                        value-format="yyyy-MM-dd"
-                        :clearable="false" type="date" 
-                        :placeholder="$t('optiondate')"></el-date-picker>
-                    </el-form-item>
-                    <!-- 项目基线 -->
-                    <div style="margin: 10px 0 30px 0;min-height:200px;" v-if="user.company.packageProject == 1 && !canOnlyModParticipator && (user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0))">
-                        <el-tabs v-model="activeName" @tab-click="handleClick">
-                        <el-tab-pane :label="$t('costbaseline')" name="baseCostPanel"  >
-                            <div style="padding-top:10px;">
-                                <!--新版 -->
-                                <span class="rg_span" v-for="(item, index) in projectBaseCostData" :key="item.id">
-                                    <span style="width:120px;display: inline-block;" v-if="user.company.packageProject==1">{{item.baseName}}</span>
-                                    <el-input :id="'baseCost'+index" @input="addUpfun()" v-model="item.baseAmount" style="width:200px; margin-bottom: 20px"
-                                    :placeholder="$t('zheng-shu')" clearable  @keyup.native="restrictNumber('baseCost'+index)"></el-input><span style="margin-left:10px;">{{ $t('yuan') }}</span>
-                                </span>    
+                                    <span style="margin-left:63px;margin-right:10px;" >{{ $t('ji-hua-jie-shu-ri-qi') }}</span>
+                                    <el-date-picker v-model="addForm.planEndDate" style="width:33%;"
+                                    :editable="false" :disabled="canOnlyModParticipator"
+                                    format="yyyy-MM-dd" 
+                                    value-format="yyyy-MM-dd"
+                                    :clearable="false" type="date" 
+                                    :placeholder="$t('optiondate')"></el-date-picker>
+                                </el-form-item>
+                                <!-- 项目基线 -->
+                                <div style="margin: 10px 0 30px 0;min-height:200px;" v-if="user.company.packageProject == 1 && !canOnlyModParticipator && (user.company.nonProjectSimple == 0 || (user.company.nonProjectSimple == 1 && addForm.isPublic == 0))">
+                                    <el-tabs v-model="activeName" @tab-click="handleClick">
+                                    <el-tab-pane :label="$t('costbaseline')" name="baseCostPanel"  >
+                                        <div style="padding-top:10px;">
+                                            <!--新版 -->
+                                            <span class="rg_span" v-for="(item, index) in projectBaseCostData" :key="item.id">
+                                                <span style="width:120px;display: inline-block;" v-if="user.company.packageProject==1">{{item.baseName}}</span>
+                                                <el-input :id="'baseCost'+index" @input="addUpfun()" v-model="item.baseAmount" style="width:200px; margin-bottom: 20px"
+                                                :placeholder="$t('zheng-shu')" clearable  @keyup.native="restrictNumber('baseCost'+index)"></el-input><span style="margin-left:10px;">{{ $t('yuan') }}</span>
+                                            </span>    
 
-                                <!-- 合计 -->
-                                <div style="margin-top: 10px;float:right;">
-                                    <span style="margin-right:50px;margin-right:10px;" v-if="user.company.packageProject==1">{{ $t('other.totals') }}</span>
-                                    <span v-if="addForm.budget <= 0 || addForm.budget == undefined">0</span>
-                                    <span v-else>{{addForm.budget | numberToCurrency}}</span>
-                                    <span style="margin-right:50px;margin-left:10px;">{{ $t('yuan') }}</span>
+                                            <!-- 合计 -->
+                                            <div style="margin-top: 10px;float:right;">
+                                                <span style="margin-right:50px;margin-right:10px;" v-if="user.company.packageProject==1">{{ $t('other.totals') }}</span>
+                                                <span v-if="addForm.budget <= 0 || addForm.budget == undefined">0</span>
+                                                <span v-else>{{addForm.budget | numberToCurrency}}</span>
+                                                <span style="margin-right:50px;margin-left:10px;">{{ $t('yuan') }}</span>
+                                            </div>
+                                        </div>
+                                    </el-tab-pane>
+                                    </el-tabs>
                                 </div>
-                            </div>
-                        </el-tab-pane>
-                        </el-tabs>
-                    </div>
-                
-                </el-form>  
-            </div>
-            <div slot="footer" class="dialog-footer;">
-                <el-button @click.native="deletePro(1, addForm)" v-if="(permissions.projectManagement || user.id==deleteVif) && addForm.id" style="float:left">{{ $t('btn.delete') }}</el-button>
-                <el-button @click.native="addFormVisible = false">{{ $t('btn.cancel') }}</el-button>
-                <el-button type="primary" @click="submitInsert" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
-            </div>
-        </el-dialog>
-        <!-- 按部门选择人员 -->
-        <el-dialog :title="$t('selectingParticipants')"  :visible.sync="chooseParticipVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
-            <!-- <el-input style="width:100%" v-model="filterName" placeholder="请输入姓名搜索" @change="findUserInTree"></el-input> -->
-            <div v-if="user.userNameNeedTranslate == '1'">
-                <el-input placeholder="请输入内容" v-model.trim="filterText" class="input-with-select">
-                    <el-button slot="append" icon="el-icon-search" @click="echartDepartment()"></el-button>
-                </el-input>
-            </div>
-            
-            <div class="tree" style="height:400px">
-                <el-scrollbar style="height:100%">
-                    <el-input
-                    :placeholder="$t('keywordfiltering')"
-                    v-model="filterText" v-if="user.userNameNeedTranslate != '1'">
-                    </el-input>
-                    <el-tree :data="deptMembData" :key="searchPersonnelFlgnum" show-checkbox :default-expand-all="searchPersonnelFlg" :props="defaultProps" node-key="id"
-                        ref="chooseMembTree" @check-change="onTreeItemChange" :default-checked-keys="addForm.userId"
-                        highlight-current  :filter-node-method="filterNode">
-                        <span class="custom-tree-node" slot-scope="{ node, data }">
-                            <span v-if="user.userNameNeedTranslate == '1'">
-                                <span v-if="node.data.children">
-                                    <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
-                                </span>
-                                <span v-else>
-                                    <ww-open-data type='userName' :openid='node.label'></ww-open-data>
-                                </span>
-                            </span>
-                            <span v-if="user.userNameNeedTranslate != '1'">
-                                {{ node.label }}
-                            </span>
-                            <!-- {{ node.label }} -->
-                        </span>
-                    </el-tree>
-                </el-scrollbar>
-            </div>
-            <div>{{ $t('btn.choose') }}&nbsp;{{chosenMembCount}}&nbsp;{{ $t('other.people') }}</div>
-            <div slot="footer" class="dialog-footer">
-                <el-button  @click="chooseParticipVisible = false" >{{ $t('btn.cancel') }}</el-button>
-                <el-button type="primary" @click="chooseParticip()" >{{ $t('btn.determine') }}</el-button>
-            </div>
-        </el-dialog>
-         <!--用户详细信息弹出框-->
-         <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
-            <div class="line"><span>{{ $t('lable.name') +":"}}</span>
-                <span v-if="user.userNameNeedTranslate != 1">{{userDetail.name}}</span>
-                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='userDetail.name'></ww-open-data></span>
-            </div>
-            <div class="line"><span>{{ $t('Worknumber') +":"}}</span><span>{{userDetail.jobNumber}}</span></div>
-            <div class="line"><span>{{ $t('lable.phone') +":"}}</span><span>{{userDetail.phone}}</span></div>
-            <div class="line"><span>{{ $t('jiao-se') +":"}}</span><span>{{userDetail.roleName}}</span></div>
-            <div class="line"><span>{{ $t('lable.department') +":"}}</span>
+                                <el-divider></el-divider>
+                                <template>
+                                    <div><span>{{'审核人'}}</span></div>
+                                    <div>
+                                        <div v-for="(item, index) in pointList" :key="index" >
+                                        第{{index+1}}审核人:
+                                        <el-select :disabled="item.status!=0" v-if="user.userNameNeedTranslate != 1" v-model="item.userId" style="width:140px;" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="manageSelect" size="small" filterable popper-class="managePopperClass">
+                                            <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
+                                                <span style="float: left">{{ item.name }}</span>
+                                            </el-option>
+                                        </el-select> 
+                                        <i class="el-icon-circle-plus-outline" @click="addInput(index)" v-if="index==pointList.length-1"></i>
+                                        <i class="el-icon-remove-outline" v-if="pointList.length>1 && item.status==0"  @click="deleteInput(index)"></i>
+                                        <span>{{item.status==0?'待审核':item.status==1?"已审核":"已驳回"}}</span>
+                                        </div>
+                                    </div>
+                            </template>
+                            </el-form>  
+                        </div>
+                        <div slot="footer" class="dialog-footer;">
+                            <el-button @click.native="deletePro(1, addForm)" v-if="(permissions.projectApprovalEdit) && addForm.id" style="float:left">{{ $t('btn.delete') }}</el-button>
+                            <el-button @click.native="addFormVisible = false">{{ $t('btn.cancel') }}</el-button>
+                            <el-button type="primary" @click="submitInsert" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
+                        </div>
+                    </el-dialog>
+                    <!-- 按部门选择人员 -->
+                    <el-dialog :title="$t('selectingParticipants')"  :visible.sync="chooseParticipVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
+                        <!-- <el-input style="width:100%" v-model="filterName" placeholder="请输入姓名搜索" @change="findUserInTree"></el-input> -->
+                        <div v-if="user.userNameNeedTranslate == '1'">
+                            <el-input placeholder="请输入内容" v-model.trim="filterText" class="input-with-select">
+                                <el-button slot="append" icon="el-icon-search" @click="echartDepartment()"></el-button>
+                            </el-input>
+                        </div>
+                        
+                        <div class="tree" style="height:400px">
+                            <el-scrollbar style="height:100%">
+                                <el-input
+                                :placeholder="$t('keywordfiltering')"
+                                v-model="filterText" v-if="user.userNameNeedTranslate != '1'">
+                                </el-input>
+                                <el-tree :data="deptMembData" :key="searchPersonnelFlgnum" show-checkbox :default-expand-all="searchPersonnelFlg" :props="defaultProps" node-key="id"
+                                    ref="chooseMembTree" @check-change="onTreeItemChange" :default-checked-keys="addForm.userId"
+                                    highlight-current  :filter-node-method="filterNode">
+                                    <span class="custom-tree-node" slot-scope="{ node, data }">
+                                        <span v-if="user.userNameNeedTranslate == '1'">
+                                            <span v-if="node.data.children">
+                                                <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                                            </span>
+                                            <span v-else>
+                                                <ww-open-data type='userName' :openid='node.label'></ww-open-data>
+                                            </span>
+                                        </span>
+                                        <span v-if="user.userNameNeedTranslate != '1'">
+                                            {{ node.label }}
+                                        </span>
+                                        <!-- {{ node.label }} -->
+                                    </span>
+                                </el-tree>
+                            </el-scrollbar>
+                        </div>
+                        <div>{{ $t('btn.choose') }}&nbsp;{{chosenMembCount}}&nbsp;{{ $t('other.people') }}</div>
+                        <div slot="footer" class="dialog-footer">
+                            <el-button  @click="chooseParticipVisible = false" >{{ $t('btn.cancel') }}</el-button>
+                            <el-button type="primary" @click="chooseParticip()" >{{ $t('btn.determine') }}</el-button>
+                        </div>
+                    </el-dialog>
+                    <!--用户详细信息弹出框-->
+                    <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
+                        <div class="line"><span>{{ $t('lable.name') +":"}}</span>
+                            <span v-if="user.userNameNeedTranslate != 1">{{userDetail.name}}</span>
+                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='userDetail.name'></ww-open-data></span>
+                        </div>
+                        <div class="line"><span>{{ $t('Worknumber') +":"}}</span><span>{{userDetail.jobNumber}}</span></div>
+                        <div class="line"><span>{{ $t('lable.phone') +":"}}</span><span>{{userDetail.phone}}</span></div>
+                        <div class="line"><span>{{ $t('jiao-se') +":"}}</span><span>{{userDetail.roleName}}</span></div>
+                        <div class="line"><span>{{ $t('lable.department') +":"}}</span>
 
-                <span v-if="user.userNameNeedTranslate != 1">{{userDetail.departmentName}}</span>
-                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='userDetail.departmentName'></ww-open-data></span>
+                            <span v-if="user.userNameNeedTranslate != 1">{{userDetail.departmentName}}</span>
+                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='userDetail.departmentName'></ww-open-data></span>
+                        </div>
+                        <div slot="footer" class="dialog-footer">
+                            <el-button type="primary" @click="userDetailVisible = false" >{{ $t('btn.determine') }}</el-button>
+                        </div>
+                    </el-dialog>
             </div>
-            <div slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="userDetailVisible = false" >{{ $t('btn.determine') }}</el-button>
-            </div>
-        </el-dialog>
+        </div>
     </section>
 </template>
 
@@ -317,11 +343,25 @@ return {
     dataDetail:{},
     userDetailVisible:false,
     userDetail:{},
+    pointList:[{
+        userId:"",
+        seq:1,
+        status:0
+    }],
+    idx: 1,
+    tableHeight: 0,
 }
 },
 computed: {},
 watch: {},
-created () {},
+created () {
+    let height = window.innerHeight;
+    this.tableHeight = height - 195;
+    const that = this;
+    window.onresize = function temp() {
+        that.tableHeight = window.innerHeight - 195;
+    };
+},
 mounted () {
     this.getList();
     this.getProjectBaseConfigList();
@@ -411,6 +451,10 @@ methods: {
                 if(this.addForm.category != null) {
                     targetData.category=this.addForm.category
                 }
+                //审核人
+                if (this.pointList) {
+                    targetData.projectApprovalCheckList=this.pointList
+                }
                 this.http.JSONPost("/project-approval/editProjectApproval",targetData,
                 res => {
                     this.addLoading = false;
@@ -529,30 +573,22 @@ methods: {
         } else {
             this.http.post('/project-approval/getDetail', {id: item.id},
             res => {
+                let theData=[];
             if (res.code == "ok") {
-                this.dataDetail=res.data
+                theData=res.data
             }
-            });
             var arr=[]
             var names=""
             var auditorArr=[]
-            if(this.dataDetail.participationApprovalList){
-                for(let i in this.dataDetail.participationApprovalList){
-                    arr.push(this.dataDetail.participationApprovalList[i].userId);
-                }
-                this.participator=this.dataDetail.participationApprovalList
-            }
-            if(this.dataDetail.participationApprovalList){
-                for(let i in this.dataDetail.participationApprovalList){
-                    names+=this.dataDetail.participationApprovalList[i].userName+",";
+            if(theData.participationApprovalList){
+                for(let i in theData.participationApprovalList){
+                    arr.push(theData.participationApprovalList[i].userId);
+                    names+=theData.participationApprovalList[i].userName+",";
                 }
             }
-            // if (names.length > 0) {
-            //     names = names.substring(0, names.length -1);
-            // }
-            if(this.dataDetail.projectApprovalAuditorList){
-                for(let i in this.dataDetail.projectApprovalAuditorList){
-                    auditorArr.push(this.dataDetail.projectApprovalAuditorList[i].auditorId)
+            if(theData.projectApprovalAuditorList){
+                for(let i in theData.projectApprovalAuditorList){
+                    auditorArr.push(theData.projectApprovalAuditorList[i].auditorId)
                 }
             }
             if (names.length > 0) {
@@ -583,10 +619,12 @@ methods: {
                 creatorId: item.creatorId,
                 outputValue: item.outputValue,
             }
+            this.participator=theData.participationApprovalList
             this.changeParticipator();
             this.getProjectBaseData(item.id);
+            this.getProjectCheckerData(item.id);
+            });
         }
-        console.log('=========>',this.participator)
         this.addFormVisible = true;
     },
     //获取项目列表
@@ -600,6 +638,7 @@ methods: {
             searchField: this.searchField,
             category:this.statusClf,
             status: this.status,
+            viewId:this.idx
         }
         this.http.post("/project-approval/listByPage", parameter,
         res => {
@@ -934,6 +973,29 @@ methods: {
                     }
                 );
     },
+    getProjectCheckerData(projectId) {
+        this.http.post('//project-approval-check/get',{projectId: projectId},
+                res => {
+                    if (res.code == "ok") {
+                        if(res.data.length>0){
+                            this.pointList = res.data;
+                        }
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.listLoading = false;
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                    }
+                );
+    },
     selectPublic() {
         if (this.addForm.isPublic == 1) {
             this.participator = this.users;
@@ -980,13 +1042,126 @@ methods: {
             });
         });
     },
+    addInput(index){
+        this.pointList.push({
+            userId:"",
+            seq:index+2,
+            status:0
+        })
+    },
+    deleteInput(index){
+        this.pointList.splice(index,1)
+        // if(this.pointList.length<=0){
+        //     this.pointList.push({
+        //     checkerId:""
+        //     })
+        // }
+    },
+    // 切换当前选项的索引
+    switchs(e) {
+        this.idx = e
+        this.page = 1
+        // console.log(this.searchField)
+        this.getList()
+    },
+    deletePro(i, item) {
+        this.$confirm('确定要删除立项[' + item.name +'吗]','删除立项', {
+            confirmButtonText: this.$t('btn.determine'),
+            cancelButtonText: this.$t('btn.cancel'),
+            type: "warning"
+        })
+        .then(() => {
+            this.listLoading = true;
+            this.http.post('/project-approval/delete',{ 
+                id: item.id 
+            },
+            res => {
+                this.listLoading = false;
+                if (res.code == "ok") {
+                    this.$message({
+                        message: this.$t('message.successfullyDeleted'),
+                        type: "success"
+                    });
+                    this.addFormVisible=false
+                    this.getList();
+                } else {
+                    this.$message({
+                        message: res.msg,
+                        type: "error"
+                    });
+                }
+            },
+            error => {
+                this.listLoading = false;
+                this.$message({
+                    message: error,
+                    type: "error"
+                });
+                }
+            );
+        })
+        .catch(() => {});
+    },
+    check(item,checkType,revokeType){
+        this.listLoading = true;
+        this.http.post('/project-approval/check',{ 
+            id:item.id ,
+            checkType:checkType,
+            revokeType:revokeType
+        },
+        res => {
+            this.listLoading = false;
+            if (res.code == "ok") {
+                this.$message({
+                    message: "操作成功",
+                    type: "success"
+                });
+                this.addFormVisible=false
+                this.getList();
+            } else {
+                this.$message({
+                    message: res.msg,
+                    type: "error"
+                });
+            }
+        },
+        error => {
+            this.listLoading = false;
+            this.$message({
+                message: error,
+                type: "error"
+            });
+            }
+        );
+    }
 },
 }
 </script>
-<style scoped lang='sass'>
-</style>
-<style>
+<style scoped>
 .toolbar_formitem_n1{
     margin-right: 0 !important;
 }
+.rg_span{
+    display: inline-block;
+}
+.classification {
+    width: 120px;
+    border-right: 1px solid #f2f2f2;
+    display: flex;
+    flex-wrap: wrap;
+    padding-top: 20px;
+}
+.classification p{
+    width: 120px;
+    text-align: center;
+    line-height: 50px;
+    margin: 0;
+    cursor: pointer;
+}
+.classification p:hover {
+    background: #dddddd;
+}
+.on {
+    color: #409EFF;
+}
 </style>