Jelajahi Sumber

收入分析

2545307760@qq.com 6 bulan lalu
induk
melakukan
d22b0edfc1

+ 1 - 0
web/package.json

@@ -18,6 +18,7 @@
         "@vueuse/core": "^10.7.2",
         "@wangeditor/editor": "^5.1.23",
         "@wangeditor/editor-for-vue": "^5.1.12",
+        "ant-design-vue": "4.x",
         "axios": "^1.4.0",
         "core-js": "^3.31.1",
         "echarts": "5.4.3",

+ 1 - 1
web/src/api/process.js

@@ -72,7 +72,7 @@ export const getExamineList = (data) => {
 }
 
 // 按id查询项目流程
-export const getIdProjectProcess = (id) => {
+export const getProjectProcessId = (id) => {
   return service({
     url: '/projectProcess/queryProjectProcessById?id=' + id,
     method: 'GET'

+ 8 - 0
web/src/api/project.js

@@ -115,3 +115,11 @@ export const queryProjectSum = (code) => {
     method: 'GET'
   })
 }
+
+// 按id 查询项目
+export const getProjectById = (id) => {
+  return service({
+    url: '/project/queryProjectById?id=' + id,
+    method: 'GET'
+  })
+}

+ 3 - 1
web/src/main.js

@@ -14,6 +14,7 @@ import auth from '@/directive/auth'
 import { store } from '@/pinia'
 import App from './App.vue'
 import { initDom } from './utils/positionToCode'
+import { DatePicker } from 'ant-design-vue'
 
 initDom()
 /**
@@ -22,6 +23,7 @@ initDom()
  * */
 import Nprogress from 'nprogress'
 import 'nprogress/nprogress.css'
+import 'ant-design-vue/dist/reset.css'
 Nprogress.configure({ showSpinner: false, ease: 'ease', speed: 500 })
 Nprogress.start()
 
@@ -36,7 +38,7 @@ app
   .use(run)
   .use(store)
   .use(auth)
-  .use(router)
+  .use(router).use(DatePicker)
   .mount('#app')
 
 export default app

+ 206 - 7
web/src/view/approve/approveDetail/approveDetail.vue

@@ -1,6 +1,138 @@
 <template>
   <div>
-    审批详情
+    <div
+      style="height: 760px"
+      class="bg-white"
+    >
+      <div class="basicInformation">
+        <div style="padding-top: 10px;margin-left: 40px">
+          <el-image :src="sign" />
+        </div>
+        <div style="display: flex;align-items: center">
+          <el-text
+            style="margin-left: 10px"
+            size="large"
+            tag="b"
+          >流程详情</el-text>
+        </div>
+      </div>
+      <el-row style="margin-top: 30px">
+        <el-col
+          style="margin-left: 40px"
+          :span="14"
+        >
+          <el-row>
+            <el-col
+              :span="24"
+            >
+              <el-steps
+                class="mb-4"
+                style="max-width: 900px"
+                :space="100"
+                :active="infoSteps"
+                simple
+              >
+                <el-step
+                  v-for="item in nodeList"
+                  :key="item.ID"
+                  :title="item.nodeName"
+                  icon="Document"
+                />
+              </el-steps>
+            </el-col>
+          </el-row>
+          <el-row style="margin-top: 20px">
+            <el-col
+              :span="5"
+            >
+              <el-text
+                class="peopleInfo"
+                line-clamp="1"
+              >申请人:{{ applyPeople }}</el-text>
+            </el-col>
+            <el-col
+              :span="5"
+              :offset="1"
+            >
+              <el-text
+                class="peopleInfo"
+                line-clamp="1"
+              >审核人:{{ checkPeople }}</el-text>
+            </el-col>
+          </el-row>
+          <el-row style="margin-top: 20px">
+            <el-col
+              :span="20"
+            >
+              <div class="collapseBox">
+                <el-collapse>
+                  <el-collapse-item
+                    v-for="item in comprehensive.descriptions"
+                    :key="item.ID"
+                    :title="item.node.nodeName"
+                    :name="item.ID"
+                  >
+                    <div>
+                      {{ item.approvalOpinion }}
+                    </div>
+                  </el-collapse-item>
+                </el-collapse>
+              </div>
+            </el-col>
+          </el-row>
+        </el-col>
+        <el-col
+          :span="9"
+        >
+          <el-row>
+            <el-col :span="8">
+              <el-button
+                icon="Notebook"
+                type="primary"
+              >补充文件</el-button>
+            </el-col>
+            <el-col :span="8">
+              <el-button
+                  size="large"
+                  icon="Back"
+                  @click="openRepulse"
+              >打回申请</el-button>
+            </el-col>
+            <el-col :span="8">
+              <el-button
+                  size="large"
+                  icon="Right"
+              >审核通过</el-button>
+            </el-col>
+          </el-row>
+          <el-table style="margin-top: 30px">
+            <el-table-column label="ID" align="center"></el-table-column>
+            <el-table-column label="文件名称" align="center"></el-table-column>
+          </el-table>
+        </el-col>
+      </el-row>
+    </div>
+    <el-dialog
+      v-model="repulseShow"
+      title="打回申请"
+    >
+      <el-form style="margin-top: 20px">
+        <el-form-item>
+          <el-input
+            placeholder="请输入打回申请的理由以便申请人补充文件"
+            type="textarea"
+            :rows="5"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button
+          type="primary"
+          size="large"
+          @click="repulseApply"
+        >确认</el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -8,22 +140,89 @@
 defineOptions({
   name: 'ApproveDetail'
 })
-import { onMounted } from 'vue'
+import { onMounted, reactive, ref } from 'vue'
 import { useRoute } from 'vue-router'
-import { getProcessIdDescribe } from '@/api/process'
+import { getProjectProcessId } from '@/api/process'
+import { queryFileList } from '@/api/file'
+import sign from '@/assets/sign.png'
 const route = useRoute()
 onMounted(() => {
-  queryProcessIdDescribe()
+  queryProjectProcessById()
 })
-const queryProcessIdDescribe = () => {
-  getProcessIdDescribe(route.query.id).then(res => {
+// 查询项目文件条件
+const fileCondition = reactive({
+  code: '',
+  name: '',
+  genre: 0,
+  pageInfo: {
+    page: 1,
+    pageSize: 1000
+  }
+})
+// 项目流程信息
+const comprehensive = reactive({})
+// 节点数组
+const nodeList = reactive([])
+// 步骤进度
+const infoSteps = ref(0)
+// 申请人
+const applyPeople = ref('')
+// 审核人
+const checkPeople = ref('')
+const queryProjectProcessById = () => {
+  const id = route.query.id
+  getProjectProcessId(id).then(res => {
     if (res.code === 0) {
-      console.log(res)
+      const data = res.data
+      nodeList.length = 0
+      nodeList.push(...data.process.nodes)
+      nodeList.forEach(item => {
+        if (item.ID === data.node.ID) {
+          infoSteps.value = item.order - 1
+        }
+      })
+      Object.assign(comprehensive, data)
+      // 申请人、审核人
+      applyPeople.value = data.user.nickName
+      checkPeople.value = data.node.approver.nickName
+      fileCondition.code = comprehensive.code
+      queryFileList(fileCondition).then(res => {
+        if (res.code === 0) {
+          console.log(res.data.list)
+        }
+      })
     }
   })
 }
+// 备注描述列表
+// const activeNames = ref(true)
+//
+// const handleChange = () => {}
+
+// 打回申请
+const repulseShow = ref(false)
+const openRepulse = () => {
+  repulseShow.value = true
+}
+const repulseApply = () => {}
 </script>
 
 <style scoped>
+.basicInformation{
+  height: 40px;
+  background-color: #f8fafd;
+  display: flex;
+  /*align-items: center;*/
+}
+.collapseBox{
+  width: 100%;
+  height: 400px;
+  padding: 10px;
+  overflow: scroll;
+}
 
+.peopleInfo{
+  font-size: 18px;
+  font-weight: 500;
+}
 </style>

+ 72 - 18
web/src/view/approve/approveList/components/inspectList.vue

@@ -1,6 +1,44 @@
 <template>
   <div>
-    审批列表
+    <el-row style="margin-top: 5px">
+      <el-col :span="24">
+        <el-table :data="itemApproveList">
+          <el-table-column
+            label="项目流程名称"
+            align="center"
+            prop="projectProcessName"
+          />
+          <el-table-column
+            label="流程名称"
+            align="center"
+            prop="process.processName"
+          />
+          <el-table-column
+            label="流程类型"
+            align="center"
+            prop="process.processType"
+          />
+          <el-table-column
+            label="当前流程节点"
+            align="center"
+            prop="node.nodeName"
+          />
+          <el-table-column
+            label="操作"
+            align="center"
+          >
+            <template #default="scope">
+              <el-button
+                type="primary"
+                icon="Memo"
+                text
+                @click="jumpApproveDetail(scope.row)"
+              >详情</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-col>
+    </el-row>
   </div>
 </template>
 
@@ -8,25 +46,41 @@
 defineOptions({
   name: 'InspectList'
 })
-import { onMounted } from 'vue'
-// import { getExamineList } from '@/api/process'
+import { onMounted, reactive } from 'vue'
+import { getExamineList } from '@/api/process'
+import { useRouter } from 'vue-router'
+import { useUserStore } from '@/pinia/modules/user'
+
+const router = useRouter()
+
 onMounted(() => {
-  queryExamineList()
+  queryApproveList()
+})
+const user = useUserStore()
+// 查询项目审批列表
+const condition = reactive({
+  pageInfo: {
+    page: 1,
+    pageSize: 10,
+  },
+  userId: user.userInfo.ID
 })
-// const condition = reactive({
-//   pageInfo: {
-//     page: 1,
-//     pageSize: 10,
-//   },
-//   userId: 1
-// })
-const queryExamineList = () => {
-  // getExamineList(condition).then(res => {
-  //   console.log(res)
-  //   if (res.code === 0) {
-  //     console.log(res.data)
-  //   }
-  // })
+const itemApproveList = reactive([])
+const queryApproveList = () => {
+  getExamineList(condition).then(res => {
+    if (res.code === 0) {
+      console.log(res.data.list)
+      const list = res.data.list
+      itemApproveList.length = 0
+      itemApproveList.push(...list)
+    }
+  })
+}
+
+// 跳转到详情页
+const jumpApproveDetail = (row) => {
+  console.log(row)
+  router.push({ path: '/layout/approve/approveDetail', query: { id: row.ID }})
 }
 </script>
 

+ 3 - 3
web/src/view/approve/approveList/components/promoterList.vue

@@ -49,26 +49,26 @@ defineOptions({
 import { onMounted, reactive } from 'vue'
 import { getApplyList } from '@/api/process'
 import { useRouter } from 'vue-router'
+import { useUserStore } from '@/pinia/modules/user'
 
 const router = useRouter()
 
 onMounted(() => {
   queryApproveList()
 })
-
+const user = useUserStore()
 // 查询项目审批列表
 const condition = reactive({
   pageInfo: {
     page: 1,
     pageSize: 10,
   },
-  userId: 0
+  userId: user.userInfo.ID
 })
 const itemApproveList = reactive([])
 const queryApproveList = () => {
   getApplyList(condition).then(res => {
     if (res.code === 0) {
-      console.log(res.data.list)
       const list = res.data.list
       itemApproveList.length = 0
       itemApproveList.push(...list)

+ 6 - 3
web/src/view/approve/flowManage/components/nodeManage.vue

@@ -224,8 +224,10 @@ const openAddDialog = () => {
 }
 
 const editId = ref(0)
+const nodeOrder = ref(0)
 const editNode = (row) => {
   editId.value = row.ID
+  nodeOrder.value = row.order
   createNodeData.approverId = row.approverId
   createNodeData.nodeName = row.nodeName
   createNodeData.nodeDescription = row.nodeDescription
@@ -249,14 +251,18 @@ const createNode = () => {
     const editData = {
       id: editId.value,
       nodeName: createNodeData.nodeName,
+      nodeOrder: nodeOrder.value,
       approverId: createNodeData.approverId,
       nodeDescription: createNodeData.nodeDescription
     }
     putNode(editData).then(res => {
+      console.log(res)
       if (res.code === 0) {
         ElMessage.success('修改成功')
         addDialogShow.value = false
         point.queryNodeList(condition)
+      } else if (res.code === 7) {
+        ElMessage.error(res.msg)
       }
     })
   }
@@ -292,9 +298,6 @@ const deleteNode = (val) => {
     })
 }
 
-const handleCurrentChange = () => {}
-
-const handleSizeChange = () => {}
 
 </script>