Parcourir la source

Merge remote-tracking branch 'origin/master'

ZaiZai il y a 2 ans
Parent
commit
fcc10f2b51
54 fichiers modifiés avec 1867 ajouts et 1349 suppressions
  1. 22 13
      src/api/modules/expense/purchaseRequest.js
  2. 37 30
      src/api/modules/project/cost.js
  3. 37 0
      src/api/modules/static/actual.js
  4. 2 2
      src/views/attendance/business-trip/index.vue
  5. 54 15
      src/views/attendance/business-trip/info.vue
  6. 2 2
      src/views/expense/finReimburse/index.vue
  7. 3 1
      src/views/expense/finReimburse/record.vue
  8. 2 2
      src/views/expense/invoice/index.vue
  9. 64 56
      src/views/expense/loanRequest/index.vue
  10. 23 4
      src/views/expense/loanRequest/record.vue
  11. 64 56
      src/views/expense/outsourcing/index.vue
  12. 2 1
      src/views/expense/outsourcing/record.vue
  13. 66 58
      src/views/expense/paymentRequest/index.vue
  14. 1 0
      src/views/expense/paymentRequest/record.vue
  15. 78 56
      src/views/expense/purchaseRequest/index.vue
  16. 3 1
      src/views/expense/purchaseRequest/record.vue
  17. 66 57
      src/views/expense/vehicleRequest/index.vue
  18. 21 11
      src/views/home/components/TaskTable.vue
  19. 93 94
      src/views/home/task/components/cost-budget.vue
  20. 63 43
      src/views/home/task/components/loan-request.vue
  21. 6 5
      src/views/home/task/task-details.vue
  22. 75 70
      src/views/people/archive/index.vue
  23. 1 1
      src/views/people/archive/info.vue
  24. 40 34
      src/views/people/contract/index.vue
  25. 58 52
      src/views/people/dimission.vue
  26. 3 3
      src/views/people/entry.vue
  27. 53 52
      src/views/people/salary.vue
  28. 16 24
      src/views/program/annual/form.vue
  29. 48 44
      src/views/program/annual/index.vue
  30. 5 3
      src/views/program/project/form.vue
  31. 29 16
      src/views/program/project/index.vue
  32. 82 76
      src/views/program/section/index.vue
  33. 6 0
      src/views/project/contract/components/base.vue
  34. 4 4
      src/views/project/contract/index.vue
  35. 33 22
      src/views/project/cost/form.vue
  36. 4 4
      src/views/project/cost/index.vue
  37. 26 25
      src/views/project/list/index.vue
  38. 43 10
      src/views/project/list/list-info.vue
  39. 51 15
      src/views/static/actual.vue
  40. 101 57
      src/views/static/components/tab-all.vue
  41. 39 32
      src/views/static/components/tab-decost.vue
  42. 33 26
      src/views/static/components/tab-mannager.vue
  43. 27 21
      src/views/static/components/tab-month.vue
  44. 29 15
      src/views/system/components/tab-approve.vue
  45. 78 23
      src/views/system/components/tab-cost.vue
  46. 28 17
      src/views/system/components/tab-invoice.vue
  47. 1 0
      src/views/system/components/tab-price-type.vue
  48. 16 4
      src/views/system/components/tab-price.vue
  49. 30 17
      src/views/system/components/tab-reimbursement.vue
  50. 31 18
      src/views/system/components/tab-task-type.vue
  51. 61 58
      src/views/system/organization.vue
  52. 104 96
      src/views/system/user.vue
  53. 2 2
      src/views/task/logs/index.vue
  54. 1 1
      src/views/task/plan/components/TaskTable.vue

+ 22 - 13
src/api/modules/expense/purchaseRequest.js

@@ -1,4 +1,4 @@
-import {httpApi} from "../../request/httpApi";
+import { httpApi } from '../../request/httpApi'
 
 export default {
     //分页查询
@@ -6,47 +6,56 @@ export default {
         return httpApi({
             url: '/api/blade-control/expense/purchase/page',
             method: 'post',
-            data: form
-        }, msg);
+            data: form,
+        }, msg)
     },
     //草稿箱列表
     async draft(form = {}, msg = false) {
         return httpApi({
             url: '/api/blade-control/expense/purchase/draft/list',
             method: 'get',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
     //数据详情
     async detail(form, msg = false) {
         return httpApi({
             url: '/api/blade-control/expense/purchase/draft/detail',
             method: 'get',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
     //提交申请
     async submit(form, msg = false) {
         return httpApi({
             url: '/api/blade-control/expense/purchase/submit',
             method: 'post',
-            data: form
-        }, msg);
+            data: form,
+        }, msg)
     },
     //记录物理删除
     async remove(form, msg = false) {
         return httpApi({
             url: '/api/blade-control/expense/purchase/remove',
             method: 'post',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
     //记录撤销
     async cancel(form, msg = false) {
         return httpApi({
             url: '/api/blade-control/expense/purchase/cancel',
             method: 'post',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
+    //获取采购单位
+    async getUseOrgNameList(form, msg = false) {
+        return httpApi({
+            url: '/api/blade-control/ex/ma/getUseOrgNameList',
+            method: 'get',
+            params: form,
+        }, msg)
+    },
+
 }

+ 37 - 30
src/api/modules/project/cost.js

@@ -1,4 +1,4 @@
-import {httpApi} from "../../request/httpApi";
+import { httpApi } from '../../request/httpApi'
 
 export default {
     //获取分页
@@ -6,72 +6,79 @@ export default {
         return httpApi({
             url: '/api/blade-control/projectCostBudgetStats/page',
             method: 'get',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
     //获取详情
     async getBudgetStatsById(form, msg = true) {
         return httpApi({
             url: '/api/blade-control/projectCostBudgetStats/getBudgetStatsById',
             method: 'get',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
     //查询预览测算
     async getBudgetList(form, msg = true) {
         return httpApi({
             url: '/api/blade-control/projectCostBudgetStats/budgetList',
             method: 'get',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
     //获取未做预算的项目列表
     async getProjectList(form, msg = true) {
         return httpApi({
             url: '/api/blade-control/projectCostBudgetStats/getProjectList',
             method: 'get',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
     //获取费用分类
     async getCostTypeDict(form, msg = true) {
         return httpApi({
             url: '/api/blade-control/projectCostBudgetStats/getCostTypeDict',
             method: 'get',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
     //获取岗位字典
     async getPostDict(form, msg = true) {
         return httpApi({
             url: '/api/blade-control/projectCostBudgetStats/getPostDict',
             method: 'get',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
     //获取项目环节
     async getProcessList(form, msg = true) {
         return httpApi({
             url: '/api/blade-control/projectCostBudgetStats/getProcessList',
             method: 'get',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
     //获取预算分类
     async getSecondSubject(form, msg = true) {
         return httpApi({
             url: '/api/blade-control/annualBudget/getSecondSubject',
             method: 'get',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
+    },
+    async getSecondSubject2(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-control/annualBudget/getSecondSubject2',
+            method: 'get',
+            params: form,
+        }, msg)
     },
     //获取任务明细
     async getChlidList(form, msg = true) {
         return httpApi({
             url: '/api/blade-control/dictinfo/child-list',
             method: 'get',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
     ///新增或修改成本测算
     async AddOrUpdate(form, msg = true) {
@@ -79,40 +86,40 @@ export default {
             url: '/api/blade-control/projectCostBudgetStats/AddOrUpdate',
             method: 'post',
             data: form,
-            isDelay: true
-        }, msg);
+            isDelay: true,
+        }, msg)
     },
     //删除成本预算
     async deleteByStatsId(form, msg = true) {
         return httpApi({
             url: '/api/blade-control/projectCostBudgetStats/deleteByStatsId',
             method: 'get',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
     //成本测算审批提交
     async submitApprove(form, msg = true) {
         return httpApi({
             url: '/api/blade-control/approve/cost/budget/submit',
             method: 'get',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
     //获取费用支出所属分类
     async getCostType(form, msg = true) {
         return httpApi({
             url: '/api/blade-control/projectCostBudget/getCostType',
             method: 'get',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
     //获取参建方
     async getUnitType(form, msg = true) {
         return httpApi({
             url: '/api/blade-control/projectCostBudget/getUnitType',
             method: 'get',
-            params: form
-        }, msg);
+            params: form,
+        }, msg)
     },
     //成本测算-统计一行金额
     async saveCountMoney(form, msg = true) {
@@ -120,7 +127,7 @@ export default {
             url: '/api/blade-control/projectCostBudget/saveCountMoney',
             method: 'post',
             data: form,
-        }, msg);
+        }, msg)
     },
 }
 

+ 37 - 0
src/api/modules/static/actual.js

@@ -0,0 +1,37 @@
+import { httpApi } from '../../request/httpApi'
+
+export default {
+    //预算与实际统计-月度统计
+    async budgetAndPracticalByMonth(form) {
+        return httpApi({
+            url: '/api/blade-control/annualBudget/budgetAndPracticalByMonth',
+            method: 'get',
+            params: form,
+        }, false)
+    },
+    //预算与实际统计-部门支出统计
+    async budgetAndPracticalByDept(form) {
+        return httpApi({
+            url: '/api/blade-control/annualBudget/budgetAndPracticalByDept',
+            method: 'get',
+            params: form,
+        }, false)
+    },
+    //预算与实际统计-人工和管理统计
+    async budgetAndPracticalByManage(form) {
+        return httpApi({
+            url: '/api/blade-control/annualBudget/budgetAndPracticalByManage',
+            method: 'get',
+            params: form,
+        }, false)
+    },
+    //预算与实际统计-总经营
+    async budgetAndPracticalByBusiness(form) {
+        return httpApi({
+            url: '/api/blade-control/annualBudget/budgetAndPracticalByBusiness',
+            method: 'get',
+            params: form,
+        }, false)
+    },
+
+}

+ 2 - 2
src/views/attendance/business-trip/index.vue

@@ -22,11 +22,11 @@
             </div>
         </template>
         <template #extra>
-            <el-button type="warning" size="large" @click="toImportTempClick">
+            <el-button v-auth-btn="['attendance-business-trip-draft-btn']" type="warning" size="large" @click="toImportTempClick">
                 <HcIcon name="delete-bin-2" />
                 <span>草稿箱{{ draftNum > 0 ? `(${draftNum})` : '' }}</span>
             </el-button>
-            <el-button type="primary" size="large" class="ml-2" @click="addinfoClick">
+            <el-button v-auth-btn="['attendance-business-trip-add-btn']" type="primary" size="large" class="ml-2" @click="addinfoClick">
                 <HcIcon name="add" />
                 <span>新增出差申请</span>
             </el-button>

+ 54 - 15
src/views/attendance/business-trip/info.vue

@@ -157,10 +157,10 @@
         >
             <HcTable :column="tableBudgetColumn" :datas="tableBudgetData" :loading="tableBudgetLoading">
                 <template #action="{ row, index }">
-                    <el-button v-if="row.relevance" size="small" type="danger" @click="row.relevance = false">
+                    <el-button v-if="row.isRelevance" size="small" type="danger" @click="rowDisassociate(row)">
                         取消关联
                     </el-button>
-                    <el-button v-else size="small" type="primary" @click="row.relevance = true">
+                    <el-button v-else size="small" type="primary" @click="rowRelevance(row)">
                         关联
                     </el-button>
                 </template>
@@ -482,24 +482,19 @@ const getApprovesListData = async ()=>{
         timeLineData.value = []
     }
 }
-//返回
-const goBackClick = () => {
-  router.back()
-}
-
-//提交保存
-const doubleClick = () => {
 
-}
 
 //关联预算计划
 const budgetModal = ref(false)
 const budgetIds = ref([])
 const budgetIndex = ref([])
+const relatedIds = ref([])
 const budgetModalShow = (item, index) => {
     budgetModal.value = true
     budgetIndex.value = index
     // budgetIds.value = item.budgetPlanIds?.split(',') || []
+    const { budgetPlanIds } = formModel.value
+    relatedIds.value = budgetPlanIds?.split(',') || []
     budgetIds.value = formModel.value.projectId
     getBudgetTableData(formModel.value.projectId)
 }
@@ -507,15 +502,20 @@ const budgetCloseClick = () => {
     budgetModal.value = false
 }
 const budgetSaveClick = () => {
-
+    // const index = budgetIndex.value
+    const ids = relatedIds.value.join(',')
+    formModel.value.budgetPlanIds = ids
+    window.$message.success('操作成功')
+    budgetModal.value = false
+    console.log( formModel.value, ' formModel.value.value.details')
 }
 
 //关联预算计划表格
 const tableBudgetColumn = [
-    { key: 'key1', name: '任务所属项目' },
-    { key: 'key2', name: '状态', width: '120', align: 'center' },
-    { key: 'key3', name: '任务描述' },
-    { key: 'key4', name: '完成指标', width: '120', align: 'center' },
+    { key: 'projectName', name: '任务所属项目' },
+    { key: 'statusName', name: '状态', width: '120', align: 'center' },
+    { key: 'planTaskDesc', name: '任务描述' },
+    { key: 'planTarget', name: '完成指标', width: '120', align: 'center' },
     { key: 'action', name: '操作', width: '100', align: 'center' },
 ]
 
@@ -532,6 +532,44 @@ const getBudgetTableData = async (projectId) => {
         tableBudgetData.value = []
     }
 }
+//判断是否关联
+const isRowRelevance = async (data) => {
+    const res = getArrValue(data)
+    const ids = relatedIds.value
+    console.log(relatedIds.value, 'relatedIds.value')
+    res.forEach(item => {
+        console.log(item.id, 'item.id')
+        item.isRelevance = ids.includes(item.id)
+    })
+    return res
+}
+
+//取消关联
+const rowDisassociate = (row) => {
+    const ids = relatedIds.value
+    const index = ids.indexOf(row.id)
+    if (index > -1) {
+        ids.splice(index, 1)
+    }
+    relatedIds.value = ids
+    row.isRelevance = false
+
+
+}
+
+//关联
+const rowRelevance = (row) => {
+    tableBudgetData.value.forEach((ele)=>{
+        ele.isRelevance = false
+        rowDisassociate(ele)
+    })
+    const ids = relatedIds.value
+    console.log(relatedIds.value, 'relatedIds.value')
+    ids.push(row.id)
+    relatedIds.value = ids
+    row.isRelevance = true
+}
+
 //行程
 const detailsObj1 = {
     trafficType: '', // 交通工具
@@ -553,6 +591,7 @@ const detailsObj = {
     projectId: '', // 所属项目
     submitStatus: null, // 审提交状态 1=暂存 2=提交审批
     journeyList: [detailsObj1],
+    budgetPlanIds:null, //预算计划ID
 }
 const fellowTravelerUserIds = ref([])
 //处理表单数据

+ 2 - 2
src/views/expense/finReimburse/index.vue

@@ -25,11 +25,11 @@
             </div>
         </template>
         <template #extra>
-            <el-button size="large" type="warning" hc-btn @click="draftsClick">
+            <el-button v-auth-btn="['expense-finReimburse-draft-btn']" size="large" type="warning" hc-btn @click="draftsClick">
                 <HcIcon name="draft" />
                 <span>草稿箱{{ draftNum > 0 ? `(${draftNum})` : '' }}</span>
             </el-button>
-            <el-button size="large" type="primary" hc-btn @click="addRowClick">
+            <el-button v-auth-btn="['expense-finReimburse-edit-btn']" size="large" type="primary" hc-btn @click="addRowClick">
                 <HcIcon name="add" />
                 <span>新增报销记录</span>
             </el-button>

+ 3 - 1
src/views/expense/finReimburse/record.vue

@@ -285,7 +285,7 @@ const changeDeductLoan = (val)=>{
  if (val) {
     loanListData.value.forEach((ele)=>{
         if (ele.id === val) {
-            detailsData.value.frMoneyActual = totalFrMoney.value - Number(ele.loanMoney)
+            detailsData.value.frMoneyActual = totalFrMoney.value - Number(ele.loanMoney) > 0 ? totalFrMoney.value - Number(ele.loanMoney) : null
         }
     })
  } else {
@@ -361,6 +361,7 @@ const getDetailsData = async () => {
             })
             //明细数据
             Object.keys(detailsObj1).forEach(key => {
+              
                 newDetails1[key] = res[key]
             })
             newDetails1.id = res?.id
@@ -386,6 +387,7 @@ const getDetailsData = async () => {
                 //基础数据
                 if (index === 0) {
                     Object.keys(detailsObj).forEach(key => {
+                        item['frMoney'] = Number(item['frMoney'])
                         newDetails[key] = item[key]
                     })
                 }

+ 2 - 2
src/views/expense/invoice/index.vue

@@ -20,11 +20,11 @@
             </div>
         </template>
         <template #extra>
-            <el-button size="large" type="warning" hc-btn @click="draftsClick">
+            <el-button v-auth-btn="['expense-invoice-draft-btn']" size="large" type="warning" hc-btn @click="draftsClick">
                 <HcIcon name="draft" />
                 <span>草稿箱{{ draftNum > 0 ? `(${draftNum})` : '' }}</span>
             </el-button>
-            <el-button size="large" type="primary" hc-btn @click="addRowClick">
+            <el-button v-auth-btn="['expense-invoice-add-btn']" size="large" type="primary" hc-btn @click="addRowClick">
                 <HcIcon name="add" />
                 <span>开票审批</span>
             </el-button>

+ 64 - 56
src/views/expense/loanRequest/index.vue

@@ -3,60 +3,68 @@
         <template #header>
             <div class="w-36">
                 <el-select v-model="searchForm.loanUserName" block clearable placeholder="申请人" size="large">
-                    <el-option v-for="item in loanuserList" :label="item" :value="item"/>
+                    <el-option v-for="item in loanuserList" :label="item" :value="item" />
                 </el-select>
             </div>
             <div class="ml-4">
-                <el-button type="primary" @click="searchClick" size="large">
-                    <HcIcon name="search-2"/>
+                <el-button type="primary" size="large" @click="searchClick">
+                    <HcIcon name="search-2" />
                     <span>搜索</span>
                 </el-button>
             </div>
             <div class="ml-2">
                 <el-button size="large" @click="resetClick">
-                    <HcIcon name="close-circle"/>
+                    <HcIcon name="close-circle" />
                     <span>重置</span>
                 </el-button>
             </div>
         </template>
         <template #extra>
-            <el-button size="large" type="warning" hc-btn @click="draftsClick">
-                <HcIcon name="draft"/>
-                <span>草稿箱{{draftNum > 0 ? `(${draftNum})` : ''}}</span>
+            <el-button v-auth-btn="['expense-loanRequest-draft-btn']" size="large" type="warning" hc-btn @click="draftsClick">
+                <HcIcon name="draft" />
+                <span>草稿箱{{ draftNum > 0 ? `(${draftNum})` : '' }}</span>
             </el-button>
-            <el-button size="large" type="primary" hc-btn @click="addRowClick">
-                <HcIcon name="add"/>
+            <el-button v-auth-btn="['expense-loanRequest-add-btn']" size="large" type="primary" hc-btn @click="addRowClick">
+                <HcIcon name="add" />
                 <span>新增借款申请</span>
             </el-button>
         </template>
 
         <HcTable :column="tableColumn" :datas="tableData" :loading="tableLoading">
-            <template #action="{row,index}">
+            <template #action="{ row, index }">
                 <el-popconfirm title="是否确认撤销?" hide-icon @confirm="rowCancel(row)">
                     <template #reference>
-                        <el-button size="small" type="primary"
-                                   :disabled="row.status !== 1"
-                                   :loading="row.isCancelLoading"
-                        >撤销</el-button>
+                        <el-button
+                            size="small" type="primary"
+                            :disabled="row.status !== 1"
+                            :loading="row.isCancelLoading"
+                        >
+                            撤销
+                        </el-button>
                     </template>
                 </el-popconfirm>
             </template>
         </HcTable>
 
         <template #action>
-            <HcPages :pages="searchForm" @change="pageChange"/>
+            <HcPages :pages="searchForm" @change="pageChange" />
         </template>
 
-        <!--草稿箱-->
-        <HcDialog isToBody isTable bgColor="#ffffff" widths="62rem" :footer="false" :show="draftsModal"
-                  :title="draftNum > 0 ? `草稿箱(${draftNum})` : '草稿箱'" @close="draftsCloseClick"
+        <!-- 草稿箱 -->
+        <HcDialog
+            is-to-body is-table bg-color="#ffffff" widths="62rem" :footer="false" :show="draftsModal"
+            :title="draftNum > 0 ? `草稿箱(${draftNum})` : '草稿箱'" @close="draftsCloseClick"
         >
             <el-alert title="3个月内未更新的草稿将被自动删除" type="warning" show-icon />
             <div style="position: relative;height: calc(100% - 44px);">
-                <HcTable :isIndex="false" :column="tableDraftsColumn" :datas="tableDraftsData">
-                    <template #action="{row,index}">
-                        <el-button size="small" type="primary" @click="editDraftClick(row)">继续编辑</el-button>
-                        <el-button size="small" type="danger" @click="delDraftClick(row)">删除</el-button>
+                <HcTable :is-index="false" :column="tableDraftsColumn" :datas="tableDraftsData">
+                    <template #action="{ row, index }">
+                        <el-button size="small" type="primary" @click="editDraftClick(row)">
+                            继续编辑
+                        </el-button>
+                        <el-button size="small" type="danger" @click="delDraftClick(row)">
+                            删除
+                        </el-button>
                     </template>
                 </HcTable>
             </div>
@@ -65,11 +73,11 @@
 </template>
 
 <script setup>
-import {onActivated, ref} from "vue";
-import {useRouter} from 'vue-router'
-import mainApi from "~api/expense/loanRequest";
-import {getArrValue} from "js-fast-way";
-import {delMessage} from "~uti/tools";
+import { onActivated, ref } from 'vue'
+import { useRouter } from 'vue-router'
+import mainApi from '~api/expense/loanRequest'
+import { getArrValue } from 'js-fast-way'
+import { delMessage } from '~uti/tools'
 
 const router = useRouter()
 
@@ -84,21 +92,21 @@ const getApi = () => {
 }
 
 //搜索表单
-const searchForm = ref({loanUserName: null, current: 1, size: 20, total: 0})
+const searchForm = ref({ loanUserName: null, current: 1, size: 20, total: 0 })
 
 //搜索
 const searchClick = () => {
-    searchForm.value.current = 1;
+    searchForm.value.current = 1
     getTableData()
 }
 
 //重置搜索表单
 const resetClick = () => {
-    searchForm.value = {current: 1, size: 20, total: 0}
+    searchForm.value = { current: 1, size: 20, total: 0 }
 }
 
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
     getTableData()
@@ -107,22 +115,22 @@ const pageChange = ({current, size}) => {
 //获取数据
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'loanUserName', name: '申请人', width: '140'},
-    {key: 'loanDesc', name: '借款事由', minWidth: '200'},
-    {key: 'loanMoney', name: '申请金额', width: '160', align: 'center'},
-    {key: 'useReturnDate', name: '使用日期-归还期', width: '160', align: 'center'},
-    {key: 'returnStatus', name: '还款状态', width: '140', align: 'center'},
-    {key: 'remarks', name: '备注', minWidth: '200', align: 'center'},
-    {key: 'approvalResultName', name: '审批结果', width: '160', align: 'center'},
-    {key: 'approvalStatusName', name: '审批状态', width: '140', align: 'center'},
-    {key: 'createName', name: '创建人', width: '140', align: 'center'},
-    {key: 'createTime', name: '创建时间', width: '160', align: 'center'},
-    {key: 'action', name: '操作', width: '90', align: 'center', fixed: 'right'},
+    { key: 'loanUserName', name: '申请人', width: '140' },
+    { key: 'loanDesc', name: '借款事由', minWidth: '200' },
+    { key: 'loanMoney', name: '申请金额', width: '160', align: 'center' },
+    { key: 'useReturnDate', name: '使用日期-归还期', width: '160', align: 'center' },
+    { key: 'returnStatus', name: '还款状态', width: '140', align: 'center' },
+    { key: 'remarks', name: '备注', minWidth: '200', align: 'center' },
+    { key: 'approvalResultName', name: '审批结果', width: '160', align: 'center' },
+    { key: 'approvalStatusName', name: '审批状态', width: '140', align: 'center' },
+    { key: 'createName', name: '创建人', width: '140', align: 'center' },
+    { key: 'createTime', name: '创建时间', width: '160', align: 'center' },
+    { key: 'action', name: '操作', width: '90', align: 'center', fixed: 'right' },
 ]
 const tableData = ref([])
 const getTableData = async () => {
     tableLoading.value = true
-    const {error, code, data} = await mainApi.page(searchForm.value)
+    const { error, code, data } = await mainApi.page(searchForm.value)
     //判断状态
     tableLoading.value = false
     if (!error && code === 200) {
@@ -137,7 +145,7 @@ const getTableData = async () => {
 //撤销
 const rowCancel = async (row) => {
     row.isCancelLoading = true
-    const {error, code, msg} = await mainApi.cancel({id: row.id})
+    const { error, code, msg } = await mainApi.cancel({ id: row.id })
     //判断状态
     row.isCancelLoading = false
     if (!error && code === 200) {
@@ -152,7 +160,7 @@ const rowCancel = async (row) => {
 //新增
 const addRowClick = () => {
     router.push({
-        name: 'expense-loanRequest-record'
+        name: 'expense-loanRequest-record',
     })
 }
 
@@ -168,14 +176,14 @@ const draftsCloseClick = () => {
 //草稿箱数据
 const draftNum = ref(0)
 const tableDraftsColumn = [
-    {key: 'title', name: '标题'},
-    {key: 'updateTime', name: '更新时间', width: '200'},
-    {key: 'action', name: '操作', width: '170', align: 'center'},
+    { key: 'title', name: '标题' },
+    { key: 'updateTime', name: '更新时间', width: '200' },
+    { key: 'action', name: '操作', width: '170', align: 'center' },
 ]
 const tableDraftsData = ref([])
 //获取草稿数量
 const getDraftNum = async () => {
-    const {error, code, data} = await mainApi.draft()
+    const { error, code, data } = await mainApi.draft()
     //判断状态
     if (!error && code === 200) {
         const res = getArrValue(data)
@@ -187,9 +195,9 @@ const getDraftNum = async () => {
     }
 }
 //获取借款申请人
-const loanuserList=ref([])
-const getLoanUserList=async()=>{
-    const {error, code, data} = await mainApi.getLoanUserNameList()
+const loanuserList = ref([])
+const getLoanUserList = async ()=>{
+    const { error, code, data } = await mainApi.getLoanUserNameList()
     if (!error && code === 200) {
         loanuserList.value = getArrValue(data)
 
@@ -199,18 +207,18 @@ const getLoanUserList=async()=>{
     }
 }
 //继续编辑
-const editDraftClick = ({id}) => {
+const editDraftClick = ({ id }) => {
     draftsModal.value = false
     router.push({
         name: 'expense-loanRequest-record',
-        query: {id: id}
+        query: { id: id },
     })
 }
 
 //删除草稿
-const delDraftClick = ({id}) => {
+const delDraftClick = ({ id }) => {
     delMessage(async () => {
-        const {error, code, msg} = await mainApi.remove({id})
+        const { error, code, msg } = await mainApi.remove({ id })
         //判断状态
         if (!error && code === 200) {
             window.$message?.success(msg)

+ 23 - 4
src/views/expense/loanRequest/record.vue

@@ -10,7 +10,9 @@
                 <el-scrollbar>
                     <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="top" size="large">
                         <el-form-item label="申请人:" prop="loanUserName">
-                            <el-input v-model="formModel.loanUserName" />
+                            <el-select v-model="formModel.loanUserName" clearable>
+                                <el-option v-for="item in userList" :label="item.name" :value="item.name" />
+                            </el-select>
                         </el-form-item>
                         <el-form-item label="借款事由:">
                             <el-input v-model="formModel.loanDesc" type="textarea" :autosize="{ minRows: 3, maxRows: 5 }" />
@@ -89,8 +91,10 @@
 import { onActivated, ref, watch } from 'vue'
 import { useRoute, useRouter } from 'vue-router'
 import mainApi from '~api/expense/loanRequest'
-import { getApprovesList, getNumberToChinese } from '~api/other'
-import { deepClone, formValidate, getObjValue } from 'js-fast-way'
+import { getApprovesList, getNumberToChinese, getuserList } from '~api/other'
+import { deepClone, formValidate, getArrValue, getObjValue } from 'js-fast-way'
+import { useAppStore } from '~src/store'
+const useAppState = useAppStore()
 
 //初始变量
 const router = useRouter()
@@ -107,8 +111,9 @@ onActivated(() => {
 
 //请求接口
 const getApi = () => {
-    //清空流程数据
+    //流程数据
     getApprovesListData()
+    getUserDict()
     //获取数据详情
     if (dataId.value > 0) {
         getDetailsData()
@@ -148,6 +153,7 @@ const getDetailsData = async () => {
     if (!error && code === 200) {
         const res = getObjValue(data)
         formModel.value = res
+        formModel.value.loanMoney = Number(res?.loanMoney)
         await getNumberToChineseApi(res?.loanMoney)
     } else {
         formModel.value = {}
@@ -215,6 +221,19 @@ const getApprovesListData = async ()=>{
     }
 
 }
+
+//获取所有员工
+const userList = ref([])
+const getUserDict = async ()=>{
+    const { error, code, data } = await getuserList({ tenantId:useAppState.tenantId })
+    if (!error && code === 200) {
+        userList.value = getArrValue(data)
+
+    } else {
+        userList.value = []
+
+    }
+}
 //处理表单数据
 const getFormData = (submitStatus = 1) => {
     const res = deepClone(formModel.value)

+ 64 - 56
src/views/expense/outsourcing/index.vue

@@ -3,60 +3,68 @@
         <template #header>
             <div class="w-72">
                 <el-select v-model="searchForm.projectType" block clearable placeholder="项目名称" size="large">
-                    <el-option v-for="item in projectType" :label="item.projectName" :value="item.projectId"/>
+                    <el-option v-for="item in projectType" :label="item.projectName" :value="item.projectId" />
                 </el-select>
             </div>
             <div class="ml-4">
-                <el-button type="primary" @click="searchClick" size="large">
-                    <HcIcon name="search-2"/>
+                <el-button type="primary" size="large" @click="searchClick">
+                    <HcIcon name="search-2" />
                     <span>搜索</span>
                 </el-button>
             </div>
             <div class="ml-2">
                 <el-button size="large" @click="resetClick">
-                    <HcIcon name="close-circle"/>
+                    <HcIcon name="close-circle" />
                     <span>重置</span>
                 </el-button>
             </div>
         </template>
         <template #extra>
-            <el-button size="large" type="warning" hc-btn @click="draftsClick">
-                <HcIcon name="draft"/>
-                <span>草稿箱{{draftNum > 0 ? `(${draftNum})` : ''}}</span>
+            <el-button v-auth-btn="['expense-outsourcing-draft-btn']" size="large" type="warning" hc-btn @click="draftsClick">
+                <HcIcon name="draft" />
+                <span>草稿箱{{ draftNum > 0 ? `(${draftNum})` : '' }}</span>
             </el-button>
-            <el-button size="large" type="primary" hc-btn @click="addRowClick">
-                <HcIcon name="add"/>
+            <el-button v-auth-btn="['expense-outsourcing-add-btn']" size="large" type="primary" hc-btn @click="addRowClick">
+                <HcIcon name="add" />
                 <span>新增支付记录</span>
             </el-button>
         </template>
 
         <HcTable :column="tableColumn" :datas="tableData" :loading="tableLoading">
-            <template #action="{row,index}">
+            <template #action="{ row, index }">
                 <el-popconfirm title="是否确认撤销?" hide-icon @confirm="rowCancel(row)">
                     <template #reference>
-                        <el-button size="small" type="primary"
-                                   :disabled="row.status !== 1"
-                                   :loading="row.isCancelLoading"
-                        >撤销</el-button>
+                        <el-button
+                            size="small" type="primary"
+                            :disabled="row.status !== 1"
+                            :loading="row.isCancelLoading"
+                        >
+                            撤销
+                        </el-button>
                     </template>
                 </el-popconfirm>
             </template>
         </HcTable>
 
         <template #action>
-            <HcPages :pages="searchForm" @change="pageChange"/>
+            <HcPages :pages="searchForm" @change="pageChange" />
         </template>
 
-        <!--草稿箱-->
-        <HcDialog isToBody isTable bgColor="#ffffff" widths="62rem" :footer="false" :show="draftsModal"
-                  :title="draftNum > 0 ? `草稿箱(${draftNum})` : '草稿箱'" @close="draftsCloseClick"
+        <!-- 草稿箱 -->
+        <HcDialog
+            is-to-body is-table bg-color="#ffffff" widths="62rem" :footer="false" :show="draftsModal"
+            :title="draftNum > 0 ? `草稿箱(${draftNum})` : '草稿箱'" @close="draftsCloseClick"
         >
             <el-alert title="3个月内未更新的草稿将被自动删除" type="warning" show-icon />
             <div style="position: relative;height: calc(100% - 44px);">
-                <HcTable :isIndex="false" :column="tableDraftsColumn" :datas="tableDraftsData">
-                    <template #action="{row,index}">
-                        <el-button size="small" type="primary" @click="editDraftClick(row)">继续编辑</el-button>
-                        <el-button size="small" type="danger" @click="delDraftClick(row)">删除</el-button>
+                <HcTable :is-index="false" :column="tableDraftsColumn" :datas="tableDraftsData">
+                    <template #action="{ row, index }">
+                        <el-button size="small" type="primary" @click="editDraftClick(row)">
+                            继续编辑
+                        </el-button>
+                        <el-button size="small" type="danger" @click="delDraftClick(row)">
+                            删除
+                        </el-button>
                     </template>
                 </HcTable>
             </div>
@@ -65,12 +73,12 @@
 </template>
 
 <script setup>
-import {onActivated, ref} from "vue";
-import {useRouter} from 'vue-router'
-import mainApi from "~api/expense/outsourcing"
-import {getProjectList} from "~api/other"
-import {getArrValue} from "js-fast-way";
-import {delMessage} from "~uti/tools";
+import { onActivated, ref } from 'vue'
+import { useRouter } from 'vue-router'
+import mainApi from '~api/expense/outsourcing'
+import { getProjectList } from '~api/other'
+import { getArrValue } from 'js-fast-way'
+import { delMessage } from '~uti/tools'
 
 
 const router = useRouter()
@@ -89,7 +97,7 @@ const getApi = () => {
 //项目类型
 const projectType = ref([])
 const getProjectData = async () => {
-    const {error, code, data} = await getProjectList()
+    const { error, code, data } = await getProjectList()
     //判断状态
     if (!error && code === 200) {
         projectType.value = getArrValue(data)
@@ -99,21 +107,21 @@ const getProjectData = async () => {
 }
 
 //搜索表单
-const searchForm = ref({projectId: null, current: 1, size: 20, total: 0})
+const searchForm = ref({ projectId: null, current: 1, size: 20, total: 0 })
 
 //搜索
 const searchClick = () => {
-    searchForm.value.current = 1;
+    searchForm.value.current = 1
     getTableData()
 }
 
 //重置搜索表单
 const resetClick = () => {
-    searchForm.value = {current: 1, size: 20, total: 0}
+    searchForm.value = { current: 1, size: 20, total: 0 }
 }
 
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
     getTableData()
@@ -122,21 +130,21 @@ const pageChange = ({current, size}) => {
 //获取数据
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'outsourcingTypeName', name: '外包类型', width: '140'},
-    {key: 'projectName', name: '关联项目', minWidth: '200'},
-    {key: 'payMoney', name: '支付金额', width: '160', align: 'center'},
-    {key: 'toUnit', name: '支付对方', width: '140', align: 'center'},
-    {key: 'approvalResultName', name: '审批结果', width: '140', align: 'center'},
-    {key: 'approvalStatusName', name: '审批状态', width: '140', align: 'center'},
-    {key: 'payDate', name: '申请支付时间', width: '180', align: 'center'},
-    {key: 'createName', name: '创建人', width: '140', align: 'center'},
-    {key: 'createTime', name: '创建时间', width: '160', align: 'center'},
-    {key: 'action', name: '操作', width: '90', align: 'center', fixed: 'right'},
+    { key: 'outsourcingTypeName', name: '外包类型', width: '140' },
+    { key: 'projectName', name: '关联项目', minWidth: '200' },
+    { key: 'payMoney', name: '支付金额', width: '160', align: 'center' },
+    { key: 'toUnit', name: '支付对方', width: '140', align: 'center' },
+    { key: 'approvalResultName', name: '审批结果', width: '140', align: 'center' },
+    { key: 'approvalStatusName', name: '审批状态', width: '140', align: 'center' },
+    { key: 'payDate', name: '申请支付时间', width: '180', align: 'center' },
+    { key: 'createName', name: '创建人', width: '140', align: 'center' },
+    { key: 'createTime', name: '创建时间', width: '160', align: 'center' },
+    { key: 'action', name: '操作', width: '90', align: 'center', fixed: 'right' },
 ]
 const tableData = ref([])
 const getTableData = async () => {
     tableLoading.value = true
-    const {error, code, data} = await mainApi.page(searchForm.value)
+    const { error, code, data } = await mainApi.page(searchForm.value)
     //判断状态
     tableLoading.value = false
     if (!error && code === 200) {
@@ -151,15 +159,15 @@ const getTableData = async () => {
 //新增预算
 const addRowClick = () => {
     router.push({
-        name: 'expense-outsourcing-record'
+        name: 'expense-outsourcing-record',
     })
 }
 
 //撤销
 const rowCancel = async (row) => {
     row.isCancelLoading = true
-    const {error, code, msg} = await mainApi.cancel({
-        id: row.id
+    const { error, code, msg } = await mainApi.cancel({
+        id: row.id,
     })
     //判断状态
     row.isCancelLoading = false
@@ -185,15 +193,15 @@ const draftsCloseClick = () => {
 //草稿箱数据
 const draftNum = ref(0)
 const tableDraftsColumn = [
-    {key: 'title', name: '标题'},
-    {key: 'updateTime', name: '更新时间', width: '200'},
-    {key: 'action', name: '操作', width: '170', align: 'center'},
+    { key: 'title', name: '标题' },
+    { key: 'updateTime', name: '更新时间', width: '200' },
+    { key: 'action', name: '操作', width: '170', align: 'center' },
 ]
 const tableDraftsData = ref([])
 
 //获取草稿数量
 const getDraftNum = async () => {
-    const {error, code, data} = await mainApi.draft()
+    const { error, code, data } = await mainApi.draft()
     //判断状态
     if (!error && code === 200) {
         const res = getArrValue(data)
@@ -206,19 +214,19 @@ const getDraftNum = async () => {
 }
 
 //继续编辑
-const editDraftClick = ({id}) => {
+const editDraftClick = ({ id }) => {
     draftsModal.value = false
     router.push({
         name: 'expense-outsourcing-record',
-        query: {id: id}
+        query: { id: id },
     })
 }
 
 //删除草稿
-const delDraftClick = ({id}) => {
+const delDraftClick = ({ id }) => {
     delMessage(async () => {
-        const {error, code, msg} = await mainApi.remove({
-            id: id
+        const { error, code, msg } = await mainApi.remove({
+            id: id,
         })
         //判断状态
         if (!error && code === 200) {

+ 2 - 1
src/views/expense/outsourcing/record.vue

@@ -165,6 +165,7 @@ const getDetailsData = async () => {
     //判断状态
     if (!error && code === 200) {
         formModel.value = getObjValue(data)
+        formModel.value .payMoney = Number(getObjValue(data))
     } else {
         formModel.value = {}
     }
@@ -222,7 +223,7 @@ const getApprovesListData = async ()=>{
     timeLineData1.value = [ { title: '审批人', section: '' }]
     const { error, code, data } = await getApprovesList()
     if (!error && code === 200) {
-        timeData.value = data['支付申请流程']
+        timeData.value = data['外包支付流程']
         console.log(timeData.value, timeData.value)
         let approveArr = timeData.value['审批人']
             //小于1000

+ 66 - 58
src/views/expense/paymentRequest/index.vue

@@ -3,65 +3,73 @@
         <template #header>
             <div class="w-36">
                 <el-select v-model="searchForm.payeeUserId" block clearable placeholder="收款人" size="large">
-                    <el-option v-for="item in payeeUserList" :label="item" :value="item"/>
+                    <el-option v-for="item in payeeUserList" :label="item" :value="item" />
                 </el-select>
             </div>
             <div class="w-72 ml-2">
                 <el-select v-model="searchForm.projectId" block clearable placeholder="项目名称" size="large">
-                    <el-option v-for="item in projectType" :label="item.projectName" :value="item.projectId"/>
+                    <el-option v-for="item in projectType" :label="item.projectName" :value="item.projectId" />
                 </el-select>
             </div>
             <div class="ml-4">
-                <el-button type="primary" @click="searchClick" size="large">
-                    <HcIcon name="search-2"/>
+                <el-button type="primary" size="large" @click="searchClick">
+                    <HcIcon name="search-2" />
                     <span>搜索</span>
                 </el-button>
             </div>
             <div class="ml-2">
                 <el-button size="large" @click="resetClick">
-                    <HcIcon name="close-circle"/>
+                    <HcIcon name="close-circle" />
                     <span>重置</span>
                 </el-button>
             </div>
         </template>
         <template #extra>
-            <el-button size="large" type="warning" hc-btn @click="draftsClick">
-                <HcIcon name="draft"/>
-                <span>草稿箱{{draftNum > 0 ? `(${draftNum})` : ''}}</span>
+            <el-button v-auth-btn="['expense-paymentRequest-draft-btn']" size="large" type="warning" hc-btn @click="draftsClick">
+                <HcIcon name="draft" />
+                <span>草稿箱{{ draftNum > 0 ? `(${draftNum})` : '' }}</span>
             </el-button>
-            <el-button size="large" type="primary" hc-btn @click="addRowClick">
-                <HcIcon name="add"/>
+            <el-button v-auth-btn="['expense-paymentRequest-add-btn']" size="large" type="primary" hc-btn @click="addRowClick">
+                <HcIcon name="add" />
                 <span>新增支付记录</span>
             </el-button>
         </template>
 
         <HcTable :column="tableColumn" :datas="tableData" :loading="tableLoading">
-            <template #action="{row,index}">
+            <template #action="{ row, index }">
                 <el-popconfirm title="是否确认撤销?" hide-icon @confirm="rowCancel(row)">
                     <template #reference>
-                        <el-button size="small" type="primary"
-                                   :disabled="row.status !== 1"
-                                   :loading="row.isCancelLoading"
-                        >撤销</el-button>
+                        <el-button
+                            size="small" type="primary"
+                            :disabled="row.status !== 1"
+                            :loading="row.isCancelLoading"
+                        >
+                            撤销
+                        </el-button>
                     </template>
                 </el-popconfirm>
             </template>
         </HcTable>
 
         <template #action>
-            <HcPages :pages="searchForm" @change="pageChange"/>
+            <HcPages :pages="searchForm" @change="pageChange" />
         </template>
 
-        <!--草稿箱-->
-        <HcDialog isToBody isTable bgColor="#ffffff" widths="62rem" :footer="false" :show="draftsModal"
-                  :title="draftNum > 0 ? `草稿箱(${draftNum})` : '草稿箱'" @close="draftsCloseClick"
+        <!-- 草稿箱 -->
+        <HcDialog
+            is-to-body is-table bg-color="#ffffff" widths="62rem" :footer="false" :show="draftsModal"
+            :title="draftNum > 0 ? `草稿箱(${draftNum})` : '草稿箱'" @close="draftsCloseClick"
         >
             <el-alert title="3个月内未更新的草稿将被自动删除" type="warning" show-icon />
             <div style="position: relative;height: calc(100% - 44px);">
-                <HcTable :isIndex="false" :column="tableDraftsColumn" :datas="tableDraftsData">
-                    <template #action="{row,index}">
-                        <el-button size="small" type="primary" @click="editDraftClick(row)">继续编辑</el-button>
-                        <el-button size="small" type="danger" @click="delDraftClick(row)">删除</el-button>
+                <HcTable :is-index="false" :column="tableDraftsColumn" :datas="tableDraftsData">
+                    <template #action="{ row, index }">
+                        <el-button size="small" type="primary" @click="editDraftClick(row)">
+                            继续编辑
+                        </el-button>
+                        <el-button size="small" type="danger" @click="delDraftClick(row)">
+                            删除
+                        </el-button>
                     </template>
                 </HcTable>
             </div>
@@ -70,12 +78,12 @@
 </template>
 
 <script setup>
-import {onActivated, ref} from "vue";
-import {useRouter} from 'vue-router'
-import mainApi from "~api/expense/paymentRequest";
-import {getProjectList} from "~api/other";
-import {getArrValue} from "js-fast-way";
-import {delMessage} from "~uti/tools";
+import { onActivated, ref } from 'vue'
+import { useRouter } from 'vue-router'
+import mainApi from '~api/expense/paymentRequest'
+import { getProjectList } from '~api/other'
+import { getArrValue } from 'js-fast-way'
+import { delMessage } from '~uti/tools'
 
 const router = useRouter()
 
@@ -93,7 +101,7 @@ const getApi = () => {
 //项目类型
 const projectType = ref([])
 const getProjectData = async () => {
-    const {error, code, data} = await getProjectList()
+    const { error, code, data } = await getProjectList()
     //判断状态
     if (!error && code === 200) {
         projectType.value = getArrValue(data)
@@ -102,9 +110,9 @@ const getProjectData = async () => {
     }
 }
 //获取支付申请人
-const payeeUserList=ref([])
-const getPayeeUserList=async()=>{
-    const {error, code, data} = await mainApi.getPayeeUserNameList()
+const payeeUserList = ref([])
+const getPayeeUserList = async ()=>{
+    const { error, code, data } = await mainApi.getPayeeUserNameList()
     if (!error && code === 200) {
         payeeUserList.value = getArrValue(data)
 
@@ -114,21 +122,21 @@ const getPayeeUserList=async()=>{
     }
 }
 //搜索表单
-const searchForm = ref({payeeUserId: null, projectId: null, current: 1, size: 20, total: 0})
+const searchForm = ref({ payeeUserId: null, projectId: null, current: 1, size: 20, total: 0 })
 
 //搜索
 const searchClick = () => {
-    searchForm.value.current = 1;
+    searchForm.value.current = 1
     getTableData()
 }
 
 //重置搜索表单
 const resetClick = () => {
-    searchForm.value = {current: 1, size: 20, total: 0}
+    searchForm.value = { current: 1, size: 20, total: 0 }
 }
 
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
     getTableData()
@@ -137,22 +145,22 @@ const pageChange = ({current, size}) => {
 //获取数据
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'afDate', name: '申请时间', minWidth: '160'},
-    {key: 'payeeUserName', name: '收款人', minWidth: '160'},
-    {key: 'afMoney', name: '收款金额', width: '160', align: 'center'},
-    {key: 'payeeUseInfo', name: '收款用途', width: '160', align: 'center'},
-    {key: 'approvalResultName', name: '审批结果', width: '160', align: 'center'},
-    {key: 'approvalStatusName', name: '审批状态', width: '140', align: 'center'},
-    {key: 'afDate', name: '申请时间', width: '160', align: 'center'},
-    {key: 'createName', name: '创建人', width: '140', align: 'center'},
-    {key: 'createTime', name: '创建时间', width: '160', align: 'center'},
-    {key: 'action', name: '操作', width: '90', align: 'center', fixed: 'right'},
+    { key: 'afDate', name: '申请时间', minWidth: '160' },
+    { key: 'payeeUserName', name: '收款人', minWidth: '160' },
+    { key: 'afMoney', name: '收款金额', width: '160', align: 'center' },
+    { key: 'payeeUseInfo', name: '收款用途', width: '160', align: 'center' },
+    { key: 'approvalResultName', name: '审批结果', width: '160', align: 'center' },
+    { key: 'approvalStatusName', name: '审批状态', width: '140', align: 'center' },
+    { key: 'afDate', name: '申请时间', width: '160', align: 'center' },
+    { key: 'createName', name: '创建人', width: '140', align: 'center' },
+    { key: 'createTime', name: '创建时间', width: '160', align: 'center' },
+    { key: 'action', name: '操作', width: '90', align: 'center', fixed: 'right' },
 ]
 const tableData = ref([])
 
 const getTableData = async () => {
     tableLoading.value = true
-    const {error, code, data} = await mainApi.page(searchForm.value)
+    const { error, code, data } = await mainApi.page(searchForm.value)
     //判断状态
     tableLoading.value = false
     if (!error && code === 200) {
@@ -167,7 +175,7 @@ const getTableData = async () => {
 //撤销
 const rowCancel = async (row) => {
     row.isCancelLoading = true
-    const {error, code, msg} = await mainApi.cancel({id: row.id})
+    const { error, code, msg } = await mainApi.cancel({ id: row.id })
     //判断状态
     row.isCancelLoading = false
     if (!error && code === 200) {
@@ -182,7 +190,7 @@ const rowCancel = async (row) => {
 //新增
 const addRowClick = () => {
     router.push({
-        name: 'expense-paymentRequest-record'
+        name: 'expense-paymentRequest-record',
     })
 }
 
@@ -198,14 +206,14 @@ const draftsCloseClick = () => {
 //草稿箱数据
 const draftNum = ref(0)
 const tableDraftsColumn = [
-    {key: 'title', name: '标题'},
-    {key: 'updateTime', name: '更新时间', width: '200'},
-    {key: 'action', name: '操作', width: '170', align: 'center'},
+    { key: 'title', name: '标题' },
+    { key: 'updateTime', name: '更新时间', width: '200' },
+    { key: 'action', name: '操作', width: '170', align: 'center' },
 ]
 const tableDraftsData = ref([])
 //获取草稿数量
 const getDraftNum = async () => {
-    const {error, code, data} = await mainApi.draft()
+    const { error, code, data } = await mainApi.draft()
     //判断状态
     if (!error && code === 200) {
         const res = getArrValue(data)
@@ -218,18 +226,18 @@ const getDraftNum = async () => {
 }
 
 //继续编辑
-const editDraftClick = ({id}) => {
+const editDraftClick = ({ id }) => {
     draftsModal.value = false
     router.push({
         name: 'expense-paymentRequest-record',
-        query: {id: id}
+        query: { id: id },
     })
 }
 
 //删除草稿
-const delDraftClick = ({id}) => {
+const delDraftClick = ({ id }) => {
     delMessage(async () => {
-        const {error, code, msg} = await mainApi.remove({id})
+        const { error, code, msg } = await mainApi.remove({ id })
         //判断状态
         if (!error && code === 200) {
             window.$message?.success(msg)

+ 1 - 0
src/views/expense/paymentRequest/record.vue

@@ -248,6 +248,7 @@ const getDetailsData = async () => {
     //判断状态
     if (!error && code === 200) {
         formModel.value = getObjValue(data)
+        formModel.value.afMoney = Number(getObjValue(data)?.afMoney)
     } else {
         formModel.value = {}
     }

+ 78 - 56
src/views/expense/purchaseRequest/index.vue

@@ -3,66 +3,77 @@
         <template #header>
             <div class="w-36">
                 <el-select v-model="searchForm.purType" block clearable placeholder="采购类型" size="large">
-                    <el-option v-for="item in purTypeData" :label="item.dictName" :value="item.dictValue"/>
+                    <el-option v-for="item in purTypeData" :label="item.dictName" :value="item.dictName" />
                 </el-select>
             </div>
             <div class="w-72 ml-2">
-                <el-select v-model="searchForm.useOrgName" block clearable placeholder="使用单位" size="large">
+                <!-- <el-select v-model="searchForm.useOrgName" block clearable placeholder="使用单位" size="large">
                     <el-option label="暂无接口1" value="1"/>
                     <el-option label="暂无接口2" value="2"/>
+                </el-select> -->
+                <el-select v-model="searchForm.useOrgName" block clearable placeholder="使用单位" size="large">
+                    <el-option v-for="item in useOrgNameData" :label="item" :value="item" />
                 </el-select>
             </div>
             <div class="ml-4">
-                <el-button type="primary" @click="searchClick" size="large">
-                    <HcIcon name="search-2"/>
+                <el-button type="primary" size="large" @click="searchClick">
+                    <HcIcon name="search-2" />
                     <span>搜索</span>
                 </el-button>
             </div>
             <div class="ml-2">
                 <el-button size="large" @click="resetClick">
-                    <HcIcon name="close-circle"/>
+                    <HcIcon name="close-circle" />
                     <span>重置</span>
                 </el-button>
             </div>
         </template>
         <template #extra>
-            <el-button size="large" type="warning" hc-btn @click="draftsClick">
-                <HcIcon name="draft"/>
-                <span>草稿箱{{draftNum > 0 ? `(${draftNum})` : ''}}</span>
+            <el-button v-auth-btn="['expense-purchaseRequest-draft-btn']" size="large" type="warning" hc-btn @click="draftsClick">
+                <HcIcon name="draft" />
+                <span>草稿箱{{ draftNum > 0 ? `(${draftNum})` : '' }}</span>
             </el-button>
-            <el-button size="large" type="primary" hc-btn @click="addRowClick">
-                <HcIcon name="add"/>
+            <el-button v-auth-btn="['expense-purchaseRequest-add-btn']" size="large" type="primary" hc-btn @click="addRowClick">
+                <HcIcon name="add" />
                 <span>新增采购申请</span>
             </el-button>
         </template>
 
         <HcTable :column="tableColumn" :datas="tableData" :loading="tableLoading">
-            <template #action="{row,index}">
+            <template #action="{ row, index }">
                 <el-popconfirm title="是否确认撤销?" hide-icon @confirm="rowCancel(row)">
                     <template #reference>
-                        <el-button size="small" type="primary"
-                                   :disabled="row.status !== 1"
-                                   :loading="row.isCancelLoading"
-                        >撤销</el-button>
+                        <el-button
+                            size="small" type="primary"
+                            :disabled="row.status !== 1"
+                            :loading="row.isCancelLoading"
+                        >
+                            撤销
+                        </el-button>
                     </template>
                 </el-popconfirm>
             </template>
         </HcTable>
 
         <template #action>
-            <HcPages :pages="searchForm" @change="pageChange"/>
+            <HcPages :pages="searchForm" @change="pageChange" />
         </template>
 
-        <!--草稿箱-->
-        <HcDialog isToBody isTable bgColor="#ffffff" widths="62rem" :footer="false" :show="draftsModal"
-                  :title="draftNum > 0 ? `草稿箱(${draftNum})` : '草稿箱'" @close="draftsCloseClick"
+        <!-- 草稿箱 -->
+        <HcDialog
+            is-to-body is-table bg-color="#ffffff" widths="62rem" :footer="false" :show="draftsModal"
+            :title="draftNum > 0 ? `草稿箱(${draftNum})` : '草稿箱'" @close="draftsCloseClick"
         >
             <el-alert title="3个月内未更新的草稿将被自动删除" type="warning" show-icon />
             <div style="position: relative;height: calc(100% - 44px);">
-                <HcTable :isIndex="false" :column="tableDraftsColumn" :datas="tableDraftsData">
-                    <template #action="{row,index}">
-                        <el-button size="small" type="primary" @click="editDraftClick(row)">继续编辑</el-button>
-                        <el-button size="small" type="danger" @click="delDraftClick(row)">删除</el-button>
+                <HcTable :is-index="false" :column="tableDraftsColumn" :datas="tableDraftsData">
+                    <template #action="{ row, index }">
+                        <el-button size="small" type="primary" @click="editDraftClick(row)">
+                            继续编辑
+                        </el-button>
+                        <el-button size="small" type="danger" @click="delDraftClick(row)">
+                            删除
+                        </el-button>
                     </template>
                 </HcTable>
             </div>
@@ -71,12 +82,12 @@
 </template>
 
 <script setup>
-import {onActivated, ref} from "vue";
-import {useRouter} from 'vue-router'
-import {getDictInfo} from "~api/other";
-import mainApi from "~api/expense/purchaseRequest";
-import {getArrValue} from "js-fast-way";
-import {delMessage} from "~uti/tools";
+import { onActivated, ref } from 'vue'
+import { useRouter } from 'vue-router'
+import { getDictInfo } from '~api/other'
+import mainApi from '~api/expense/purchaseRequest'
+import { getArrValue } from 'js-fast-way'
+import { delMessage } from '~uti/tools'
 
 const router = useRouter()
 
@@ -86,6 +97,7 @@ onActivated(() => {
 
 const getApi = () => {
     getPurType()
+    getUseOrgNameData()
     getTableData()
     getDraftNum()
 }
@@ -93,7 +105,7 @@ const getApi = () => {
 //采购类型字典
 const purTypeData = ref([])
 const getPurType = async () => {
-    const {error, code, data} = await getDictInfo('purchase_type')
+    const { error, code, data } = await getDictInfo('purchase_type')
     //判断状态
     if (!error && code === 200) {
         purTypeData.value = getArrValue(data)
@@ -101,23 +113,33 @@ const getPurType = async () => {
         purTypeData.value = []
     }
 }
-
+//采购使用单位
+const useOrgNameData = ref([])
+const getUseOrgNameData = async () => {
+    const { error, code, data } = await mainApi.getUseOrgNameList()
+    //判断状态
+    if (!error && code === 200) {
+        useOrgNameData.value = getArrValue(data)
+    } else {
+        useOrgNameData.value = []
+    }
+}
 //搜索表单
-const searchForm = ref({purType: null, useOrgName: null, current: 1, size: 20, total: 0})
+const searchForm = ref({ purType: null, useOrgName: null, current: 1, size: 20, total: 0 })
 
 //搜索
 const searchClick = () => {
-    searchForm.value.current = 1;
+    searchForm.value.current = 1
     getTableData()
 }
 
 //重置搜索表单
 const resetClick = () => {
-    searchForm.value = {current: 1, size: 20, total: 0}
+    searchForm.value = { current: 1, size: 20, total: 0 }
 }
 
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
     getTableData()
@@ -126,21 +148,21 @@ const pageChange = ({current, size}) => {
 //获取数据
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'purDesc', name: '申请事由', minWidth: '200'},
-    {key: 'purTypeName', name: '采购类型', width: '200', align: 'center'},
-    {key: 'useOrgName', name: '使用单位', minWidth: '200'},
-    {key: 'expectedDeliveryDate', name: '期望交付日期', width: '160', align: 'center'},
-    {key: 'purPrice', name: '总采购资金', width: '160', align: 'center'},
-    {key: 'approvalResultName', name: '审批结果', width: '140', align: 'center'},
-    {key: 'approvalStatusName', name: '审批状态', width: '160', align: 'center'},
-    {key: 'createName', name: '创建人', width: '140', align: 'center'},
-    {key: 'createTime', name: '创建时间', width: '160', align: 'center'},
-    {key: 'action', name: '操作', width: '90', align: 'center', fixed: 'right'},
+    { key: 'purDesc', name: '申请事由', minWidth: '200' },
+    { key: 'purTypeName', name: '采购类型', width: '200', align: 'center' },
+    { key: 'useOrgName', name: '使用单位', minWidth: '200' },
+    { key: 'expectedDeliveryDate', name: '期望交付日期', width: '160', align: 'center' },
+    { key: 'purPrice', name: '总采购资金', width: '160', align: 'center' },
+    { key: 'approvalResultName', name: '审批结果', width: '140', align: 'center' },
+    { key: 'approvalStatusName', name: '审批状态', width: '160', align: 'center' },
+    { key: 'createName', name: '创建人', width: '140', align: 'center' },
+    { key: 'createTime', name: '创建时间', width: '160', align: 'center' },
+    { key: 'action', name: '操作', width: '90', align: 'center', fixed: 'right' },
 ]
 const tableData = ref([])
 const getTableData = async () => {
     tableLoading.value = true
-    const {error, code, data} = await mainApi.page(searchForm.value)
+    const { error, code, data } = await mainApi.page(searchForm.value)
     //判断状态
     tableLoading.value = false
     if (!error && code === 200) {
@@ -155,7 +177,7 @@ const getTableData = async () => {
 //撤销
 const rowCancel = async (row) => {
     row.isCancelLoading = true
-    const {error, code, msg} = await mainApi.cancel({id: row.id})
+    const { error, code, msg } = await mainApi.cancel({ id: row.id })
     //判断状态
     row.isCancelLoading = false
     if (!error && code === 200) {
@@ -170,7 +192,7 @@ const rowCancel = async (row) => {
 //新增
 const addRowClick = () => {
     router.push({
-        name: 'expense-purchaseRequest-record'
+        name: 'expense-purchaseRequest-record',
     })
 }
 
@@ -186,14 +208,14 @@ const draftsCloseClick = () => {
 //草稿箱数据
 const draftNum = ref(0)
 const tableDraftsColumn = [
-    {key: 'title', name: '标题'},
-    {key: 'updateTime', name: '更新时间', width: '200'},
-    {key: 'action', name: '操作', width: '170', align: 'center'},
+    { key: 'title', name: '标题' },
+    { key: 'updateTime', name: '更新时间', width: '200' },
+    { key: 'action', name: '操作', width: '170', align: 'center' },
 ]
 const tableDraftsData = ref([])
 //获取草稿数量
 const getDraftNum = async () => {
-    const {error, code, data} = await mainApi.draft()
+    const { error, code, data } = await mainApi.draft()
     //判断状态
     if (!error && code === 200) {
         const res = getArrValue(data)
@@ -206,18 +228,18 @@ const getDraftNum = async () => {
 }
 
 //继续编辑
-const editDraftClick = ({emdraftIds}) => {
+const editDraftClick = ({ emdraftIds }) => {
     draftsModal.value = false
     router.push({
         name: 'expense-purchaseRequest-record',
-        query: {id: emdraftIds}
+        query: { id: emdraftIds },
     })
 }
 
 //删除草稿
-const delDraftClick = ({groupId}) => {
+const delDraftClick = ({ groupId }) => {
     delMessage(async () => {
-        const {error, code, msg} = await mainApi.remove({groupId})
+        const { error, code, msg } = await mainApi.remove({ groupId })
         //判断状态
         if (!error && code === 200) {
             window.$message?.success(msg)

+ 3 - 1
src/views/expense/purchaseRequest/record.vue

@@ -45,7 +45,7 @@
                                         <el-input v-model="item.purSpecification" />
                                     </el-form-item>
                                     <el-form-item label="数量:" prop="purCount">
-                                        <el-input v-model="item.purCount" />
+                                        <el-input v-model="item.purCount" oninput="value=value.replace(/[^\d]/g,'')" />
                                     </el-form-item>
                                     <el-form-item label="单位:" prop="purOrgName">
                                         <el-input v-model="item.purOrgName" />
@@ -318,6 +318,8 @@ const getDetailsData = async () => {
             let newDetails1 = {}
             Object.keys(detailsObj1).forEach(key => {
                 newDetails1[key] = item[key]
+                newDetails1['purPrice'] = Number(item['purPrice`'])
+                //purPrice
             })
             newDetails1.id = item?.id
             newDetailsArr.push(newDetails1)

+ 66 - 57
src/views/expense/vehicleRequest/index.vue

@@ -2,61 +2,69 @@
     <HcCard>
         <template #header>
             <div class="w-72">
-                <el-select v-model="searchForm.projectType" block clearable placeholder="申请部门" size="large">
-                    <el-option v-for="item in carDeptList" :label="item.deptName" :value="item.deptId"/>
+                <el-select v-model="searchForm.ucOrgId" block clearable placeholder="申请部门" size="large">
+                    <el-option v-for="item in carDeptList" :label="item.deptName" :value="item.deptId" />
                 </el-select>
             </div>
             <div class="ml-4">
-                <el-button type="primary" @click="searchClick" size="large">
-                    <HcIcon name="search-2"/>
+                <el-button type="primary" size="large" @click="searchClick">
+                    <HcIcon name="search-2" />
                     <span>搜索</span>
                 </el-button>
             </div>
             <div class="ml-2">
                 <el-button size="large" @click="resetClick">
-                    <HcIcon name="close-circle"/>
+                    <HcIcon name="close-circle" />
                     <span>重置</span>
                 </el-button>
             </div>
         </template>
         <template #extra>
-            <el-button size="large" type="warning" hc-btn @click="draftsClick">
-                <HcIcon name="draft"/>
-                <span>草稿箱{{draftNum > 0 ? `(${draftNum})` : ''}}</span>
+            <el-button v-auth-btn="['expense-vehicleRequest-draft-btn']" size="large" type="warning" hc-btn @click="draftsClick">
+                <HcIcon name="draft" />
+                <span>草稿箱{{ draftNum > 0 ? `(${draftNum})` : '' }}</span>
             </el-button>
-            <el-button size="large" type="primary" hc-btn @click="addRowClick">
-                <HcIcon name="add"/>
+            <el-button v-auth-btn="['expense-vehicleRequest-add-btn']" size="large" type="primary" hc-btn @click="addRowClick">
+                <HcIcon name="add" />
                 <span>新增用车申请</span>
             </el-button>
         </template>
 
         <HcTable :column="tableColumn" :datas="tableData" :loading="tableLoading">
-            <template #action="{row,index}">
+            <template #action="{ row, index }">
                 <el-popconfirm title="是否确认撤销?" hide-icon @confirm="rowCancel(row)">
                     <template #reference>
-                        <el-button size="small" type="primary"
-                                   :disabled="row.status !== 1"
-                                   :loading="row.isCancelLoading"
-                        >撤销</el-button>
+                        <el-button
+                            size="small" type="primary"
+                            :disabled="row.status !== 1"
+                            :loading="row.isCancelLoading"
+                        >
+                            撤销
+                        </el-button>
                     </template>
                 </el-popconfirm>
             </template>
         </HcTable>
 
         <template #action>
-            <HcPages :pages="searchForm" @change="pageChange"/>
+            <HcPages :pages="searchForm" @change="pageChange" />
         </template>
 
-        <!--草稿箱-->
-        <HcDialog isToBody isTable bgColor="#ffffff" widths="62rem" :footer="false" :show="draftsModal"
-                  :title="draftNum > 0 ? `草稿箱(${draftNum})` : '草稿箱'" @close="draftsCloseClick"
+        <!-- 草稿箱 -->
+        <HcDialog
+            is-to-body is-table bg-color="#ffffff" widths="62rem" :footer="false" :show="draftsModal"
+            :title="draftNum > 0 ? `草稿箱(${draftNum})` : '草稿箱'" @close="draftsCloseClick"
         >
             <el-alert title="3个月内未更新的草稿将被自动删除" type="warning" show-icon />
             <div style="position: relative;height: calc(100% - 44px);">
-                <HcTable :isIndex="false" :column="tableDraftsColumn" :datas="tableDraftsData">
-                    <template #action="{row,index}">
-                        <el-button size="small" type="primary" @click="editDraftClick(row)">继续编辑</el-button>
-                        <el-button size="small" type="danger" @click="delDraftClick(row)">删除</el-button>
+                <HcTable :is-index="false" :column="tableDraftsColumn" :datas="tableDraftsData">
+                    <template #action="{ row, index }">
+                        <el-button size="small" type="primary" @click="editDraftClick(row)">
+                            继续编辑
+                        </el-button>
+                        <el-button size="small" type="danger" @click="delDraftClick(row)">
+                            删除
+                        </el-button>
                     </template>
                 </HcTable>
             </div>
@@ -65,11 +73,11 @@
 </template>
 
 <script setup>
-import {onActivated, ref} from "vue";
-import {useRouter} from 'vue-router'
-import mainApi from "~api/expense/vehicleRequest";
-import {getArrValue} from "js-fast-way";
-import {delMessage} from "~uti/tools";
+import { onActivated, ref } from 'vue'
+import { useRouter } from 'vue-router'
+import mainApi from '~api/expense/vehicleRequest'
+import { getArrValue } from 'js-fast-way'
+import { delMessage } from '~uti/tools'
 
 const router = useRouter()
 
@@ -78,27 +86,28 @@ onActivated(() => {
 })
 
 const getApi = () => {
+    getUseCarDeptList()
     getTableData()
     getDraftNum()
 }
 
 
 //搜索表单
-const searchForm = ref({projectType: null, current: 1, size: 20, total: 0})
+const searchForm = ref({ ucOrgId: null, current: 1, size: 20, total: 0 })
 
 //搜索
 const searchClick = () => {
-    searchForm.value.current = 1;
+    searchForm.value.current = 1
     getTableData()
 }
 
 //重置搜索表单
 const resetClick = () => {
-    searchForm.value = {current: 1, size: 20, total: 0}
+    searchForm.value = { current: 1, size: 20, total: 0 }
 }
 
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
     getTableData()
@@ -107,22 +116,22 @@ const pageChange = ({current, size}) => {
 //获取数据
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'ucOrgName', name: '申请部门', minWidth: '200'},
-    {key: 'ucDesc', name: '用车事由', minWidth: '200'},
-    {key: 'startLocations', name: '始发地点', minWidth: '200'},
-    {key: 'endLocations', name: '返回地点', minWidth: '200'},
-    {key: 'useReturnDate', name: '用车起止日期', width: '220', align: 'center'},
-    {key: 'carType', name: '车辆类型', width: '220', align: 'center'},
-    {key: 'approvalResultName', name: '审批结果', width: '140', align: 'center'},
-    {key: 'approvalStatusName', name: '审批状态', width: '140', align: 'center'},
-    {key: 'createName', name: '创建人', width: '140', align: 'center'},
-    {key: 'createTime', name: '创建时间', width: '160', align: 'center'},
-    {key: 'action', name: '操作', width: '90', align: 'center', fixed: 'right'},
+    { key: 'ucOrgName', name: '申请部门', minWidth: '200' },
+    { key: 'ucDesc', name: '用车事由', minWidth: '200' },
+    { key: 'startLocations', name: '始发地点', minWidth: '200' },
+    { key: 'endLocations', name: '返回地点', minWidth: '200' },
+    { key: 'useReturnDate', name: '用车起止日期', width: '220', align: 'center' },
+    { key: 'carType', name: '车辆类型', width: '220', align: 'center' },
+    { key: 'approvalResultName', name: '审批结果', width: '140', align: 'center' },
+    { key: 'approvalStatusName', name: '审批状态', width: '140', align: 'center' },
+    { key: 'createName', name: '创建人', width: '140', align: 'center' },
+    { key: 'createTime', name: '创建时间', width: '160', align: 'center' },
+    { key: 'action', name: '操作', width: '90', align: 'center', fixed: 'right' },
 ]
 const tableData = ref([])
 const getTableData = async () => {
     tableLoading.value = true
-    const {error, code, data} = await mainApi.page(searchForm.value)
+    const { error, code, data } = await mainApi.page(searchForm.value)
     //判断状态
     tableLoading.value = false
     if (!error && code === 200) {
@@ -137,7 +146,7 @@ const getTableData = async () => {
 //撤销
 const rowCancel = async (row) => {
     row.isCancelLoading = true
-    const {error, code, msg} = await mainApi.cancel({id: row.id})
+    const { error, code, msg } = await mainApi.cancel({ id: row.id })
     //判断状态
     row.isCancelLoading = false
     if (!error && code === 200) {
@@ -152,7 +161,7 @@ const rowCancel = async (row) => {
 //新增
 const addRowClick = () => {
     router.push({
-        name: 'expense-vehicleRequest-record'
+        name: 'expense-vehicleRequest-record',
     })
 }
 
@@ -168,14 +177,14 @@ const draftsCloseClick = () => {
 //草稿箱数据
 const draftNum = ref(0)
 const tableDraftsColumn = [
-    {key: 'title', name: '标题'},
-    {key: 'updateTime', name: '更新时间', width: '200'},
-    {key: 'action', name: '操作', width: '170', align: 'center'},
+    { key: 'title', name: '标题' },
+    { key: 'updateTime', name: '更新时间', width: '200' },
+    { key: 'action', name: '操作', width: '170', align: 'center' },
 ]
 const tableDraftsData = ref([])
 //获取草稿数量
 const getDraftNum = async () => {
-    const {error, code, data} = await mainApi.draft()
+    const { error, code, data } = await mainApi.draft()
     //判断状态
     if (!error && code === 200) {
         const res = getArrValue(data)
@@ -188,16 +197,16 @@ const getDraftNum = async () => {
 }
 
 //继续编辑
-const editDraftClick = ({emdraftIds}) => {
+const editDraftClick = ({ emdraftIds }) => {
     draftsModal.value = false
     router.push({
         name: 'expense-vehicleRequest-record',
-        query: {id: emdraftIds}
+        query: { id: emdraftIds },
     })
 }
-const carDeptList=ref([])
-const getUseCarDeptList=async()=>{
-    const {error, code, data} = await getUseCarDeptList()
+const carDeptList = ref([])
+const getUseCarDeptList = async ()=>{
+    const { error, code, data } = await getUseCarDeptList()
     if (!error && code === 200) {
         carDeptList.value = getArrValue(data)
 
@@ -207,9 +216,9 @@ const getUseCarDeptList=async()=>{
     }
 }
 //删除草稿
-const delDraftClick = ({groupId}) => {
+const delDraftClick = ({ groupId }) => {
     delMessage(async () => {
-        const {error, code, msg} = await mainApi.remove({groupId})
+        const { error, code, msg } = await mainApi.remove({ groupId })
         //判断状态
         if (!error && code === 200) {
             window.$message?.success(msg)

+ 21 - 11
src/views/home/components/TaskTable.vue

@@ -12,13 +12,19 @@
                 </el-select>
             </div>
             <div class="w-36">
-                <el-date-picker v-model="searchForm.startTime" class="block" type="month" value-format="YYYY-MM" placeholder="开始日期" clearable size="large" />
+                <el-date-picker
+                    v-model="searchForm.startTime" class="block" type="month" value-format="YYYY-MM"
+                    placeholder="开始日期" clearable size="large"
+                />
             </div>
             <div class="mx-2">
                 ~
             </div>
             <div class="w-36">
-                <el-date-picker v-model="searchForm.endTime" class="block" type="month" value-format="YYYY-MM" placeholder="结束日期" clearable size="large" />
+                <el-date-picker
+                    v-model="searchForm.endTime" class="block" type="month" value-format="YYYY-MM"
+                    placeholder="结束日期" clearable size="large"
+                />
             </div>
             <div class="ml-4">
                 <el-button size="large" type="primary" @click="searchClick">
@@ -42,7 +48,10 @@
                 <span v-if="row.status === 1" class="text-orange">待审批</span>
                 <span v-if="row.status === 2" class="text-green">已审批</span>
                 <template v-if="row.status === 3">
-                    <el-popover placement="top-start" title="驳回原因" :width="200" :hide-after="0" :content="row?.rejectDesc">
+                    <el-popover
+                        placement="top-start" title="驳回原因" :width="200" :hide-after="0"
+                        :content="row?.rejectDesc"
+                    >
                         <template #reference>
                             <span class="text-red">已驳回</span>
                         </template>
@@ -83,7 +92,7 @@ const reportTypes = ref([
 ])
 
 
-onActivated(()=>{
+onActivated(() => {
     getTableData()
     getReporting()
 })
@@ -97,9 +106,9 @@ watch(() => [
 //选择上报类型
 const reportings = ref([])
 //获取上报类型
-const getReporting = async ()=>{
+const getReporting = async () => {
     const { error, code, data, msg } = await getDictInfo(
-     'report_type',
+        'report_type',
     )
     if (!error && code === 200) {
         reportings.value = getArrValue(data)
@@ -110,7 +119,7 @@ const getReporting = async ()=>{
 }
 //搜索表单
 const searchForm = ref({
-    selectStatus: null, startTime: null, endTime: null, reporting: null, selectType:parseInt(isTableKey.value),
+    selectStatus: null, startTime: null, endTime: null, reporting: null, selectType: parseInt(isTableKey.value),
     current: 1, size: 20, total: 0,
 })
 
@@ -124,7 +133,7 @@ const searchClick = () => {
 //重置
 const resetClick = () => {
     searchForm.value = {
-        selectStatus: null, startTime: null, endTime: null, selectType:parseInt(isTableKey.value),
+        selectStatus: null, startTime: null, endTime: null, selectType: parseInt(isTableKey.value),
         current: 1, size: 20, total: 0,
     }
     getTableData()
@@ -141,12 +150,13 @@ const pageChange = ({ current, size }) => {
 const tableLoading = ref(false)
 const tableColumn = ref([
     { key: 'taskName', name: '任务名称' },
-    { key: 'reportDate', name: '上报日期', width: '160', align: 'center' },
+    { key: 'reportDate', name: '上报日期', width: '170', align: 'center' },
     { key: 'auditDate', name: '审核日期', width: '160', align: 'center' },
     { key: 'reportTypeName', name: '上报类型', width: '120', align: 'center' },
     { key: 'status', name: '审核状态', width: '100', align: 'center' },
     { key: 'reportUserName', name: '上报人', width: '120', align: 'center' },
-    { key: 'auditUserNames', name: '审核人', width: '120', align: 'center' },
+    { key: 'auditUserNames', name: '待审核人', width: '120', align: 'center' },
+    { key: 'auditUserCompleteNames', name: '完成审核人', width: '120', align: 'center' },
 ])
 const tableData = ref([])
 const getTableData = async () => {
@@ -171,7 +181,7 @@ const rowNameClick = (row) => {
         name: 'home-task-details', query: {
             id: row.id,
             type: row?.reportTypeName,
-            tabsKey:isTableKey.value,
+            tabsKey: isTableKey.value,
 
         },
     })

+ 93 - 94
src/views/home/task/components/cost-budget.vue

@@ -1,13 +1,12 @@
 <!--  -->
 <template>
     <div>
-        <HcTable :column="basetableColumn" :datas="basetableData" :isIndex="false" >
-        </HcTable>
-        <HcCard actionUi="text-center" class="mt-4">
+        <HcTable :column="basetableColumn" :datas="basetableData" :is-index="false" />
+        <HcCard action-ui="text-center" class="mt-4">
             <template #extra>
-                <HcNewSwitch :datas="tabTab" :keys="tabKey" @change="tabChange" :round="false" />
+                <HcNewSwitch :datas="tabTab" :keys="tabKey" :round="false" @change="tabChange" />
             </template>
-            <HcTable :isIndex="false" :column="tableColumn" :datas="tableData">
+            <HcTable :is-index="false" :column="tableColumn" :datas="tableData">
                 <template #deptId="{ row, index }">
                     <el-select v-model="row.deptId" block placeholder="请选择" disabled>
                         <el-option v-for="item in departMent" :label="item.deptName" :value="item.id" />
@@ -28,91 +27,90 @@
                         <el-option v-for="item in budgetTypeList" :label="item.dictName" :value="item.dictValue" />
                     </el-select>
                 </template>
-                <template #taskDetail="{ row, index }" >
+                <template #taskDetail="{ row, index }">
                     <el-select v-model="row.taskDetail" :getdata="budgetTypeChange(row?.budgetType, index)" disabled>
                         <el-option v-for="item in taskDetailList[index]" :label="item.dictName" :value="item.dictValue" />
                     </el-select>
                 </template>
-                <template #budgetDays="{ row, index }" >
-                    <el-input v-model="row.budgetDays" disabled/>
+                <template #budgetDays="{ row, index }">
+                    <el-input v-model="row.budgetDays" disabled />
                 </template>
-                <template #postType="{ row, index }" >
+                <template #postType="{ row, index }">
                     <el-select v-model="row.postType" disabled>
                         <el-option v-for="item in postTypeList" :label="item.dictName" :value="item.id" />
                     </el-select>
                 </template>
 
-                <template #staffCount="{ row, index }" >
-                    <el-input v-model="row.staffCount"  disabled/>
+                <template #staffCount="{ row, index }">
+                    <el-input v-model="row.staffCount" disabled />
                 </template>
-                <template #budgetStaffCost="{ row, index }" >
+                <template #budgetStaffCost="{ row, index }">
                     <el-input v-model="row.budgetStaffCost" disabled />
                 </template>
                 <template #budgetTravelExpense="{ row, index }">
-                    <el-input v-model="row.budgetTravelExpense" disabled/>
+                    <el-input v-model="row.budgetTravelExpense" disabled />
                 </template>
                 <template #outsourceUnitPrice="{ row, index }">
-                    <el-input v-model="row.outsourceUnitPrice" disabled/>
+                    <el-input v-model="row.outsourceUnitPrice" disabled />
                 </template>
                 <template #outsourcePeopleCount="{ row, index }">
-                    <el-input v-model="row.outsourcePeopleCount" disabled/>
+                    <el-input v-model="row.outsourcePeopleCount" disabled />
                 </template>
                 <template #outsourceCountMoney="{ row, index }">
                     <el-input v-model="row.outsourceCountMoney" disabled />
                 </template>
                 <template #otherBudgetMoney="{ row, index }">
-                    <el-input v-model="row.otherBudgetMoney" disabled/>
+                    <el-input v-model="row.otherBudgetMoney" disabled />
                 </template>
                 <template #budgetCountMoney="{ row, index }">
-                    <el-input v-model="row.budgetCountMoney" disabled/>
+                    <el-input v-model="row.budgetCountMoney" disabled />
                 </template>
                 <template #budgetRemark="{ row, index }">
-                    <el-input v-model="row.budgetRemark" disabled/>
+                    <el-input v-model="row.budgetRemark" disabled />
                 </template>
                 <template #key15="{ row, index }">
                     <el-input v-model="row.key15" disabled />
                 </template>
-       
             </HcTable>
         </HcCard>
     </div>
 </template>
 
 <script setup>
-import { ref, watch, onActivated } from 'vue'
-import { getProjectList,getdepartmentList } from "~api/other";
-import { getArrValue } from "js-fast-way";
-import costApi from '~api/project/cost.js';
+import { onActivated, ref, watch } from 'vue'
+import { getProjectList, getdepartmentList } from '~api/other'
+import { getArrValue } from 'js-fast-way'
+import costApi from '~api/project/cost.js'
 
-onActivated(() => {
-
-  
-})
 //参数
 const props = defineProps({
     otherInfo: {
         type: Object,
-        default: {}
-    }
+        default: {},
+    },
+})
+onActivated(() => {
+
+  
 })
 const otherInfo = ref(props.otherInfo)
 //监听
 watch(() => [
     props.otherInfo,
 ], ([otherInfo]) => {
-    console.log(otherInfo, 'otherInfo');
+    console.log(otherInfo, 'otherInfo')
     getdepartmentListData()
     getCostTypeDict()
     getProcessList(otherInfo?.projectId)
     getPostDict()
     getBudgetTypeList()
 
-    constructUnitData.value=otherInfo?.constructUnit||[]
-    bulidUnitData.value=otherInfo?.buildUnit||[]
-    supervisorUnitData.value=otherInfo?.supervisorUnit||[]
-    tabKey.value='construction'
-    tableData.value=constructUnitData.value
-    basetableData.value=[
+    constructUnitData.value = otherInfo?.constructUnit || []
+    bulidUnitData.value = otherInfo?.buildUnit || []
+    supervisorUnitData.value = otherInfo?.supervisorUnit || []
+    tabKey.value = 'construction'
+    tableData.value = constructUnitData.value
+    basetableData.value = [
         {
             projectName: otherInfo?.projectName,
             projectCostTotal: otherInfo?.projectCostTotal,
@@ -122,7 +120,7 @@ watch(() => [
             maintainCostTotal: otherInfo?.maintainCostTotal,
             outsourceCostTotal: otherInfo?.outsourceCostTotal,
             manageCostTotal: otherInfo?.manageCostTotal,
-        }
+        },
     ]
 
 })
@@ -146,50 +144,50 @@ const tabKey = ref('construction')
 const tabTab = ref([
     { key: 'bulid', name: '施工单位成本' },
     { key: 'supervision', name: '监理单位成本' },
-    { key: 'construction', name: '建设单位成本' }
-]);
+    { key: 'construction', name: '建设单位成本' },
+])
 //测算表格数据
-const constructUnitData=ref([])
-const bulidUnitData=ref([])
-const supervisorUnitData=ref([])
+const constructUnitData = ref([])
+const bulidUnitData = ref([])
+const supervisorUnitData = ref([])
 
 const tabChange = ({ key }) => {
     tabKey.value = key
-    if(key=='supervision'){
-        tableData.value=supervisorUnitData.value
-    }else if(key=='construction'){
-        tableData.value=constructUnitData.value
-    }else if(key=='bulid'){
-        tableData.value=bulidUnitData.value
+    if (key == 'supervision') {
+        tableData.value = supervisorUnitData.value
+    } else if (key == 'construction') {
+        tableData.value = constructUnitData.value
+    } else if (key == 'bulid') {
+        tableData.value = bulidUnitData.value
 
     }
 
 }
 //成本测算表格
 const tableColumn = [
-    {key: 'deptId', name: '费用分摊部门', width: '160', align: 'center'},
-    {key: 'costType', name: '费用分类', width: '160', align: 'center'},
-    {key: 'projectProcess', name: '项目环节', width: '160', align: 'center'},
-    {key: 'budgetType', name: '预算类型', width: '160', align: 'center'},
-    {key: 'taskDetail', name: '任务明细', width: '160',  align: 'center'},
-    {key: 'budgetDays', name: '预计工作量(小数/整数/天)', width: '160',  align: 'center'},
-    {key: 'postType', name: '投入岗位类型(日单价)', width: '160', align: 'center'},
-    {key: 'staffCount', name: '投入人员数量', width: '160', align: 'center'},
-    {key: 'budgetStaffCost', name: '预计人工成本(元)', width: '160', align: 'center'},
-    {key: 'budgetTravelExpense', name: '预计差旅费(元)', width: '160', align: 'center'},
-    {key: 'outsourceUnitPrice', name: '外包单价', width: '160', align: 'center'},
-    {key: 'outsourcePeopleCount', name: '外包数量', width: '160', align: 'center'},
-    {key: 'outsourceCountMoney', name: '外包金额', width: '160', align: 'center'},
-    {key: 'otherBudgetMoney', name: '其他预算金额', width: '160', align: 'center'},
-    {key: 'budgetCountMoney', name: '总预算金额', width: '160', align: 'center'},
-    {key: 'budgetRemark', name: '测算备注', width: '160', align: 'center'},
+    { key: 'deptId', name: '费用分摊部门', width: '160', align: 'center' },
+    { key: 'costType', name: '费用分类', width: '160', align: 'center' },
+    { key: 'projectProcess', name: '项目环节', width: '160', align: 'center' },
+    { key: 'budgetType', name: '预算类型', width: '160', align: 'center' },
+    { key: 'taskDetail', name: '任务明细', width: '160', align: 'center' },
+    { key: 'budgetDays', name: '预计工作量(小数/整数/天)', width: '160', align: 'center' },
+    { key: 'postType', name: '投入岗位类型(日单价)', width: '160', align: 'center' },
+    { key: 'staffCount', name: '投入人员数量', width: '160', align: 'center' },
+    { key: 'budgetStaffCost', name: '预计人工成本(元)', width: '160', align: 'center' },
+    { key: 'budgetTravelExpense', name: '预计差旅费(元)', width: '160', align: 'center' },
+    { key: 'outsourceUnitPrice', name: '外包单价', width: '160', align: 'center' },
+    { key: 'outsourcePeopleCount', name: '外包数量', width: '160', align: 'center' },
+    { key: 'outsourceCountMoney', name: '外包金额', width: '160', align: 'center' },
+    { key: 'otherBudgetMoney', name: '其他预算金额', width: '160', align: 'center' },
+    { key: 'budgetCountMoney', name: '总预算金额', width: '160', align: 'center' },
+    { key: 'budgetRemark', name: '测算备注', width: '160', align: 'center' },
   
 ]
 const tableData = ref([])//成本测算表格
 //费用分摊部门
 const departMent = ref([])
 const getdepartmentListData = async () => {
-    const {error, code, data} = await getdepartmentList({deptType:2})
+    const { error, code, data } = await getdepartmentList({ deptType:2 })
     //判断状态
     if (!error && code === 200) {
         departMent.value = getArrValue(data)
@@ -198,71 +196,72 @@ const getdepartmentListData = async () => {
     }
 }
 //获取费用分类
-const costTypeList=ref([])
-const getCostTypeDict=async(type)=>{
-    const {error, code, data} = await costApi.getCostTypeDict()
+const costTypeList = ref([])
+const getCostTypeDict = async (type)=>{
+    const { error, code, data } = await costApi.getCostTypeDict()
     if (!error && code === 200) {
-        costTypeList.value=getArrValue(data)
+        costTypeList.value = getArrValue(data)
 
     } else {
-        costTypeList.value={}
+        costTypeList.value = {}
     }
 }
 //获取项目环节
-const processList=ref([])
-const getProcessList=async(projectId)=>{
-    const {error, code, data} = await costApi.getProcessList({projectId:projectId})
+const processList = ref([])
+const getProcessList = async (projectId)=>{
+    const { error, code, data } = await costApi.getProcessList({ projectId:projectId })
     if (!error && code === 200) {
-        processList.value=getArrValue(data)
+        processList.value = getArrValue(data)
 
     } else {
-        processList.value={}
+        processList.value = {}
     }
 }
 //获取预算分类getSecondSubject
-const budgetTypeList=ref([])
-const getBudgetTypeList=async()=>{
-    const {error, code, data} = await costApi.getSecondSubject()
+const budgetTypeList = ref([])
+const getBudgetTypeList = async ()=>{
+    const { error, code, data } = await costApi.getSecondSubject2()
     if (!error && code === 200) {
-        budgetTypeList.value=getArrValue(data)
+        budgetTypeList.value = getArrValue(data)
      
 
     } else {
-        budgetTypeList.value={}
+        budgetTypeList.value = {}
     }
 }
 //任务明细
-const taskDetailList=ref({})
-const budgetTypeChange=async(val,index)=>{
-    let id=''
+const taskDetailList = ref({})
+const budgetTypeChange = async (val, index)=>{
+    let id = ''
     budgetTypeList.value.forEach((ele)=>{
-        if(ele.dictValue===val){
-            id=ele.id
+        if (ele.dictValue === val) {
+            id = ele.id
         }
     })
-    if(id.length>0){
-        const {error, code, data} = await costApi.getChlidList({parentId:id,type:1})
+    if (id.length > 0) {
+        const { error, code, data } = await costApi.getChlidList({ parentId:id, type:5 })
         if (!error && code === 200) {
-            taskDetailList.value[index]=getArrValue(data)
+            taskDetailList.value[index] = getArrValue(data)
 
         } else {
-            taskDetailList.value[index]={}
+            taskDetailList.value[index] = {}
         }
     }
    
 }
 //获取岗位分类postTypeList
-const postTypeList=ref([])
-const getPostDict=async(type)=>{
-    const {error, code, data} = await costApi.getPostDict()
+const postTypeList = ref([])
+const getPostDict = async (type)=>{
+    const { error, code, data } = await costApi.getPostDict()
     if (!error && code === 200) {
-        postTypeList.value=getArrValue(data)
+        postTypeList.value = getArrValue(data)
     
 
 
     } else {
-        postTypeList.value={}
+        postTypeList.value = {}
     }
 }
 </script>
+
 <style lang='scss' scoped></style>

+ 63 - 43
src/views/home/task/components/loan-request.vue

@@ -1,65 +1,73 @@
 <!--  -->
 <template>
-  <div >
-    <el-form ref="formRef" :model="otherInfo"  label-position="top"   disabled>
-        <el-form-item label="申请人:" prop="loanUserName">
-            <el-input v-model="otherInfo.loanUserName"/>
-        </el-form-item>
-        <el-form-item label="借款事由:">
-            <el-input type="textarea" v-model="otherInfo.loanDesc" :autosize="{ minRows: 3, maxRows: 5 }"/>
-        </el-form-item>
-        <el-form-item prop="loanMoney">
-            <template #label>
-                <span>申请金额:</span>
-                <span style="color: #8f8d8d;">{{otherInfo.loanMoneyText}}</span>
-            </template>
-            <el-input v-model="otherInfo.loanMoney" onkeyup="this.value=this.value.match(/\d+\.?\d{0,2}/)">
-                <template #append>元</template>
-            </el-input>
-        </el-form-item>
-        <div class="hc-form-item">
-            <el-form-item label="使用日期:" prop="useDate">
-                <el-date-picker type="date" class="block" v-model="otherInfo.useDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD"/>
+    <div>
+        <el-form ref="formRef" :model="otherInfo" label-position="top" disabled>
+            <el-form-item label="申请人:" prop="loanUserName">
+                <!-- <el-input v-model="otherInfo.loanUserName"/> -->
+                <el-select v-model="otherInfo.loanUserName" clearable>
+                    <el-option v-for="item in userList" :label="item.name" :value="item.name" />
+                </el-select>
             </el-form-item>
-            <el-form-item label="归还日期:" prop="returnDate">
-                <el-date-picker type="date" class="block" v-model="otherInfo.returnDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD"/>
+            <el-form-item label="借款事由:">
+                <el-input v-model="otherInfo.loanDesc" type="textarea" :autosize="{ minRows: 3, maxRows: 5 }" />
             </el-form-item>
-        </div>
-        <el-form-item label="备注:">
-            <el-input type="textarea" v-model="otherInfo.remarks" :autosize="{ minRows: 3, maxRows: 5 }"/>
-        </el-form-item>
-    </el-form>
-  </div>
+            <el-form-item prop="loanMoney">
+                <template #label>
+                    <span>申请金额:</span>
+                    <span style="color: #8f8d8d;">{{ otherInfo.loanMoneyText }}</span>
+                </template>
+                <el-input v-model="otherInfo.loanMoney" onkeyup="this.value=this.value.match(/\d+\.?\d{0,2}/)">
+                    <template #append>
+                        元
+                    </template>
+                </el-input>
+            </el-form-item>
+            <div class="hc-form-item">
+                <el-form-item label="使用日期:" prop="useDate">
+                    <el-date-picker v-model="otherInfo.useDate" type="date" class="block" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
+                </el-form-item>
+                <el-form-item label="归还日期:" prop="returnDate">
+                    <el-date-picker v-model="otherInfo.returnDate" type="date" class="block" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
+                </el-form-item>
+            </div>
+            <el-form-item label="备注:">
+                <el-input v-model="otherInfo.remarks" type="textarea" :autosize="{ minRows: 3, maxRows: 5 }" />
+            </el-form-item>
+        </el-form>
+    </div>
 </template>
 
 <script setup>
-import { ref, watch,onActivated } from 'vue'
-import {getProjectList} from "~api/other";
-import {getArrValue} from "js-fast-way";
-onActivated(()=>{
-  getProjectData()
- })
+import { onActivated, ref, watch } from 'vue'
+import { getProjectList, getuserList } from '~api/other'
+import { getArrValue } from 'js-fast-way'
+import { useAppStore } from '~src/store'
 //参数
 const props = defineProps({
   otherInfo: {
     type: Object,
-    default: {}
-  }
+    default: {},
+  },
 })
-const trafficTypeData=ref([])
-const wayType=ref([])
-const cityType=ref([])
-const projectType=ref([])
-const partneroptions=ref([])
+const useAppState = useAppStore()
+onActivated(()=>{
+  getProjectData()
+  getUserDict()
+ })
+const trafficTypeData = ref([])
+const wayType = ref([])
+const cityType = ref([])
+const projectType = ref([])
+const partneroptions = ref([])
 //监听
 watch(() => [
   props.otherInfo,
 ], ([otherInfo]) => {
-  console.log(otherInfo, 'otherInfo');
+  console.log(otherInfo, 'otherInfo')
 
 })
 const getProjectData = async () => {
-    const {error, code, data} = await getProjectList()
+    const { error, code, data } = await getProjectList()
     //判断状态
     if (!error && code === 200) {
       projectType.value = getArrValue(data)
@@ -67,7 +75,19 @@ const getProjectData = async () => {
       projectType.value = []
     }
 }
+//获取所有员工
+const userList = ref([])
+const getUserDict = async ()=>{
+    const { error, code, data } = await getuserList({ tenantId:useAppState.tenantId })
+    if (!error && code === 200) {
+        userList.value = getArrValue(data)
+
+    } else {
+        userList.value = []
 
+    }
+}
 </script>
+
 <style lang='scss' scoped>
 </style>

+ 6 - 5
src/views/home/task/task-details.vue

@@ -78,12 +78,13 @@
                 </HcListItem>
                 <HcListItem title="归属人:" :content="otherInfo?.userNameVesting" />
                 <HcListItem v-if="otherInfo?.isDeductLoan === 1" title="是否抵消借款金额" :content="otherInfo?.isDeductLoan === 0 ? '否' : '是'" />
-                <HcListItem v-if="otherInfo?.isDeductLoan === 1" title="选择借款项" :content="otherInfo?.userNameVesting">
-                    <el-select v-model="otherInfo.deductLoanId" disabled>
+        
+                <!-- <el-select v-model="otherInfo.deductLoanId" disabled>
                         <el-option v-for="item in loanListData" :label="item.loanName" :value="item.id" />
-                    </el-select>
-                </HcListItem>
-                <HcListItem v-if="otherInfo?.isDeductLoan === 1" title="归属冲抵后的实际报销金额:" :content="otherInfo?.frMoneyActual" />
+                    </el-select> -->
+                <HcListItem v-if="otherInfo?.isDeductLoan === 1" title="借款项" :content="otherInfo?.deductLoanInfo" />
+           
+                <HcListItem v-if="otherInfo?.isDeductLoan === 1" title="归属冲抵后的实际报销金额:" :content="otherInfo?.loanOutstandingBalance" />
                 <!-- <HcListItem title="备注信息:" content="备注数据"/> -->
             </div>
             <!-- 出差审批 -->

+ 75 - 70
src/views/people/archive/index.vue

@@ -7,59 +7,64 @@
                 </el-select>
             </div>
             <div class="ml-4">
-                <el-button type="primary" @click="searchClick" size="large">
-                    <HcIcon name="search-2"/>
+                <el-button type="primary" size="large" @click="searchClick">
+                    <HcIcon name="search-2" />
                     <span>搜索</span>
                 </el-button>
             </div>
             <div class="ml-2">
                 <el-button size="large" @click="resetClick">
-                    <HcIcon name="close-circle"/>
+                    <HcIcon name="close-circle" />
                     <span>重置</span>
                 </el-button>
             </div>
         </template>
         <HcTable :loading="tableLoading" :column="tableColumn" :datas="tableData">
-            <template #conFileUrl="{row}">
+            <template #conFileUrl="{ row }">
                 <span class="text-blue text-hover" @click="rowViewPdf(row.conFileUrl)">
-                    {{getFileName(row.conFileUrl)}}
+                    {{ getFileName(row.conFileUrl) }}
                 </span>
             </template>
-            <template #carAimgUrl="{row}">
+            <template #carAimgUrl="{ row }">
                 <span class="text-blue text-hover" @click="rowViewImg(row.carAimgUrl)">
-                    {{getFileName(row.carAimgUrl)}}
+                    {{ getFileName(row.carAimgUrl) }}
                 </span>
             </template>
-            <template #carBimgUrl="{row}">
+            <template #carBimgUrl="{ row }">
                 <span class="text-blue text-hover" @click="rowViewImg(row.carBimgUrl)">
-                    {{getFileName(row.carBimgUrl)}}
+                    {{ getFileName(row.carBimgUrl) }}
                 </span>
             </template>
-            <template #userImgUrl="{row}">
+            <template #userImgUrl="{ row }">
                 <span class="text-blue text-hover" @click="rowViewImg(row.userImgUrl)">
-                    {{getFileName(row.userImgUrl)}}
+                    {{ getFileName(row.userImgUrl) }}
                 </span>
             </template>
-            <template #action="{row, index}">
-                <el-button type="primary" size="small" @click="editRowClick(row)">编辑</el-button>
-                <el-button type="danger" size="small" @click="delRowClick(row)">删除</el-button>
+           
+            <template #action="{ row, index }">
+                <el-button v-auth-btn="['people-archive-edit-btn']" type="primary" size="small" @click="editRowClick(row)">
+                    编辑
+                </el-button>
+                <el-button v-auth-btn="['people-archive-del-btn']" type="danger" size="small" @click="delRowClick(row)">
+                    删除
+                </el-button>
             </template>
         </HcTable>
         <template #action>
-            <HcPages :pages="searchForm" @change="pageChange"/>
+            <HcPages :pages="searchForm" @change="pageChange" />
         </template>
-        <!--预览图片-->
-        <el-image-viewer v-if="showViewer" :initial-index="initialIndex" :url-list="previewFileList" @close="showViewerClose"/>
+        <!-- 预览图片 -->
+        <el-image-viewer v-if="showViewer" :initial-index="initialIndex" :url-list="previewFileList" @close="showViewerClose" />
     </HcCard>
 </template>
 
 <script setup>
-import {onActivated, ref} from 'vue'
-import mainApi from "~api/people/archive";
-import {useRouter} from 'vue-router'
-import {getuserList} from "~api/other";
-import {getArrValue} from "js-fast-way";
-import {delMessage, getFileName} from "~uti/tools";
+import { onActivated, ref } from 'vue'
+import mainApi from '~api/people/archive'
+import { useRouter } from 'vue-router'
+import { getuserList } from '~api/other'
+import { getArrValue } from 'js-fast-way'
+import { delMessage, getFileName } from '~uti/tools'
 
 const router = useRouter()
 
@@ -71,28 +76,28 @@ onActivated(() => {
 //获取用户下拉数据
 const userList = ref([])
 const getuserListApi = async () => {
-    const {data} = await getuserList()
+    const { data } = await getuserList()
     userList.value = getArrValue(data)
 }
 
 const searchForm = ref({
     type: 1, userId: null,
-    current: 1, size: 20, total: 0
+    current: 1, size: 20, total: 0,
 })
 
 //搜索
 const searchClick = () => {
-    searchForm.value.current = 1;
+    searchForm.value.current = 1
     getTableData()
 }
 
 //重置搜索表单
 const resetClick = () => {
-    searchForm.value = {current: 1, size: 20, total: 0}
+    searchForm.value = { current: 1, size: 20, total: 0 }
 }
 
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
     getTableData()
@@ -101,53 +106,53 @@ const pageChange = ({current, size}) => {
 //表格参数
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'name', name: '姓名', width: 100},
-    {key: 'email', name: '邮箱', width: 120},
-    {key: 'deptName', name: '部门', width: 120},
-    {key: 'leaderName', name: '直属主管', width: 100},
-    {key: 'postName', name: '职位', width: 120},
-    {key: 'phone', name: '手机号', width: 120},
-    {key: 'entryTime', name: '入职时间', width: 120},
-    {key: 'cyear', name: '司龄', width: 100},
-    {key: 'userTypeName', name: '员工类型', width: 100},
-    {key: 'userStatusName', name: '员工状态', width: 100},
-    {key: 'periodMoth', name: '试用期', width: 100},
-    {key: 'idNumber', name: '身份证号码', width: 120},
-    {key: 'carName', name: '身份证姓名', width: 120},
-    {key: 'birthday', name: '出生日期', width: 120},
-    {key: 'userAge', name: '年龄', width: 90},
-    {key: 'sexName', name: '性别', width: 90},
-    {key: 'nation', name: '民族', width: 90},
-    {key: 'carAddr', name: '身份证地址', width: 120},
-    {key: 'marriageStatusName', name: '婚姻状况', width: 100},
-    {key: 'domicileAddr', name: '户籍', width: 100},
-    {key: 'politicalName', name: '政治面貌', width: 100},
-    {key: 'educationName', name: '学历', width: 100},
-    {key: 'speciality', name: '专业', width: 100},
-    {key: 'bankNum', name: '银行卡号', width: 120},
-    {key: 'bankName', name: '开户行', width: 120},
-    {key: 'conTypeName', name: '合同类型', width: 120},
-    {key: 'conStartDate', name: '合同开始日期', width: 120},
-    {key: 'conEndDate', name: '合同结束日期', width: 120},
-    {key: 'renewalCount', name: '续签次数', width: 100},
-    {key: 'conYear', name: '合同期限', width: 100},
-    {key: 'conFileUrl', name: '合同附件', width: 120},
-    {key: 'emergencyName', name: '紧急联系人姓名', width: 130},
-    {key: 'emergencyPhone', name: '联系人电话', width: 120},
-    {key: 'emergencyRelation', name: '联系人关系', width: 100},
-    {key: 'carAimgUrl', name: '身份证(人面像)', width: 120},
-    {key: 'carBimgUrl', name: '身份证(国徽)', width: 120},
-    {key: 'userImgUrl', name: '员工照片', width: 120},
-    {key: 'action', name: '操作', width: 145, align: 'center', fixed: 'right'},
+    { key: 'name', name: '姓名', width: 100 },
+    { key: 'email', name: '邮箱', width: 120 },
+    { key: 'deptName', name: '部门', width: 120 },
+    { key: 'leaderName', name: '直属主管', width: 100 },
+    { key: 'postName', name: '职位', width: 120 },
+    { key: 'phone', name: '手机号', width: 120 },
+    { key: 'entryTime', name: '入职时间', width: 120 },
+    { key: 'cyear', name: '司龄', width: 100 },
+    { key: 'userTypeName', name: '员工类型', width: 100 },
+    { key: 'userStatusName', name: '员工状态', width: 100 },
+    { key: 'periodMoth', name: '试用期', width: 100 },
+    { key: 'idNumber', name: '身份证号码', width: 120 },
+    { key: 'carName', name: '身份证姓名', width: 120 },
+    { key: 'birthday', name: '出生日期', width: 120 },
+    { key: 'userAge', name: '年龄', width: 90 },
+    { key: 'sexName', name: '性别', width: 90 },
+    { key: 'nation', name: '民族', width: 90 },
+    { key: 'carAddr', name: '身份证地址', width: 120 },
+    { key: 'marriageStatusName', name: '婚姻状况', width: 100 },
+    { key: 'domicileAddr', name: '户籍', width: 100 },
+    { key: 'politicalName', name: '政治面貌', width: 100 },
+    { key: 'educationName', name: '学历', width: 100 },
+    { key: 'speciality', name: '专业', width: 100 },
+    { key: 'bankNum', name: '银行卡号', width: 120 },
+    { key: 'bankName', name: '开户行', width: 120 },
+    { key: 'conTypeName', name: '合同类型', width: 120 },
+    { key: 'conStartDate', name: '合同开始日期', width: 120 },
+    { key: 'conEndDate', name: '合同结束日期', width: 120 },
+    { key: 'renewalCount', name: '续签次数', width: 100 },
+    { key: 'conYear', name: '合同期限', width: 100 },
+    { key: 'conFileUrl', name: '合同附件', width: 120 },
+    { key: 'emergencyName', name: '紧急联系人姓名', width: 130 },
+    { key: 'emergencyPhone', name: '联系人电话', width: 120 },
+    { key: 'emergencyRelation', name: '联系人关系', width: 100 },
+    { key: 'carAimgUrl', name: '身份证(人面像)', width: 120 },
+    { key: 'carBimgUrl', name: '身份证(国徽)', width: 120 },
+    { key: 'userImgUrl', name: '员工照片', width: 120 },
+    { key: 'action', name: '操作', width: 145, align: 'center', fixed: 'right' },
 ]
 
 //获取表格数据
 const tableData = ref([
-    {id:1}
+    { id:1 },
 ])
 const getTableData = async () => {
     tableLoading.value = true
-    const {data} = await mainApi.page(searchForm.value)
+    const { data } = await mainApi.page(searchForm.value)
     tableLoading.value = false
     tableData.value = getArrValue(data['records'])
     searchForm.value.total = data['total'] || 0
@@ -157,14 +162,14 @@ const getTableData = async () => {
 const editRowClick = (row) => {
     router.push({
         name: 'people-archive-info',
-        query: {id: row.id}
+        query: { id: row.id },
     })
 }
 
 //删除
 const delRowClick = (row) => {
     delMessage(async () => {
-        const {error, code, msg} = await mainApi.remove({ids: row.id})
+        const { error, code, msg } = await mainApi.remove(row.id)
         if (!error && code === 200) {
             window.$message?.success(msg)
             getTableData().then()

+ 1 - 1
src/views/people/archive/info.vue

@@ -77,7 +77,7 @@
                 </el-col>
                 <el-col :span="8">
                     <el-form-item label="合同开始日期:">
-                        <el-date-picker v-model="formModel.conStartDate" class="block" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
+                        <el-date-picker v-model="formModel.conStartDate" class="block" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" disabled />
                     </el-form-item>
                 </el-col>
                 <el-col :span="8">

+ 40 - 34
src/views/people/contract/index.vue

@@ -7,46 +7,52 @@
                 </el-select>
             </div>
             <div class="ml-4">
-                <el-button type="primary" @click="searchClick" size="large">
-                    <HcIcon name="search-2"/>
+                <el-button type="primary" size="large" @click="searchClick">
+                    <HcIcon name="search-2" />
                     <span>搜索</span>
                 </el-button>
             </div>
             <div class="ml-2">
                 <el-button size="large" @click="resetClick">
-                    <HcIcon name="close-circle"/>
+                    <HcIcon name="close-circle" />
                     <span>重置</span>
                 </el-button>
             </div>
         </template>
         <template #extra>
-            <el-button type="primary" @click="addRowClick" size="large">
-                <HcIcon name="add"/>
+            <el-button v-auth-btn="['people-contract-add-btn']" type="primary" size="large" @click="addRowClick">
+                <HcIcon name="add" />
                 <span>新增合同信息</span>
             </el-button>
         </template>
         <HcTable :loading="tableLoading" :column="tableColumn" :datas="tableData">
-            <template #conFileName="{row}">
-                <div class="text-link text-blue" @click="viewPdf(row)">{{ row?.conFileName }}</div>
+            <template #conFileName="{ row }">
+                <div class="text-link text-blue" @click="viewPdf(row)">
+                    {{ row?.conFileName }}
+                </div>
             </template>
-            <template #action="{row, index}">
-                <el-button type="primary" size="small" @click="editRowClick(row)">编辑</el-button>
-                <el-button type="danger" size="small" @click="delRowClick(row)">删除</el-button>
+            <template #action="{ row, index }">
+                <el-button v-auth-btn="['people-contract-edit-btn']" type="primary" size="small" @click="editRowClick(row)">
+                    编辑
+                </el-button>
+                <el-button v-auth-btn="['people-contract-del-btn']" type="danger" size="small" @click="delRowClick(row)">
+                    删除
+                </el-button>
             </template>
         </HcTable>
         <template #action>
-            <HcPages :pages="searchForm" @change="pageChange"/>
+            <HcPages :pages="searchForm" @change="pageChange" />
         </template>
     </HcCard>
 </template>
 
 <script setup>
-import {onActivated, ref} from 'vue'
-import mainApi from "~api/people/contract";
-import {useRouter} from 'vue-router'
-import {getuserList} from "~api/other";
-import {getArrValue} from "js-fast-way";
-import {delMessage} from "~uti/tools";
+import { onActivated, ref } from 'vue'
+import mainApi from '~api/people/contract'
+import { useRouter } from 'vue-router'
+import { getuserList } from '~api/other'
+import { getArrValue } from 'js-fast-way'
+import { delMessage } from '~uti/tools'
 
 const router = useRouter()
 
@@ -58,28 +64,28 @@ onActivated(() => {
 //获取用户下拉数据
 const userList = ref([])
 const getuserListApi = async () => {
-    const {data} = await getuserList()
+    const { data } = await getuserList()
     userList.value = getArrValue(data)
 }
 
 const searchForm = ref({
     type: 1, userId: null,
-    current: 1, size: 20, total: 0
+    current: 1, size: 20, total: 0,
 })
 
 //搜索
 const searchClick = () => {
-    searchForm.value.current = 1;
+    searchForm.value.current = 1
     getTableData()
 }
 
 //重置搜索表单
 const resetClick = () => {
-    searchForm.value = {current: 1, size: 20, total: 0}
+    searchForm.value = { current: 1, size: 20, total: 0 }
 }
 
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
     getTableData()
@@ -88,20 +94,20 @@ const pageChange = ({current, size}) => {
 //表格参数
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'userName', name: '姓名'},
-    {key: 'deptName', name: '部门'},
-    {key: 'startDate', name: '合同开始时间'},
-    {key: 'endDate', name: '合同结束时间'},
-    {key: 'conTypeName', name: '合同类型'},
-    {key: 'conFileName', name: '合同附件'},
-    {key: 'action', name: '操作', align: 'center', fixed: 'right'},
+    { key: 'userName', name: '姓名' },
+    { key: 'deptName', name: '部门' },
+    { key: 'startDate', name: '合同开始时间' },
+    { key: 'endDate', name: '合同结束时间' },
+    { key: 'conTypeName', name: '合同类型' },
+    { key: 'conFileName', name: '合同附件' },
+    { key: 'action', name: '操作', align: 'center' },
 ]
 
 //获取表格数据
 const tableData = ref([])
 const getTableData = async () => {
     tableLoading.value = true
-    const {data} = await mainApi.page(searchForm.value)
+    const { data } = await mainApi.page(searchForm.value)
     tableData.value = getArrValue(data['records'])
     searchForm.value.total = data['total'] || 0
     tableLoading.value = false
@@ -109,21 +115,21 @@ const getTableData = async () => {
 
 //新增
 const addRowClick = () => {
-    router.push({name: 'people-contract-info'})
+    router.push({ name: 'people-contract-info' })
 }
 
 //编辑
 const editRowClick = (row) => {
     router.push({
         name: 'people-contract-info',
-        query: {id: row.id}
+        query: { id: row.id },
     })
 }
 
 //删除
 const delRowClick = (row) => {
     delMessage(async () => {
-        const {error, code, msg} = await mainApi.remove({ids: row.id})
+        const { error, code, msg } = await mainApi.remove({ ids: row.id })
         if (!error && code === 200) {
             window.$message?.success(msg)
             getTableData().then()
@@ -134,7 +140,7 @@ const delRowClick = (row) => {
 }
 
 //查看pdf
-const viewPdf = ({fileUrl}) => {
+const viewPdf = ({ fileUrl }) => {
     if (fileUrl) {
         window.open(fileUrl, '_blank')
     } else {

+ 58 - 52
src/views/people/dimission.vue

@@ -7,40 +7,47 @@
                 </el-select>
             </div>
             <div class="ml-4">
-                <el-button type="primary" @click="searchClick" size="large">
-                    <HcIcon name="search-2"/>
+                <el-button type="primary" size="large" @click="searchClick">
+                    <HcIcon name="search-2" />
                     <span>搜索</span>
                 </el-button>
             </div>
             <div class="ml-2">
                 <el-button size="large" @click="resetClick">
-                    <HcIcon name="close-circle"/>
+                    <HcIcon name="close-circle" />
                     <span>重置</span>
                 </el-button>
             </div>
         </template>
         <template #extra>
-            <el-button type="primary" @click="addRowClick" size="large">
-                <HcIcon name="add"/>
+            <el-button v-auth-btn="['people-dimission-add-btn']" type="primary" size="large" @click="addRowClick">
+                <HcIcon name="add" />
                 <span>新增</span>
             </el-button>
         </template>
         <HcTable :loading="tableLoading" :column="tableColumn" :datas="tableData">
-            <template #conFileName="{row}">
-                <div class="text-link text-blue" @click="viewPdf(row)">{{ row?.conFileName }}</div>
+            <template #conFileName="{ row }">
+                <div class="text-link text-blue" @click="viewPdf(row)">
+                    {{ row?.conFileName }}
+                </div>
             </template>
-            <template #action="{row, index}">
-                <el-button type="primary" size="small" @click="editRowClick(row)">编辑</el-button>
-                <el-button type="danger" size="small" @click="delRowClick(row)">删除</el-button>
+            <template #action="{ row, index }">
+                <el-button v-auth-btn="['people-dimission-edit-btn']" type="primary" size="small" @click="editRowClick(row)">
+                    编辑
+                </el-button>
+                <el-button v-auth-btn="['people-dimission-del-btn']" type="danger" size="small" @click="delRowClick(row)">
+                    删除
+                </el-button>
             </template>
         </HcTable>
         <template #action>
-            <HcPages :pages="searchForm" @change="pageChange"/>
+            <HcPages :pages="searchForm" @change="pageChange" />
         </template>
 
-        <!--入职登记弹窗-->
-        <HcDialog bgColor="#ffffff" isToBody widths="42rem" :show="formModal" title="入职登记"
-                  :loading="formModalLoading" loadingText="保存中,请稍等" @close="formModalClose" @save="formModalSave"
+        <!-- 入职登记弹窗 -->
+        <HcDialog
+            bg-color="#ffffff" is-to-body widths="42rem" :show="formModal" title="入职登记"
+            :loading="formModalLoading" loading-text="保存中,请稍等" @close="formModalClose" @save="formModalSave"
         >
             <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="left" label-width="auto" size="large">
                 <el-form-item label="员工姓名:" prop="userId">
@@ -49,30 +56,29 @@
                     </el-select>
                 </el-form-item>
                 <el-form-item label="离职时间:" prop="endDate">
-                    <el-date-picker v-model="formModel.endDate" type="date" class="block" format="YYYY-MM-DD" value-format="YYYY-MM-DD"/>
+                    <el-date-picker v-model="formModel.endDate" type="date" class="block" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
                 </el-form-item>
                 <el-form-item label="离职原因:" prop="leReasion">
-                    <el-input type="textarea" v-model="formModel.leReasion" :autosize="{ minRows: 4, maxRows: 6 }"/>
+                    <el-input v-model="formModel.leReasion" type="textarea" :autosize="{ minRows: 4, maxRows: 6 }" />
                 </el-form-item>
-                <el-form-item label="离职登记表:" v-if="formModel.fileUrl">
-                    <HcFormUpload :src="formModel.fileUrl" @upload="formItemUpload"/>
+                <el-form-item v-if="formModel.fileUrl" label="离职登记表:">
+                    <HcFormUpload :src="formModel.fileUrl" @upload="formItemUpload" />
                 </el-form-item>
-                <el-form-item label="离职登记表:" v-show="!formModel.fileUrl">
-                    <HcUploadFile ref="uploadFileRef" drop :options="uploadOptions" @success="uploadFileSuccess" class="w-full"/>
+                <el-form-item v-show="!formModel.fileUrl" label="离职登记表:">
+                    <HcUploadFile ref="uploadFileRef" drop :options="uploadOptions" class="w-full" @success="uploadFileSuccess" />
                 </el-form-item>
             </el-form>
         </HcDialog>
-
     </HcCard>
 </template>
 
 <script setup>
-import {ref, onActivated} from 'vue'
-import mainApi from "~api/people/contract";
-import {getTokenHeader} from "~src/api/request/header";
-import {getuserList} from "~api/other";
-import {getObjValue, getArrValue, formValidate} from "js-fast-way"
-import {delMessage} from "~uti/tools";
+import { onActivated, ref } from 'vue'
+import mainApi from '~api/people/contract'
+import { getTokenHeader } from '~src/api/request/header'
+import { getuserList } from '~api/other'
+import { formValidate, getArrValue, getObjValue } from 'js-fast-way'
+import { delMessage } from '~uti/tools'
 
 onActivated(() => {
     getuserListApi()
@@ -82,28 +88,28 @@ onActivated(() => {
 //获取用户下拉数据
 const userList = ref([])
 const getuserListApi = async () => {
-    const {data} = await getuserList()
+    const { data } = await getuserList()
     userList.value = getArrValue(data)
 }
 
 const searchForm = ref({
     type: 3, userId: null,
-    current: 1, size: 20, total: 0
+    current: 1, size: 20, total: 0,
 })
 
 //搜索
 const searchClick = () => {
-    searchForm.value.current = 1;
+    searchForm.value.current = 1
     getTableData()
 }
 
 //重置搜索表单
 const resetClick = () => {
-    searchForm.value = {current: 1, size: 20, total: 0}
+    searchForm.value = { current: 1, size: 20, total: 0 }
 }
 
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
     getTableData()
@@ -112,20 +118,20 @@ const pageChange = ({current, size}) => {
 //表格参数
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'userName', name: '姓名'},
-    {key: 'deptName', name: '部门'},
-    {key: 'postName', name: '职位'},
-    {key: 'endDate', name: '离职日期'},
-    {key: 'leReasion', name: '离职原因'},
-    {key: 'conFileName', name: '离职登记表'},
-    {key: 'action', name: '操作', width: '150'}
+    { key: 'userName', name: '姓名' },
+    { key: 'deptName', name: '部门' },
+    { key: 'postName', name: '职位' },
+    { key: 'endDate', name: '离职日期' },
+    { key: 'leReasion', name: '离职原因' },
+    { key: 'conFileName', name: '离职登记表' },
+    { key: 'action', name: '操作', width: '150' },
 ]
 
 //获取表格数据
 const tableData = ref([])
 const getTableData = async () => {
     tableLoading.value = true
-    const {data} = await mainApi.page(searchForm.value)
+    const { data } = await mainApi.page(searchForm.value)
     tableData.value = getArrValue(data['records'])
     searchForm.value.total = data['total'] || 0
     tableLoading.value = false
@@ -134,7 +140,7 @@ const getTableData = async () => {
 //删除
 const delRowClick = (row) => {
     delMessage(async () => {
-        const {error, code, msg} = await mainApi.remove({ids: row.id})
+        const { error, code, msg } = await mainApi.remove({ ids: row.id })
         if (!error && code === 200) {
             window.$message?.success(msg)
             getTableData().then()
@@ -152,15 +158,15 @@ const formModalLoading = ref(false)
 const formRef = ref(null)
 const formModel = ref({})
 const formRules = {
-    userId: [{required: true, message: '请选择员工', trigger: 'change'}],
-    endDate: [{required: true, message: '请选择离职日期', trigger: 'change'}],
-    leReasion: [{required: true, message: '请输入离职原因', trigger: 'blur'}],
+    userId: [{ required: true, message: '请选择员工', trigger: 'change' }],
+    endDate: [{ required: true, message: '请选择离职日期', trigger: 'change' }],
+    leReasion: [{ required: true, message: '请输入离职原因', trigger: 'blur' }],
 }
 
 //新增
 const addRowClick = () => {
     formModalLoading.value = false
-    formModel.value = {type: 3}
+    formModel.value = { type: 3 }
     formModal.value = true
 }
 
@@ -176,20 +182,20 @@ const uploadFileRef = ref(null)
 const uploadOptions = {
     headers: getTokenHeader(),
     multiple: false,
-    size: 50
+    size: 50,
 }
 
 //上传文件
 const formItemUpload = () => {
-    uploadFileRef.value?.selectFile();
+    uploadFileRef.value?.selectFile()
 }
 
 // 文件上传成功的回调
-const uploadFileSuccess = ({resData}) => {
+const uploadFileSuccess = ({ resData }) => {
     const { pdfUrl, originalName } = getObjValue(resData)
     formModel.value.fileUrl = pdfUrl
     formModel.value.conFileName = originalName
-    uploadFileRef.value?.setModalShow(false);
+    uploadFileRef.value?.setModalShow(false)
 }
 
 
@@ -202,9 +208,9 @@ const formModalSave = async () => {
         return false
     }
     //发起请求
-    const {error, code, msg} = await mainApi.submit({
+    const { error, code, msg } = await mainApi.submit({
         ...formModel.value,
-        type: 3 //合同类型
+        type: 3, //合同类型
     })
     //判断状态
     formModalLoading.value = false
@@ -224,7 +230,7 @@ const formModalClose = () => {
 }
 
 //查看pdf
-const viewPdf = ({fileUrl}) => {
+const viewPdf = ({ fileUrl }) => {
     if (fileUrl) {
         window.open(fileUrl, '_blank')
     } else {

+ 3 - 3
src/views/people/entry.vue

@@ -20,7 +20,7 @@
             </div>
         </template>
         <template #extra>
-            <el-button type="primary" size="large" @click="addRowClick">
+            <el-button v-auth-btn="['people-entry-add-btn']" type="primary" size="large" @click="addRowClick">
                 <HcIcon name="add" />
                 <span>新增</span>
             </el-button>
@@ -32,10 +32,10 @@
                 </div>
             </template>
             <template #action="{ row, index }">
-                <el-button type="primary" size="small" @click="editRowClick(row)">
+                <el-button v-auth-btn="['people-entry-edit-btn']" type="primary" size="small" @click="editRowClick(row)">
                     编辑
                 </el-button>
-                <el-button type="danger" size="small" @click="delRowClick(row)">
+                <el-button v-auth-btn="['people-entry-del-btn']" type="danger" size="small" @click="delRowClick(row)">
                     删除
                 </el-button>
             </template>

+ 53 - 52
src/views/people/salary.vue

@@ -7,55 +7,56 @@
                 </el-select>
             </div>
             <div class="w-36 ml-2">
-                <el-date-picker v-model="searchForm.month" class="block" size="large" type="month" format="YYYY-MM" value-format="YYYY-MM"/>
+                <el-date-picker v-model="searchForm.month" class="block" size="large" type="month" format="YYYY-MM" value-format="YYYY-MM" />
             </div>
             <div class="ml-4">
-                <el-button type="primary" @click="searchClick" size="large">
-                    <HcIcon name="search-2"/>
+                <el-button type="primary" size="large" @click="searchClick">
+                    <HcIcon name="search-2" />
                     <span>搜索</span>
                 </el-button>
             </div>
             <div class="ml-2">
                 <el-button size="large" @click="resetClick">
-                    <HcIcon name="close-circle"/>
+                    <HcIcon name="close-circle" />
                     <span>重置</span>
                 </el-button>
             </div>
         </template>
         <template #extra>
-            <el-button type="primary" @click="downloadXlsx" size="large">
-                <HcIcon name="download-2"/>
+            <el-button v-auth-btn="['people-salary-load']" type="primary" size="large" @click="downloadXlsx">
+                <HcIcon name="download-2" />
                 <span>下载模板</span>
             </el-button>
-            <el-button type="primary" @click="toImportTempClick" size="large" class="ml-2">
-                <HcIcon name="folder-upload"/>
+            <el-button v-auth-btn="['people-salary-import']" type="primary" size="large" class="ml-2" @click="toImportTempClick">
+                <HcIcon name="folder-upload" />
                 <span>导入数据</span>
             </el-button>
         </template>
-        <HcTable border :isIndex="false" :loading="tableLoading" :column="tableColumn" :datas="tableData"/>
+        <HcTable border :is-index="false" :loading="tableLoading" :column="tableColumn" :datas="tableData" />
         <template #action>
-            <HcPages :pages="searchForm" @change="pageChange"/>
+            <HcPages :pages="searchForm" @change="pageChange" />
         </template>
 
-        <!--导入数据弹窗-->
-        <HcDialog bgColor="#ffffff" widths="26rem" isToBody :show="importModal" title="导入数据"
-                  saveText="上传excel" @close="importModalClose" @save="importModalSave"
+        <!-- 导入数据弹窗 -->
+        <HcDialog
+            bg-color="#ffffff" widths="26rem" is-to-body :show="importModal" title="导入数据"
+            save-text="上传excel" @close="importModalClose" @save="importModalSave"
         >
             <div class="w-full">
-                <el-date-picker v-model="uploadParams.dateInfo" class="block" type="month" size="large" format="YYYY-MM" value-format="YYYY-MM"/>
+                <el-date-picker v-model="uploadParams.dateInfo" class="block" type="month" size="large" format="YYYY-MM" value-format="YYYY-MM" />
             </div>
         </HcDialog>
-        <!--上传控件-->
-        <HcUploadFile ref="uploadFileRef" :options="uploadOptions" :params="uploadParams" @success="uploadFileSuccess"/>
+        <!-- 上传控件 -->
+        <HcUploadFile ref="uploadFileRef" :options="uploadOptions" :params="uploadParams" @success="uploadFileSuccess" />
     </HcCard>
 </template>
 
 <script setup>
-import {onActivated, ref} from 'vue'
-import {getuserList} from "~api/other";
-import mainApi from "~api/people/salary";
-import {getTokenHeader} from "~src/api/request/header";
-import {downloadBlob, getArrValue} from "js-fast-way";
+import { onActivated, ref } from 'vue'
+import { getuserList } from '~api/other'
+import mainApi from '~api/people/salary'
+import { getTokenHeader } from '~src/api/request/header'
+import { downloadBlob, getArrValue } from 'js-fast-way'
 
 onActivated(() => {
     getuserListApi()
@@ -65,29 +66,29 @@ onActivated(() => {
 //获取用户下拉数据
 const userList = ref([])
 const getuserListApi = async () => {
-    const {data} = await getuserList()
+    const { data } = await getuserList()
     userList.value = getArrValue(data)
 }
 
 
 const searchForm = ref({
     userId: null, month: null,
-    current: 1, size: 20, total: 0
+    current: 1, size: 20, total: 0,
 })
 
 //搜索
 const searchClick = () => {
-    searchForm.value.current = 1;
+    searchForm.value.current = 1
     getTableData()
 }
 
 //重置搜索表单
 const resetClick = () => {
-    searchForm.value = {current: 1, size: 20, total: 0}
+    searchForm.value = { current: 1, size: 20, total: 0 }
 }
 
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
     getTableData()
@@ -96,34 +97,34 @@ const pageChange = ({current, size}) => {
 //表格参数
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'name', name: '姓名', width: 100, align: 'center'},
-    {key: 'yaAllDays', name: '应出勤天数', width: 100, align: 'center'},
-    {key: 'saAllDays', name: '实际出勤天数', width: 110, align: 'center'},
-    {key: 'yearDays', name: '年假', width: 80, align: 'center'},
-    {key: 'caLeaveDays', name: '调休假', width: 80, align: 'center'},
-    {key: 'sickLeaveDays', name: '病假', width: 80, align: 'center'},
-    {key: 'absenceDays', name: '事假', width: 80, align: 'center'},
-    {key: 'basicSalary', name: '基本工资', width: 100, align: 'center'},
-    {key: 'postSalary', name: '岗位工资', width: 100, align: 'center'},
-    {key: 'meritSalary', name: '绩效工资', width: 100, align: 'center'},
-    {key: 'bonusSalary', name: '奖励', width: 100, align: 'center'},
-    {key: 'mealWance', name: '伙食补贴', width: 100, align: 'center'},
-    {key: 'otherWance', name: '其他补贴', width: 100, align: 'center'},
-    {key: 'attendDuction', name: '考勤扣款', width: 100, align: 'center'},
-    {key: 'absDuction', name: '事假扣款', width: 100, align: 'center'},
-    {key: 'otherDuction', name: '其他扣款', width: 100, align: 'center'},
-    {key: 'grossPay', name: '应发工资', width: 100, align: 'center'},
-    {key: 'personalTax', name: '代扣个人应交社保', width: 140, align: 'center'},
-    {key: 'socialSec', name: '代扣代缴个税', width: 120, align: 'center'},
-    {key: 'netSalary', name: '实发工资', width: 100, align: 'center'},
-    {key: 'desc', name: '备注', minWidth: 140, align: 'center'},
+    { key: 'name', name: '姓名', width: 100, align: 'center' },
+    { key: 'yaAllDays', name: '应出勤天数', width: 100, align: 'center' },
+    { key: 'saAllDays', name: '实际出勤天数', width: 110, align: 'center' },
+    { key: 'yearDays', name: '年假', width: 80, align: 'center' },
+    { key: 'caLeaveDays', name: '调休假', width: 80, align: 'center' },
+    { key: 'sickLeaveDays', name: '病假', width: 80, align: 'center' },
+    { key: 'absenceDays', name: '事假', width: 80, align: 'center' },
+    { key: 'basicSalary', name: '基本工资', width: 100, align: 'center' },
+    { key: 'postSalary', name: '岗位工资', width: 100, align: 'center' },
+    { key: 'meritSalary', name: '绩效工资', width: 100, align: 'center' },
+    { key: 'bonusSalary', name: '奖励', width: 100, align: 'center' },
+    { key: 'mealWance', name: '伙食补贴', width: 100, align: 'center' },
+    { key: 'otherWance', name: '其他补贴', width: 100, align: 'center' },
+    { key: 'attendDuction', name: '考勤扣款', width: 100, align: 'center' },
+    { key: 'absDuction', name: '事假扣款', width: 100, align: 'center' },
+    { key: 'otherDuction', name: '其他扣款', width: 100, align: 'center' },
+    { key: 'grossPay', name: '应发工资', width: 100, align: 'center' },
+    { key: 'personalTax', name: '代扣个人应交社保', width: 140, align: 'center' },
+    { key: 'socialSec', name: '代扣代缴个税', width: 120, align: 'center' },
+    { key: 'netSalary', name: '实发工资', width: 100, align: 'center' },
+    { key: 'desc', name: '备注', minWidth: 140, align: 'center' },
 ]
 
 //获取表格数据
 const tableData = ref([])
 const getTableData = async () => {
     tableLoading.value = true
-    const {data} = await mainApi.page(searchForm.value)
+    const { data } = await mainApi.page(searchForm.value)
     tableData.value = getArrValue(data['records'])
     searchForm.value.total = data['total'] || 0
     tableLoading.value = false
@@ -131,7 +132,7 @@ const getTableData = async () => {
 
 //下载模板
 const downloadXlsx = async () => {
-    const {error, disposition, res} = await mainApi.exportTemplate()
+    const { error, disposition, res } = await mainApi.exportTemplate()
     if (!error && disposition) {
         downloadBlob(res, disposition)
     } else {
@@ -147,13 +148,13 @@ const uploadTime = ref(null)
 //上传配置
 const uploadFileRef = ref(null)
 const uploadParams = ref({
-    dateInfo: null
+    dateInfo: null,
 })
 const uploadOptions = {
     url: '/api/blade-control/userpayinfo/import-userpay',
     headers: getTokenHeader(),
     multiple: false,
-    size: 50
+    size: 50,
 }
 
 //打开导入数据弹窗
@@ -164,7 +165,7 @@ const toImportTempClick = () => {
 
 //导入数据弹窗保存
 const importModalSave = () => {
-    if(uploadParams.value.dateInfo) {
+    if (uploadParams.value.dateInfo) {
         uploadFileRef.value?.selectFile()
     } else {
         window.$message?.error('请先选择月份')

+ 16 - 24
src/views/program/annual/form.vue

@@ -56,7 +56,7 @@
                 <el-tab-pane label="年度预算收入">
                     <HcTable :is-index="false" :column="tableColumn" :datas="incomeTable">
                         <template #projectId="{ row, index }">
-                            <el-select v-model="row.projectId">
+                            <el-select v-model="row.projectId" style="width: 100%;">
                                 <el-option v-for="item in projectData" :label="item.name" :value="item.id" />
                             </el-select>
                         </template>
@@ -66,7 +66,7 @@
                             </el-select>
                         </template>
                         <template #projectTypeValue="{ row, index }">
-                            <el-input v-model="row.projectTypeValue" disabled :getdata="getprojectType(row)" />
+                            <el-input v-model="row.projectTypeValue" disabled />
                         </template>
                         <template #contractTypeValue="{ row, index }">
                             <el-input v-model="row.contractTypeValue" disabled :getdata="getprojectType(row)" />
@@ -81,11 +81,11 @@
                             <el-input v-model="row.predictAnnualReturned" onkeyup="this.value=this.value.match(/\d+\.?\d{0,2}/)" />
                         </template>
                         <template #action="{ row, index }">
-                            <el-button size="small" type="primary" @click="addRow">
+                            <el-button size="small" type="primary" @click="addRow(row, index)">
                                 <HcIcon name="add" />
                                 <span>新增</span>
                             </el-button>
-                            <el-button size="small" type="danger" @click="delRow(index)">
+                            <el-button size="small" type="danger" @click="delRow(row, index)">
                                 <HcIcon name="delete-bin" />
                                 <span>删除</span>
                             </el-button>
@@ -141,7 +141,7 @@
                             <el-input v-model="row.december" onkeyup="this.value=this.value.match(/\d+\.?\d{0,2}/)" />
                         </template>
                         <template #action="{ row, index }">
-                            <el-button size="small" type="primary" @click="addRow1">
+                            <el-button size="small" type="primary" @click="addRow1(row, index)">
                                 <HcIcon name="add" />
                                 <span>新增</span>
                             </el-button>
@@ -268,23 +268,13 @@ const getBudgetTypeList = async ()=>{
 }
 const secondBudgetTypeList = ref({})
 const getsecondBudgetTypeList = async (val, index)=>{
-    let id = ''
     budgetTypeList.value.forEach((ele)=>{
         if (ele.dictValue === val) {
-            id = ele.id
+            secondBudgetTypeList.value[index] = ele.children
         }
     })
-    if (id.length > 0) {
-        const { error, code, data } = await costApi.getChlidList({ parentId:id, type:1 })
-        if (!error && code === 200) {
-            secondBudgetTypeList.value[index] = getArrValue(data)
-        } else {
-            secondBudgetTypeList.value[index] = []
-           
-        }
-    }
-   
-}
+
+ }
 
 
 //设置表单tabs样式
@@ -348,20 +338,22 @@ const changeTab = (val)=>{
 const tableData = ref([
     { id: 1 }, { id: 2 },
 ])
-const addRow = ()=>{
-    incomeTable.value.push({})
+const addRow = (row, index)=>{
+    // incomeTable.value.push({})
+    incomeTable.value.splice(index + 1, 0, {})
 }
-const delRow = (index)=>{
+const delRow = (row, index)=>{
     incomeTable.value.splice(index, 1)
    if (incomeTable.value.length == 0) {
         incomeTable.value.push({})
     }
  
 }
-const addRow1 = ()=>{
-    costTable.value.push({})
+const addRow1 = (row, index)=>{
+    // costTable.value.push({})
+    costTable.value.splice(index + 1, 0, {})
 }
-const delRow1 = (index)=>{
+const delRow1 = (row, index)=>{
     costTable.value.splice(index, 1)
     if (costTable.value.length == 0) {
         costTable.value.push({})

+ 48 - 44
src/views/program/annual/index.vue

@@ -8,37 +8,41 @@
             </div>
         </template> -->
         <template #extra>
-            <el-button size="large" type="primary" hc-btn @click="addRowClick">
-                <HcIcon name="add"/>
+            <el-button v-auth-btn="['program_annual_add_btn']" size="large" type="primary" hc-btn @click="addRowClick">
+                <HcIcon name="add" />
                 <span>新增经营预算</span>
             </el-button>
         </template>
         <HcTable :column="tableColumn" :datas="tableData" :loading="tableLoading">
-            <template #name="{row}">
-                <span class="text-blue text-hover" @click="rowNameClick(row)">{{row.name}}</span>
+            <template #name="{ row }">
+                <span class="text-blue text-hover" @click="rowNameClick(row)">{{ row.name }}</span>
             </template>
-            <template #key2="{row}">
-                <span >{{row.budgetStartTime?row.budgetStartTime:''}}</span>
-                <span  v-if="row.budgetEndTime">~</span>
-                <span >{{row.budgetEndTime?row.budgetEndTime:''}}</span>
+            <template #key2="{ row }">
+                <span>{{ row.budgetStartTime ? row.budgetStartTime : '' }}</span>
+                <span v-if="row.budgetEndTime">~</span>
+                <span>{{ row.budgetEndTime ? row.budgetEndTime : '' }}</span>
             </template>
-            <template #action="{row,index}">
-                <el-button plain size="small" type="primary" @click="editRowClick(row)">编辑</el-button>
-                <el-button plain size="small" type="danger" @click="rowCancel(row)">删除</el-button>
+            <template #action="{ row, index }">
+                <el-button v-auth-btn="['program_annual_edit_btn']" plain size="small" type="primary" @click="editRowClick(row)">
+                    编辑
+                </el-button>
+                <el-button v-auth-btn="['program_annual_del_btn']" plain size="small" type="danger" @click="rowCancel(row)">
+                    删除
+                </el-button>
             </template>
         </HcTable>
         <template #action>
-            <HcPages :pages="searchForm" @change="pageChange"/>
+            <HcPages :pages="searchForm" @change="pageChange" />
         </template>
     </HcCard>
 </template>
 
 <script setup>
-import {ref,onMounted,onActivated} from "vue";
-import annualApi from '~api/program/annual.js';
-import {getArrValue} from "js-fast-way"
-import {delMessage} from "~uti/tools";
-import {useRouter, useRoute} from 'vue-router'
+import { onActivated, onMounted, ref } from 'vue'
+import annualApi from '~api/program/annual.js'
+import { getArrValue } from 'js-fast-way'
+import { delMessage } from '~uti/tools'
+import { useRoute, useRouter } from 'vue-router'
 
 const router = useRouter()
 
@@ -52,18 +56,18 @@ onActivated(()=>{
 })
 //计划类型
 const planType = ref([
-    {name: '临时计划', key: '1'},
-    {name: '月度计划', key: '2'},
-    {name: '年度计划', key: '3'},
+    { name: '临时计划', key: '1' },
+    { name: '月度计划', key: '2' },
+    { name: '年度计划', key: '3' },
 ])
 
 //搜索表单
 const searchForm = ref({
-    planType: null, current: 1, size: 20, total: 0
+    planType: null, current: 1, size: 20, total: 0,
 })
 
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
     getTableData()
@@ -72,25 +76,25 @@ const pageChange = ({current, size}) => {
 //获取数据
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'name', name: '预算名称'},
-    {key: 'key2', name: '起止日期', width: '220', align: 'center'},
-    {key: 'totalBudget', name: '总经营预算', width: '120', align: 'center'},
-    {key: 'annualContractTarget', name: '年度合同额指标', width: '140', align: 'center'},
-    {key: 'annualProfitTarget', name: '年度利润指标', width: '120', align: 'center'},
-    {key: 'staffCost', name: '工资支出', width: '120', align: 'center'},
-    {key: 'manageDisburse', name: '其他管理支出', width: '120', align: 'center'},
-    {key: 'action', name: '操作', width: '150', align: 'center'},
+    { key: 'name', name: '预算名称' },
+    { key: 'key2', name: '起止日期', width: '220', align: 'center' },
+    { key: 'totalBudget', name: '总经营预算', width: '120', align: 'center' },
+    { key: 'annualContractTarget', name: '年度合同额指标', width: '140', align: 'center' },
+    { key: 'annualProfitTarget', name: '年度利润指标', width: '120', align: 'center' },
+    { key: 'staffCost', name: '工资支出', width: '120', align: 'center' },
+    { key: 'manageDisburse', name: '其他管理支出', width: '120', align: 'center' },
+    { key: 'action', name: '操作', width: '150', align: 'center' },
 ]
 const tableData = ref([
-    {id: 1, key1: '2023年5月度计划', key2: '2022-07-01~2027-04-12', key3: '111',  key4: '36', key5: '30', key6: '6', key7: '张三'},
-    {id: 2, key1: '2023年5月度计划', key2: '2022-07-01~2027-04-12', key3: '111',  key4: '36', key5: '30', key6: '6', key7: '张三'},
-    {id: 3, key1: '2023年5月度计划', key2: '2022-07-01~2027-04-12', key3: '111',  key4: '36', key5: '30', key6: '6', key7: '张三'},
-    {id: 4, key1: '2023年5月度计划', key2: '2022-07-01~2027-04-12', key3: '111',  key4: '36', key5: '30', key6: '6', key7: '张三'},
+    { id: 1, key1: '2023年5月度计划', key2: '2022-07-01~2027-04-12', key3: '111', key4: '36', key5: '30', key6: '6', key7: '张三' },
+    { id: 2, key1: '2023年5月度计划', key2: '2022-07-01~2027-04-12', key3: '111', key4: '36', key5: '30', key6: '6', key7: '张三' },
+    { id: 3, key1: '2023年5月度计划', key2: '2022-07-01~2027-04-12', key3: '111', key4: '36', key5: '30', key6: '6', key7: '张三' },
+    { id: 4, key1: '2023年5月度计划', key2: '2022-07-01~2027-04-12', key3: '111', key4: '36', key5: '30', key6: '6', key7: '张三' },
 ])
 
-const getTableData = async() => {
+const getTableData = async () => {
     tableLoading.value = true
-    const {error, code, data} = await annualApi.getPage(searchForm.value)
+    const { error, code, data } = await annualApi.getPage(searchForm.value)
     tableLoading.value = false
     if (!error && code === 200) {
         tableData.value = getArrValue(data['records'])
@@ -107,8 +111,8 @@ const rowNameClick = (row) => {
         name: 'program-annual-view',
         query: {
             id: row.id,
-            name:row.name
-        }
+            name:row.name,
+        },
     })
 }
 
@@ -117,8 +121,8 @@ const addRowClick = () => {
     router.push({
         name: 'program-annual-form',
         query:{
-            type:'add'
-        }
+            type:'add',
+        },
     })
 }
 
@@ -128,15 +132,15 @@ const editRowClick = (row) => {
         name: 'program-annual-form',
         query: {
             id: row.id,
-            type:'edit'
-        }
+            type:'edit',
+        },
     })
 }
 //删除
 const rowCancel = (row) => {
     delMessage(async () => {
-        const {error, code, msg} = await annualApi.deleteAnnualBudget({
-            id: row.id
+        const { error, code, msg } = await annualApi.deleteAnnualBudget({
+            id: row.id,
         })
         //判断状态
         if (!error && code === 200) {

+ 5 - 3
src/views/program/project/form.vue

@@ -27,7 +27,7 @@
                 </el-radio-group>
             </div>
         </template>
-        <HcTable :is-index="false" :column="tableColumn" :datas="tableData" :row-style="tableRowStyle" has-children="hasChildren1" children="childrenList">
+        <HcTable :is-index="false" :column="tableColumn" :datas="tableData" :row-style="tableRowStyle" has-children="hasChildren1" children="childrenList" :loading="tableLoading">
             <template #projectProcessValue="{ row }">
                 <template v-if="row.taskFinishedStatus === 1">
                     <el-popover placement="top-start" title="" :width="200" :hide-after="0" :content="row?.outMoneyTips">
@@ -290,7 +290,7 @@
             </template>
             <HcTable :is-index="false" :column="tableSubplanColumn" :datas="tableSubplanData">
                 <template #planTaskType="{ row }">
-                    <el-select v-model="row.planTaskType" clearable :disabled="row?.isShowDelete === 0 || row?.iscanSelect " @change="changePlanTaskType($event, row)">
+                    <el-select v-model="row.planTaskType" :disabled="row?.isShowDelete === 0 || row?.iscanSelect " @change="changePlanTaskType($event, row)">
                         <el-option v-for="item in taskTypeList" :key="item.id" :label="item.dictName" :value="item.id" />
                     </el-select>
                 </template>
@@ -373,7 +373,9 @@ const buildData = ref([])
 const supervisorUnitData = ref([])
 //获取详情
 const getPlanByProjectId = async ()=>{
+    tableLoading.value = true
     const { error, code, data } = await projectApi.getPlanByProjectId({ id: dataId.value })
+    tableLoading.value = false
     if (!error && code === 200) {
         const res = getObjValue(data)
         console.log(res, '详情')
@@ -486,7 +488,7 @@ const tableColumn = [
     { key: 'action', name: '操作', width: '280', align: 'center', fixed: 'right' },
 ]
 const tableData = ref([])
-
+const tableLoading = ref(false)
 //表格行样式
 const tableRowStyle = ({ row }) => {
     if (row.taskFinishedStatus === 1) {

+ 29 - 16
src/views/program/project/index.vue

@@ -2,17 +2,17 @@
     <HcCard>
         <template #header>
             <div class="w-36">
-                <el-select v-model="searchForm.projectType" block clearable placeholder="项目类型" size="large">
-                    <el-option v-for="item in planType" :label="item.name" :value="item.key" />
+                <el-select v-model="searchForm.projectType" block clearable placeholder="项目类型">
+                    <el-option v-for="item in projectType" :key="item.dictValue" :label="item.dictName" :value="item.dictValue" />
                 </el-select>
             </div>
             <div class="w-36 ml-2">
                 <el-select v-model="searchForm.projectServerType" block clearable placeholder="服务类型" size="large">
-                    <el-option v-for="item in department" :label="item.name" :value="item.key" />
+                    <el-option v-for="item in department" :key="item.dictValue" :label="item.dictName" :value="item.dictValue" />
                 </el-select>
             </div>
             <div class="w-56 ml-2">
-                <el-input v-model="searchForm.name" clearable placeholder="请输入项目名称查询" size="large" @keyup="keyUpEvent" />
+                <el-input v-model="searchForm.queryValue" clearable placeholder="请输入项目名称查询" size="large" @keyup="keyUpEvent" />
             </div>
             <div class="ml-4">
                 <el-button size="large" type="primary" @click="searchClick">
@@ -42,27 +42,39 @@
 import { useRouter } from 'vue-router'
 import { onActivated, onMounted, ref } from 'vue'
 import projectApi from '~api/program/project.js'
+import projectApi1 from '~api/project/project-list.js'
 import { getArrValue } from 'js-fast-way'
 
 const router = useRouter()
 onActivated(()=>{
     getTableData()
+    getProjectServerTypeDict()
+    getProjectType()
 
 })
-//计划类型
-const planType = ref([
-    { name: '临时计划', key: '1' },
-    { name: '月度计划', key: '2' },
-    { name: '年度计划', key: '3' },
-])
 
-//选择部门
-const department = ref([
-    { name: '研发部门', key: '1' },
-    { name: '业务部门', key: '2' },
-    { name: '人事部门', key: '3' },
-])
 
+//选择
+const department = ref([])
+//获取项目服务类型
+const getProjectServerTypeDict = async ()=>{
+    const { error, code, data } = await projectApi1.getProjectServerTypeDict()
+    if (!error && code === 200) {
+        department.value = getArrValue(data)
+    } else {
+        department.value = []
+    }
+}
+const projectType = ref([])
+//获取项目类型
+const getProjectType = async ()=>{
+    const { error, code, data } = await projectApi1.getProjectTypeDict()
+    if (!error && code === 200) {
+        projectType.value = getArrValue(data)
+    } else {
+        projectType.value = []
+    }
+}
 //搜索表单
 const searchForm = ref({
 
@@ -86,6 +98,7 @@ const searchClick = () => {
 //重置搜索表单
 const resetClick = () => {
     searchForm.value = { current: 1, size: 20, total: 0 }
+    getTableData()
 }
 
 //分页被点击

+ 82 - 76
src/views/program/section/index.vue

@@ -3,88 +3,94 @@
         <template #header>
             <div class="w-36">
                 <el-select v-model="searchForm.departmentType" block clearable placeholder="选择部门" size="large">
-                    <el-option v-for="item in department" :label="item.deptName" :value="item.deptCategory"/>
+                    <el-option v-for="item in department" :label="item.deptName" :value="item.deptCategory" />
                 </el-select>
             </div>
             <div class="w-36 ml-4">
-                <el-date-picker class="block" v-model="searchForm.planStartDate" type="month" value-format="YYYY-MM" placeholder="开始日期" clearable size="large"/>
+                <el-date-picker v-model="searchForm.planStartDate" class="block" type="month" value-format="YYYY-MM" placeholder="开始日期" clearable size="large" />
+            </div>
+            <div class="mx-2">
+                ~
             </div>
-            <div class="mx-2">~</div>
             <div class="w-36">
-                <el-date-picker class="block" v-model="searchForm.planEndDate" type="month" value-format="YYYY-MM" placeholder="结束日期" clearable size="large"/>
+                <el-date-picker v-model="searchForm.planEndDate" class="block" type="month" value-format="YYYY-MM" placeholder="结束日期" clearable size="large" />
             </div>
             <div class="ml-4">
                 <el-button size="large" type="primary" @click="searchClick">
-                    <HcIcon name="search-2"/>
+                    <HcIcon name="search-2" />
                     <span>搜索</span>
                 </el-button>
             </div>
             <div class="ml-2">
                 <el-button size="large" @click="resetClick">
-                    <HcIcon name="close-circle"/>
+                    <HcIcon name="close-circle" />
                     <span>重置</span>
                 </el-button>
             </div>
         </template>
         <template #extra>
-            <el-button size="large" type="primary" hc-btn @click="addRowClick">
-                <HcIcon name="add"/>
+            <el-button v-auth-btn="['program_section_add_btn']" size="large" type="primary" hc-btn @click="addRowClick">
+                <HcIcon name="add" />
                 <span>新增预算计划</span>
             </el-button>
         </template>
         <HcTable :column="tableColumn" :datas="tableData" :loading="tableLoading">
-            <template #planName="{row}">
-                <span class="text-blue" @click="rowNameClick(row)">{{row.planName}}</span>
+            <template #planName="{ row }">
+                <span class="text-blue" @click="rowNameClick(row)">{{ row.planName }}</span>
             </template>
-            <template #key2="{row}">
-                <span >{{row.planStartDate?row.planStartDate:''}}</span>
-                <span  v-if="row.planStartDate">~</span>
-                <span >{{row.planEndDate?row.planEndDate:''}}</span>
+            <template #key2="{ row }">
+                <span>{{ row.planStartDate ? row.planStartDate : '' }}</span>
+                <span v-if="row.planStartDate">~</span>
+                <span>{{ row.planEndDate ? row.planEndDate : '' }}</span>
             </template>
-            <template #planTotal="{row}">
-                <span>{{row.planTotal}}条</span>
+            <template #planTotal="{ row }">
+                <span>{{ row.planTotal }}条</span>
             </template>
-            <template #finishPlanTotal="{row}">
-                <span>{{row.finishPlanTotal}}条</span>
+            <template #finishPlanTotal="{ row }">
+                <span>{{ row.finishPlanTotal }}条</span>
             </template>
-            <template #beginPlanTotal="{row}">
-                <span>{{row.beginPlanTotal}}条</span>
+            <template #beginPlanTotal="{ row }">
+                <span>{{ row.beginPlanTotal }}条</span>
             </template>
-            <template #action="{row,index}">
-                <el-button size="small" type="primary" @click="editRowClick(row)">编辑</el-button>
-                <el-button size="small" type="danger" @click="delRowClick(row)">删除</el-button>
+            <template #action="{ row, index }">
+                <el-button v-auth-btn="['program_section_edit_btn']" size="small" type="primary" @click="editRowClick(row)">
+                    编辑
+                </el-button>
+                <el-button v-auth-btn="['program_section_del_btn']" size="small" type="danger" @click="delRowClick(row)">
+                    删除
+                </el-button>
             </template>
         </HcTable>
         <template #action>
-            <HcPages :pages="searchForm" @change="pageChange"/>
+            <HcPages :pages="searchForm" @change="pageChange" />
         </template>
 
-        <!--选择计划所属月份-->
-        <HcDialog bgColor="#ffffff" isToBody title="选择计划所属月份" widths="26rem" saveText="确认"
-                  :show="monthModal" @close="monthCloseClick" @save="monthSaveClick"
+        <!-- 选择计划所属月份 -->
+        <HcDialog
+            bg-color="#ffffff" is-to-body title="选择计划所属月份" widths="26rem" save-text="确认"
+            :show="monthModal" @close="monthCloseClick" @save="monthSaveClick"
         >
             <el-form ref="formMonthRef" label-position="top" size="large" :model="formMonthModel" :rules="formMonthRules">
                 <el-form-item label="选择部门" prop="section">
-                    <el-select v-model="formMonthModel.section" block placeholder="选择部门"  @change="changeDpt">
-                        <el-option v-for="item in department" :label="item.deptName" :value="item.deptCategory"/>
+                    <el-select v-model="formMonthModel.section" block placeholder="选择部门" @change="changeDpt">
+                        <el-option v-for="item in department" :label="item.deptName" :value="item.deptCategory" />
                     </el-select>
                 </el-form-item>
                 <el-form-item label="选择月份" prop="month">
-                    <el-date-picker type="month" class="block" v-model="formMonthModel.month" format="YYYY-MM" value-format="YYYY-MM"/>
+                    <el-date-picker v-model="formMonthModel.month" type="month" class="block" format="YYYY-MM" value-format="YYYY-MM" />
                 </el-form-item>
             </el-form>
         </HcDialog>
-
     </HcCard>
 </template>
 
 <script setup>
-import {ref,onMounted,onActivated,watch} from "vue";
-import {useRouter} from 'vue-router'
-import sectionApi from '~api/program/section.js';
-import {getArrValue,getObjValue,formValidate} from "js-fast-way"
-import { getdepartmentList} from "~api/other";
-import {delMessage} from "~uti/tools";
+import { onActivated, onMounted, ref, watch } from 'vue'
+import { useRouter } from 'vue-router'
+import sectionApi from '~api/program/section.js'
+import { formValidate, getArrValue, getObjValue } from 'js-fast-way'
+import { getdepartmentList } from '~api/other'
+import { delMessage } from '~uti/tools'
 
 const router = useRouter()
 onActivated(()=>{
@@ -100,22 +106,22 @@ const department = ref([
 //搜索表单
 const searchForm = ref({
     planType: null, planStartDate: null, planEndDate: null, departmentType: null,
-    current: 1, size: 20, total: 0
+    current: 1, size: 20, total: 0,
 })
 
 //搜索
 const searchClick = () => {
-    searchForm.value.current = 1;
+    searchForm.value.current = 1
     getTableData()
 }
 
 //重置搜索表单
 const resetClick = () => {
-    searchForm.value = {current: 1, size: 20, total: 0}
+    searchForm.value = { current: 1, size: 20, total: 0 }
 }
 
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
     getTableData()
@@ -124,23 +130,23 @@ const pageChange = ({current, size}) => {
 //获取数据
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'planName', name: '计划名称'},
-    {key: 'key2', name: '计划起止日期', width: '220', align: 'center'},
-    {key: 'planTotal', name: '计划数量', width: '120', align: 'center'},
-    {key: 'finishPlanTotal', name: '已完成计划', width: '120', align: 'center'},
-    {key: 'beginPlanTotal', name: '未完成计划', width: '120', align: 'center'},
-    {key: 'planDesignerName', name: '计划制定人', width: '120', align: 'center'},
-    {key: 'action', name: '操作', width: '160', align: 'center'},
+    { key: 'planName', name: '计划名称' },
+    { key: 'key2', name: '计划起止日期', width: '220', align: 'center' },
+    { key: 'planTotal', name: '计划数量', width: '120', align: 'center' },
+    { key: 'finishPlanTotal', name: '已完成计划', width: '120', align: 'center' },
+    { key: 'beginPlanTotal', name: '未完成计划', width: '120', align: 'center' },
+    { key: 'planDesignerName', name: '计划制定人', width: '120', align: 'center' },
+    { key: 'action', name: '操作', width: '160', align: 'center' },
 ]
 const tableData = ref([
-    {id: 1, key1: '2023年5月度计划', key2: '2022-07-01~2027-04-12', key3: '36', key4: '30', key5: '6', key6: '张三'},
-    {id: 2, key1: '2023年5月度计划', key2: '2022-07-01~2027-04-12', key3: '36', key4: '30', key5: '6', key6: '张三'},
-    {id: 3, key1: '2023年5月度计划', key2: '2022-07-01~2027-04-12', key3: '36', key4: '30', key5: '6', key6: '张三'},
+    { id: 1, key1: '2023年5月度计划', key2: '2022-07-01~2027-04-12', key3: '36', key4: '30', key5: '6', key6: '张三' },
+    { id: 2, key1: '2023年5月度计划', key2: '2022-07-01~2027-04-12', key3: '36', key4: '30', key5: '6', key6: '张三' },
+    { id: 3, key1: '2023年5月度计划', key2: '2022-07-01~2027-04-12', key3: '36', key4: '30', key5: '6', key6: '张三' },
 ])
 
-const getTableData = async() => {
+const getTableData = async () => {
     tableLoading.value = true
-    const {error, code, data} = await sectionApi.getPage(searchForm.value)
+    const { error, code, data } = await sectionApi.getPage(searchForm.value)
     tableLoading.value = false
     if (!error && code === 200) {
         tableData.value = getArrValue(data)
@@ -162,8 +168,8 @@ const addRowClick = () => {
    
 }
 //获取所属部门列表
-const getDepartmentDict=async()=>{
-    const {error, code, data} = await getdepartmentList({deptType:2})
+const getDepartmentDict = async ()=>{
+    const { error, code, data } = await getdepartmentList({ deptType:2 })
     if (!error && code === 200) {
         department.value = getArrValue(data)
 
@@ -179,50 +185,50 @@ const monthModal = ref(false)
 //选择月份的表单数据
 const formMonthRef = ref(null)
 const formMonthModel = ref({
-    section: null, month: null
+    section: null, month: null,
 })
 const formMonthRules = {
-    section: [{required: true, message: '请选择部门', trigger: 'blur'}],
-    month: [{required: true, message: '请选择月份', trigger: 'blur'}],
+    section: [{ required: true, message: '请选择部门', trigger: 'blur' }],
+    month: [{ required: true, message: '请选择月份', trigger: 'blur' }],
 }
 
 const monthCloseClick = () => {
     monthModal.value = false
 }
 //选择部门
-const deptId=ref('')
-const changeDpt=(val)=>{
-    console.log(val,'val');
+const deptId = ref('')
+const changeDpt = (val)=>{
+    console.log(val, 'val')
     department.value.forEach((ele)=>{
-        if(ele.deptCategory===val){
-            deptId.value=ele.id
+        if (ele.deptCategory === val) {
+            deptId.value = ele.id
         }
     })
-    console.log(deptId.value,'deptId.value');
+    console.log(deptId.value, 'deptId.value')
 }
 //新增部门月计划
-const addPlan=async(obj)=>{
-    const {error, code, data,msg} = await sectionApi.addDepartmentPlan( {
+const addPlan = async (obj)=>{
+    const { error, code, data, msg } = await sectionApi.addDepartmentPlan( {
         planDate:obj.month,
         departmentType:obj.section,
-        deptId:deptId.value
+        deptId:deptId.value,
     })
     if (!error && code === 200) {
        window.$message.success(msg)
         monthModal.value = false
-        changeDpt(formMonthModel.section)
+        changeDpt(formMonthModel.value.section)
         router.push({
             name: 'program-section-form',
-            query: {...formMonthModel.value,type:'add',deptId:deptId.value},
+            query: { ...formMonthModel.value, type:'add', deptId:deptId.value },
     
         })
     } 
 
 }
 //确认下一步
-const monthSaveClick =async() => {
+const monthSaveClick = async () => {
     const res = await formValidate(formMonthRef.value)
-    if(res){
+    if (res) {
         addPlan(formMonthModel.value)
     }
     monthModal.value = false
@@ -239,15 +245,15 @@ const editRowClick = (row) => {
             month:row.planDate,
             section:row.departmentType,
             type:'edit',
-            deptId:deptId.value
-        }
+            deptId:deptId.value,
+        },
     })
 }
 
 //删除
-const delRowClick = async(row) => {
-    delMessage(async() => {
-        const {error, code, data,msg} = await sectionApi.deleteById({id:row.id})  
+const delRowClick = async (row) => {
+    delMessage(async () => {
+        const { error, code, data, msg } = await sectionApi.deleteById({ id:row.id })  
             if (!error && code === 200) {
                 window.$message.success(msg)
                 getTableData()

+ 6 - 0
src/views/project/contract/components/base.vue

@@ -73,6 +73,12 @@
                             <el-form-item label="纳税人识别号:">
                                 <el-input v-model="formBaseModel.taxpayerNumber" />
                             </el-form-item>
+                            <el-form-item label="单位地址">
+                                <el-input v-model="formBaseModel.unitAddr" />
+                            </el-form-item>
+                            <el-form-item label="单位电话">
+                                <el-input v-model="formBaseModel.unitPhone" />
+                            </el-form-item>
                             <el-form-item label="开户银行:">
                                 <el-input v-model="formBaseModel.openAccountBank" />
                             </el-form-item>

+ 4 - 4
src/views/project/contract/index.vue

@@ -18,11 +18,11 @@
             </div>
         </template>
         <template #extra>
-            <el-button size="large" type="primary" hc-btn @click="updateClick">
+            <el-button v-auth-btn="['project_contract_update_btn']" size="large" type="primary" hc-btn @click="updateClick">
                 <HcIcon name="refresh" />
                 <span>合同回款更新</span>
             </el-button>
-            <el-button size="large" type="primary" hc-btn @click="addRowClick">
+            <el-button v-auth-btn="['project_contract_add_btn']" size="large" type="primary" hc-btn @click="addRowClick">
                 <HcIcon name="add" />
                 <span>新增项目合同信息</span>
             </el-button>
@@ -36,10 +36,10 @@
                 <span>{{ `${row.startTime}~${row.endTime}` }}</span>
             </template>
             <template #action="{ row }">
-                <el-button plain size="small" type="primary" @click="editRowClick(row)">
+                <el-button v-auth-btn="['project_contract_edit_btn']" plain size="small" type="primary" @click="editRowClick(row)">
                     编辑
                 </el-button>
-                <el-button plain size="small" type="danger" @click="delRowClick(row)">
+                <el-button v-auth-btn="['project_contract_del_btn']" plain size="small" type="danger" @click="delRowClick(row)">
                     删除
                 </el-button>
             </template>

+ 33 - 22
src/views/project/cost/form.vue

@@ -50,7 +50,7 @@
                     <HcNewSwitch :datas="tabTab" :keys="tabKey" :round="false" @change="tabChange" />
                 </template>
               
-                <HcTable :is-index="false" :column="tableColumn" :datas="tableData">
+                <HcTable :is-index="false" :column="tableColumn" :datas="tableData" :loading="tableLoaing">
                     <template #deptId="{ row }">  
                         <el-select v-model="row.deptId" block placeholder="请选择" :disabled="!row.isEdit">
                             <el-option v-for="item in departMent" :key="item.id" :label="item.deptName" :value="item.id" />
@@ -66,13 +66,13 @@
                             <el-option v-for="item in processList" :key="item.id" :label="item.name" :value="item.id" />
                         </el-select>
                     </template>
-                    <template #budgetType="{ row }">
+                    <template #budgetType="{ row, index }">
                         <el-select v-model="row.budgetType" :disabled="!row.isEdit">
                             <el-option v-for="item in budgetTypeList" :key="item.dictValue" :label="item.dictName" :value="item.dictValue" />
                         </el-select>
                     </template>
                     <template #taskDetail="{ row, index }">
-                        <el-select v-model="row.taskDetail" :getdata="budgetTypeChange(row?.budgetType, index)" :disabled="!row.isEdit">
+                        <el-select v-model="row.taskDetail" :disabled="!row.isEdit" :getdata="changeBudgetType(row.budgetType, index)">
                             <el-option v-for="item in taskDetailList[index]" :key="item.dictValue" :label="item.dictName" :value="item.dictValue" />
                         </el-select>
                     </template>
@@ -116,7 +116,7 @@
                         <el-input v-model="row.key15" />
                     </template> 
                     <template #action="{ row, index }">
-                        <el-button size="small" type="primary" @click="addRow">
+                        <el-button size="small" type="primary" @click="addRow(row, index)">
                             <HcIcon name="add" />
                             <span>新增</span>
                         </el-button>
@@ -227,7 +227,7 @@ const getProcessList = async (projectId)=>{
 //获取预算分类getSecondSubject
 const budgetTypeList = ref([])
 const getBudgetTypeList = async ()=>{
-    const { error, code, data } = await costApi.getSecondSubject()
+    const { error, code, data } = await costApi.getSecondSubject2()
     if (!error && code === 200) {
         budgetTypeList.value = getArrValue(data)
      
@@ -238,23 +238,30 @@ const getBudgetTypeList = async ()=>{
 }
 //任务明细
 const taskDetailList = ref({})
-const budgetTypeChange = async (val, index)=>{
-    let id = ''
+// const budgetTypeChange = async (val, index)=>{
+//     let id = ''
+//     budgetTypeList.value.forEach((ele)=>{
+//         if (ele.dictValue === val) {
+//             id = ele.id
+//         }
+//     })
+//     if (id.length > 0) {
+//         const { error, code, data } = await costApi.getChlidList({ parentId:id, type:5 })
+//         if (!error && code === 200) {
+//             taskDetailList.value[index] = getArrValue(data)
+
+//         } else {
+//             taskDetailList.value[index] = {}
+//         }
+//     }
+   
+// }
+const changeBudgetType = (val, index)=>{
     budgetTypeList.value.forEach((ele)=>{
         if (ele.dictValue === val) {
-            id = ele.id
+            taskDetailList.value[index] = ele.children
         }
     })
-    if (id.length > 0) {
-        const { error, code, data } = await costApi.getChlidList({ parentId:id, type:1 })
-        if (!error && code === 200) {
-            taskDetailList.value[index] = getArrValue(data)
-
-        } else {
-            taskDetailList.value[index] = {}
-        }
-    }
-   
 }
 //获取岗位分类postTypeList
 const postTypeList = ref([])
@@ -282,9 +289,12 @@ const getdepartmentListData = async () => {
 const constructUnitData = ref([])
 const bulidUnitData = ref([])
 const supervisorUnitData = ref([])
+const tableLoaing = ref(false)
 //获取详情
 const getBudgetStatsById = async ()=>{
+    tableLoaing.value = true
     const { error, code, data } = await costApi.getBudgetStatsById({ id: dataId.value })
+    tableLoaing.value = false
     if (!error && code === 200) {
         formBaseModel.value = getObjValue(data)
         tableData.value = formBaseModel.value?.constructUnit || [{}]
@@ -394,10 +404,11 @@ const tableColumn = [
 
 
 
-const addRow = ()=>{
-    tableData.value.push({
-        isEdit:true,
-    })
+const addRow = (row, index)=>{
+    // tableData.value.push({
+    //     isEdit:true,
+    // })
+    tableData.value.splice(index + 1, 0, { isEdit:true })
 }
 const delRow = (index)=>{
     tableData.value.splice(index, 1)

+ 4 - 4
src/views/project/cost/index.vue

@@ -18,7 +18,7 @@
             </div>
         </template>
         <template #extra>
-            <el-button size="large" type="primary" hc-btn @click="addRowClick">
+            <el-button v-auth-btn="['project_cost_add_btn']" size="large" type="primary" hc-btn @click="addRowClick">
                 <HcIcon name="add" />
                 <span>新增项目成本测算</span>
             </el-button>
@@ -29,13 +29,13 @@
                 <span class="text-blue text-hover" @click="rowNameTap(row)">{{ row.projectName }}</span>
             </template>
             <template #action="{ row }">
-                <el-button plain size="small" type="success" :disabled="row?.approveStatus !== '1'" @click="approvalRowClick(row)">
+                <el-button v-auth-btn="['project_cost_ approval_btn']" plain size="small" type="success" :disabled="row?.approveStatus !== '1'" @click="approvalRowClick(row)">
                     提交审批
                 </el-button>
-                <el-button plain size="small" type="primary" @click="editRowClick(row)">
+                <el-button v-auth-btn="['project_cost_edit_btn']" plain size="small" type="primary" @click="editRowClick(row)">
                     编辑
                 </el-button>
-                <el-button plain size="small" type="danger" @click="delRowClick(row)">
+                <el-button v-auth-btn="['project_cost_del_btn']" plain size="small" type="danger" @click="delRowClick(row)">
                     删除
                 </el-button>
             </template>

+ 26 - 25
src/views/project/list/index.vue

@@ -12,8 +12,8 @@
                 </el-select>
             </div>
             <div class="w-36 ml-2">
-                <el-select v-model="searchForm.implementPrincipal" block clearable placeholder="实施负责人" size="large">
-                    <el-option v-for="item in projectUser" :key="item.id" :label="item.name" :value="item.id" />
+                <el-select v-model="searchForm.projectClass" block clearable placeholder="类别筛选" size="large">
+                    <el-option v-for="item in projectClassdata" :key="item.id" :label="item.dictName" :value="item.dictValue" />
                 </el-select>
             </div>
             <div class="w-36 ml-2 ">
@@ -45,7 +45,7 @@
             </div>
         </template>
         <template #extra>
-            <el-button size="large" type="primary" hc-btn @click="addRowClick">
+            <el-button v-auth-btn="['project_index_add_btn']" size="large" type="primary" hc-btn @click="addRowClick">
                 <HcIcon name="add" />
                 <span>新增项目信息</span>
             </el-button>
@@ -61,10 +61,10 @@
                 <span class="text-blue ">{{ row.endTime ? row.endTime : '' }}</span>
             </template>
             <template #action="{ row }">
-                <el-button plain size="small" type="primary" @click="editRowClick(row)">
+                <el-button v-auth-btn="['project_index_edit_btn']" plain size="small" type="primary" @click="editRowClick(row)">
                     编辑
                 </el-button>
-                <el-button plain size="small" type="danger" :loading="row.delLoad || false" @click="delRowClick(row)">
+                <el-button v-auth-btn="['project_index_del_btn']" plain size="small" type="danger" :loading="row.delLoad || false" @click="delRowClick(row)">
                     删除
                 </el-button>
             </template>
@@ -82,37 +82,45 @@ import { useRouter } from 'vue-router'
 import projectApi from '~api/project/project-list.js'
 import { getArrValue } from 'js-fast-way'
 import { delMessage } from '~uti/tools'
+import { getDictInfo } from '~api/other'
 
 const router = useRouter()
 onMounted(()=>{
-    getProjectType()
-    getProjectServerTypeDict()
-    getImplementUser()
+ 
 })
 onActivated(()=>{
+    getProjectType()
+    getProjectServerTypeDict()
+
+    getProjectClass()
     getTableData()
 })
 //项目类型
 const projectType = ref([
-    // {name: '二级路', key: '二级路'},
-    // {name: '国道', key: '国道'},
-    // {name: '水利水电', key: '水利水电'},
-    // {name: '市政', key: '市政'},
+
 ])
 
 //项目服务类型
 const serverType = ref([])
 
-//实施负责人
-const projectUser = ref([
+//类别
+const projectClassdata = ref([
    
 ])
 
-
+//获取项目类别
+const getProjectClass = async ()=>{
+    const { error, code, data } = await getDictInfo('project_class')
+    if (!error && code === 200) {
+        projectClassdata.value = getArrValue(data)
+    } else {
+        projectClassdata.value = []
+    }
+}
 
 //搜索表单
 const searchForm = ref({
-    projectType: null, contractType: null, projectUser: null, date: null, queryValue: '',
+    projectType: null, contractType: null, projectClass: null, date: null, queryValue: '',
     current: 1, size: 20, total: 0,
 })
 
@@ -149,6 +157,7 @@ const tableLoading = ref(false)
 const tableColumn = [
     { key: 'number', name: '编号', width: '100', align: 'center' },
     { key: 'name', name: '项目名称', minWidth: '260' },
+    { key: 'projectClassValue', name: '类别', width: '120' },
     { key: 'constructUnit', name: '客户单位', width: '200', align: 'center' },
     { key: 'projectTypeValue', name: '项目类型', width: '140', align: 'center' },
     { key: 'projectServerTypeValue', name: '服务类型', width: '140', align: 'center' },
@@ -194,15 +203,7 @@ const getProjectServerTypeDict = async ()=>{
         serverType.value = []
     }
 }
-//获取实施负责人
-const getImplementUser = async ()=>{
-    const { error, code, data } = await projectApi.getImplementUser()
-    if (!error && code === 200) {
-        projectUser.value = getArrValue(data)
-    } else {
-        projectUser.value = []
-    }
-}
+
 //查看
 const rowClick = (row) => {
     router.push({

+ 43 - 10
src/views/project/list/list-info.vue

@@ -12,13 +12,18 @@
                                 <el-form-item label="建设单位:" prop="constructUnit">
                                     <el-input v-model="formModel.constructUnit" />
                                 </el-form-item>
+                                <el-form-item label="类别:" prop="projectClass">
+                                    <el-select v-model="formModel.projectClass" block clearable placeholder="请选择">
+                                        <el-option v-for="item in projectClassdata" :key="item.dictValue" :label="item.dictName" :value="item.dictValue" />
+                                    </el-select>
+                                </el-form-item>
                                 <el-form-item label="项目类型:" prop="projectType">
-                                    <el-select v-model="formModel.projectType" block clearable placeholder="项目类型">
+                                    <el-select v-model="formModel.projectType" block clearable placeholder="请选择">
                                         <el-option v-for="item in projectType" :key="item.dictValue" :label="item.dictName" :value="item.dictValue" />
                                     </el-select>
                                 </el-form-item>
                                 <el-form-item label="项目进程:" prop="key3">
-                                    <el-select v-model="formModel.key3" block disabled="disabled" placeholder="项目进程">
+                                    <el-select v-model="formModel.key3" block disabled="disabled" placeholder="请选择">
                                         <el-option v-for="item in projectProcess" :key="item.key" :label="item.dictName" :value="item.key" />
                                     </el-select>
                                 </el-form-item>
@@ -26,7 +31,7 @@
                                     <el-input v-model="formModel.currentProcessName" disabled/>
                                 </el-form-item> -->
                                 <el-form-item label="服务类型:" prop="projectServerType">
-                                    <el-select v-model="formModel.projectServerType" block clearable placeholder="项目服务类型">
+                                    <el-select v-model="formModel.projectServerType" block clearable placeholder="请选择">
                                         <el-option v-for="item in serverType" :key="item.dictValue" :label="item.dictName" :value="item.dictValue" />
                                     </el-select>
                                 </el-form-item>
@@ -50,17 +55,17 @@
                         <div class="project-form-bottom">
                             <HcCardItem title="联系人信息">
                                 <el-form-item label="项目负责人:">
-                                    <el-select v-model="formModel.projectPrincipal" block clearable placeholder="项目负责人" size="large">
+                                    <el-select v-model="formModel.projectPrincipal" block clearable placeholder="请选择" size="large">
                                         <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id" />
                                     </el-select>
                                 </el-form-item>
                                 <el-form-item label="实施负责人:">
-                                    <el-select v-model="formModel.implementPrincipal" block clearable placeholder="实施负责人" size="large">
+                                    <el-select v-model="formModel.implementPrincipal" block clearable placeholder="请选择" size="large">
                                         <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id" />
                                     </el-select>
                                 </el-form-item>
                                 <el-form-item label="维护负责人:">
-                                    <el-select v-model="formModel.maintainPrincipal" block clearable placeholder="维护负责人" size="large">
+                                    <el-select v-model="formModel.maintainPrincipal" block clearable placeholder="请选择" size="large">
                                         <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id" />
                                     </el-select>
                                 </el-form-item>
@@ -121,7 +126,7 @@ import { onActivated, onMounted, ref } from 'vue'
 import { useRoute, useRouter } from 'vue-router'
 import projectApi from '~api/project/project-list.js'
 import { formValidate, getArrValue, getObjValue } from 'js-fast-way'
-import { getuserList } from '~api/other'
+import { getDictInfo, getuserList } from '~api/other'
 import { useAppStore } from '~src/store'
 const useAppState = useAppStore()
 
@@ -134,6 +139,10 @@ const dataId = ref(useRoutes?.query?.id ?? '')
 
 //缓存页面被激活时
 onActivated(() => {
+    getProjectType()
+    getProjectServerTypeDict()
+    getprojectClassType()
+    getProjectClass()
     dataType.value = useRoutes?.query?.type ?? 'view'
     dataId.value = useRoutes?.query?.id ?? ''
     getBaseProcess()
@@ -148,8 +157,7 @@ onActivated(() => {
    
 })
 onMounted(()=>{
-    getProjectType()
-    getProjectServerTypeDict()
+
   
 })
 //获取项目类型
@@ -162,6 +170,15 @@ const getProjectType = async ()=>{
     }
 }
 //获取项目服务类型
+const getprojectClassType = async ()=>{
+    const { error, code, data } = await projectApi.getProjectServerTypeDict()
+    if (!error && code === 200) {
+        projectClassType.value = getArrValue(data)
+    } else {
+        projectClassType.value = []
+    }
+}
+//获取项目类行
 const getProjectServerTypeDict = async ()=>{
     const { error, code, data } = await projectApi.getProjectServerTypeDict()
     if (!error && code === 200) {
@@ -170,6 +187,15 @@ const getProjectServerTypeDict = async ()=>{
         serverType.value = []
     }
 }
+//获取项目类别
+const getProjectClass = async ()=>{
+    const { error, code, data } = await getDictInfo('project_class')
+    if (!error && code === 200) {
+        projectClassdata.value = getArrValue(data)
+    } else {
+        projectClassdata.value = []
+    }
+}
 //获取所有员工
 const userList = ref([])
 //获取部门人员列表
@@ -210,7 +236,9 @@ const getBaseProcess = async ()=>{
 }
 //项目类型
 const projectType = ref([])
-
+//项目类别
+const projectClassdata = ref([])
+const projectClassType = ref([])
 //项目服务类型
 const serverType = ref([])
 
@@ -245,6 +273,11 @@ const formRules = {
         trigger: 'blur',
         message: '请选择项目类型',
     },
+    projectClass:{
+        required: true,
+        trigger: 'blur',
+        message: '请选择类别',
+    },
     constructUnit: {
         required: true,
         trigger: 'blur',

+ 51 - 15
src/views/static/actual.vue

@@ -3,14 +3,14 @@
         <div class="hc-main-row">
             <el-row :gutter="14" style="justify-content: flex-end;">
                 <div class="ml-4">
-                    <el-button size="large" type="primary" @click="importModalClick">
+                    <el-button v-auth-btn="['static-actual-import-btn']" size="large" type="primary" @click="importModalClick">
                         <HcIcon name="upload-cloud" />
                         <span>导入</span>
                     </el-button>
                 </div>
                 <div class="w-36 ml-4">
-                    <el-select v-model="checkyear" block clearable placeholder="选择年份" size="large">
-                        <el-option v-for="item in yearoptions" :key="item.key" :label="item.name" :value="item.key" />
+                    <el-select v-model="checkyear" block clearable placeholder="选择年份" size="large" @change="selectYear">
+                        <el-option v-for="(item, index) in yearoptions" :key="index" :label="item" :value="item" />
                     </el-select>
                 </div>
             </el-row>
@@ -22,7 +22,7 @@
                                 总经营收入预算
                             </div>
                             <div class="item-sub-num">
-                                <span class="num">120000</span>
+                                <span class="num">{{ totalObj?.budgetInput }}</span>
                                 <span class="text">元</span>
                             </div>
                         </div>
@@ -35,7 +35,7 @@
                                 总经营支出预算
                             </div>
                             <div class="item-sub-num">
-                                <span class="num">560</span>
+                                <span class="num">{{ totalObj?.budgetOutput }}</span>
                                 <span class="text">元</span>
                             </div>
                         </div>
@@ -48,7 +48,7 @@
                                 总经营实际收入
                             </div>
                             <div class="item-sub-num">
-                                <span class="num">90</span>
+                                <span class="num">{{ totalObj?.practicalInput }}</span>
                                 <span class="text">元</span>
                             </div>
                         </div>
@@ -61,7 +61,7 @@
                                 总经营实际支出
                             </div>
                             <div class="item-sub-num">
-                                <span class="num">125</span>
+                                <span class="num">{{ totalObj?.practicalOutput }}</span>
                                 <span class="text">元</span>
                             </div>
                         </div>
@@ -74,34 +74,70 @@
                 <TabAll />
             </template>
             <template #tab-month>
-                <TabMonth />
+                <TabMonth :cur="tabsKey" :checkyear="checkyear" />
             </template>
             <template #tab-decost>
-                <TabDecost />
+                <TabDecost :cur="tabsKey" :checkyear="checkyear" />
             </template>
             <template #tab-mannager>
-                <TabManager />
+                <TabManager :cur="tabsKey" :checkyear="checkyear" />
             </template>
         </HcTabsSimple>
     </el-scrollbar>
 </template>
 
  <script setup>
- import { ref } from 'vue'
+ import { onActivated, ref } from 'vue'
  import TabAll from './components/tab-all.vue'
  import TabMonth from './components/tab-month.vue'
  import TabDecost from './components/tab-decost.vue'
  import TabManager from './components/tab-mannager.vue'
-
+ import mainApi from '~api/home/index'
+ import mainApi1 from '~api/static/actual.js'
+ import { getArrValue, getObjValue } from 'js-fast-way'
+onActivated(async ()=>{
+   await getYearList()
+    budgetAndPracticalByBusiness()
+})
 const importModalClick = ()=>{
 
 }
 const checkyear = ref('')
 const yearoptions = ref([
-    { name:'2021年', key:2021 },
-    { name:'2022年', key:2022 },
-    { name:'2023年', key:2023 },
+    
 ])
+const selectYear = ()=>{
+    budgetAndPracticalByBusiness()
+}
+//获取年度列表
+const getYearList = async () => {
+    const { error, code, data } = await mainApi.yearList()
+    //判断状态
+    if (!error && code === 200) {
+        const arr = getArrValue(data)
+        yearoptions.value = arr
+        if ( yearoptions.value.length > 0) {
+            checkyear.value = yearoptions.value[yearoptions.value.length - 1]
+        }
+    } else {
+        yearoptions.value = []
+     
+    }
+}
+//获取总经营数据
+const totalObj = ref({})
+const budgetAndPracticalByBusiness = async () => {
+    const { error, code, data } = await mainApi1.budgetAndPracticalByBusiness(
+     { year:checkyear.value },
+    )
+    //判断状态
+    if (!error && code === 200) {
+    console.log(data, 'data')
+    totalObj.value = getObjValue(data)
+    } else {
+        totalObj.value = {}
+    }
+}
 const tabsKey = ref('all')
 const tabsData = ref([
     { icon: 'bar-chart-box', label: '汇总统计', key: 'all' },

+ 101 - 57
src/views/static/components/tab-all.vue

@@ -7,23 +7,34 @@
                 </el-select>
             </div>
         </el-row>
-        <el-table v-if="costcheck === 1" :data="tableData" border class="mt-4 " stripe :header-cell-style="headerStyle" style="height: 87%;">
+        <el-table v-if="costcheck === 1" :data="tableData" border class="mt-4 " stripe :header-cell-style="headerStyle1" style="height: 87%;padding-bottom: 30px;">
             <el-table-column
                 v-for="item in tableColData" :key="item.id" 
                 align="center"
                 :prop="item.id"
                 :label="item.name"
-                :min-width="180"
+                :min-width="item.name 
+                    === '期末账上余额' 
+                    || item.name === '期初账上余额'
+                    || item.name === '本月未支付' 
+                    || item.name === '期末账上余额' 
+                    || item.name === '本月未支付' 
+                    || item.name === '备注(单位:元)' 
+                    || item.name === '本月资金缺口' 
+                    || item.name === '已开票未回款金额(元)' 
+                    ? 130 : 100 "
             >
                 <el-table-column
-                    v-for="item1 in item.children" :key="item1.id"
+                    v-for="item1 in item.children" v-if="item.children"
+                    :key="item1.id"
                     align="center"
                     :prop="item1.id"
                     :label="item1.name"
                     :min-width="180"
                 >
                     <el-table-column
-                        v-for="item2 in item1.children" :key="item2.id"
+                        v-for="item2 in item1.children" v-if="item1.children"
+                        :key="item2.id"
                         align="center"
                         :prop="item2.id"
                         :label="item2.name"
@@ -42,7 +53,7 @@
                 :label="item.name"
             />
         </el-table>
-        <el-table v-if="costcheck !== '2' && costcheck !== '1'" stripe :data="tableData" border class="mt-4 " :header-cell-style="{ background: 'rgb(214, 225, 255)', fontSize: '16px', color: 'black' }" style="height: 87%;">
+        <el-table v-if="costcheck == 3" stripe :data="tableData" border class="mt-4 " :header-cell-style="{ background: 'rgb(214, 225, 255)', fontSize: '16px', color: 'black' }" style="height: 87%;">
             <el-table-column 
                 v-for="item in otherColData"  
                 :key="item.id"
@@ -54,7 +65,7 @@
 </template>
 
 <script setup>
-import { ref, watch } from 'vue'
+import { nextTick, ref, watch } from 'vue'
 
 const props = defineProps({
     cur: {
@@ -75,70 +86,71 @@ watch(() => [
 
 
 const tableData = ref([
-    { time:'一月', beginremain:'2000' },
-    { time:'二月', beginremain:'2000' },
-    { time:'三月', beginremain:'2000' },
-    { time:'四月', beginremain:'2000' },
-    { time:'五月', beginremain:'2000' },
-    { time:'六月', beginremain:'2000' },  
-    { time:'七月', beginremain:'2000' },
-    { time:'八月', beginremain:'2000' },
-    { time:'九月', beginremain:'2000' },
-    { time:'十月', beginremain:'2000' },
-    { time:'十一月', beginremain:'2000' },
-    { time:'十二月', beginremain:'20001' },
+    { time:'一月', key1:'2000' },
+    { time:'二月', key1:'2000' },
+    { time:'三月', key1:'2000' },
+    { time:'四月', key1:'2000' },
+    { time:'五月', key1:'2000' },
+    { time:'六月', key1:'2000' },  
+    { time:'七月', key1:'2000' },
+    { time:'八月', key1:'2000' },
+    { time:'九月', key1:'2000' },
+    { time:'十月', key1:'2000' },
+    { time:'十一月', key1:'2000' },
+    { time:'十二月', key1:'20001' },
     
 
 ])
 const tableColData = ref([
+        {
+          id: 'sort',
+          name: '序号',
+  
+        },
         {
           id: 'time',
-          name: '时间',
-          children:[
-      
-          ],
+          name: '年度',
+  
         },
         {
-          id: 'beginremain',
-          name: '期初上账余额',
-          children:[
-     
-          ],
+          id: 'key1',
+          name: '期初账上余额',
+       
         },
         {
-          id: 'beginremain',
+          id: 'key2',
           name: '回款',
           children:[
                 {
-                id: 'beginremain',
+                id: 'key3',
                 name: '计划回款',
                 children:[
                 
                 ],
                 },
                 {
-                id: 'beginremain',
+                id: 'key4',
                 name: '项目回款',
                 children:[
                 
                 ],
                 },
                 {
-                id: 'beginremain',
+                id: 'key5',
                 name: '营业外收入',
                 children:[
                
                 ],
                 },
                 {
-                id: 'beginremain',
+                id: 'key6',
                 name: '过账资金',
                 children:[
                   
                 ],
                 },
                 {
-                id: 'beginremain',
+                id: 'key7',
                 name: '项目保证金、押金退回',
                 children:[
                
@@ -147,21 +159,21 @@ const tableColData = ref([
           ],
         },
         {
-          id: 'beginremain8',
+          id: 'key8',
           name: '借还款',
           children:[
                 {
-                id: 'beginremain',
+                id: 'key9',
                 name: '借入',
                 children:[],
                 },
                 {
-                id: 'beginremain',
+                id: 'key10',
                 name: '偿还本金',
                 children:[],
                 },
                 {
-                id: 'beginremain',
+                id: 'key11',
                 name: '偿还利息',
                 children:[],
                 },
@@ -170,55 +182,57 @@ const tableColData = ref([
           ],
         },
         {
-          id: 'beginremain',
+          id: 'key12',
           name: '支出',
           
           children:[
                 {
-                id: 'beginremain',
+                id: 'key13',
                 name: '员工借款',
                 children:[ ],
                 },
                 {
-                id: 'beginremain',
+                id: 'key14',
                 name: '员工借支还款',
                 children:[],
                 
                 
                 },
                 {
-                id: 'beginremain',
+                id: 'key15',
                 name: '费用',
 
                 children:[
                     {
-                    id: 'beginremain',
+                    id: 'key16',
                     name: '差旅费、招待费',
                     },
                     {
-                    id: 'beginremain',
+                    id: 'key17',
                     name: '人员工资、五险一金',
                     },
                     {
-                    id: 'beginremain',
+                    id: 'key18',
                     name: '税金',
                     },
                     {
-                    id: 'beginremain',
+                    id: 'key19',
                     name: '外包费',
                     },
                     {
-                    id: 'beginremain',
+                    id: 'key20',
                     name: '商务费',
-                    }, {
-                    id: 'beginremain',
+                    }, 
+                    {
+                    id: 'key21',
                     name: '办公房租、物业水电',
                     },
                     {
-                    id: 'beginremain',
+                    id: 'key22',
                     name: '综合报销',
-                    }, {
-                    id: 'beginremain',
+                    }, 
+                    {
+                    id: 'key23',
                     name: '费用合计',
                     },
                 ],
@@ -229,21 +243,37 @@ const tableColData = ref([
      
        
         {
-          id: 'beginremain',
-          name: '期末账余额',
+          id: 'key24',
+          name: '期末账余额',
   
    
         },
+     
         {
-          id: 'beginremain',
+          id: 'key26',
           name: '本月未支付',
          
         },
+        {
+          id: 'key27',
+          name: '备注(单位:元)',
+         
+        },
+        {
+          id: 'key28',
+          name: '本月资金缺口',
+         
+        },
+        {
+          id: 'key29',
+          name: '已开票未回款金额(元)',
+         
+        },
 
 ])
 const costdetail = ref([
-    { name:'汇总表', key:'1' },
-    { name:'项目回款明细', key:'2' },
+    { name:'汇总表', key:1 },
+    { name:'项目回款明细', key:2 },
     { name:'借入', key:'3' },
 ])
 const tableprojectColData = ref([
@@ -300,8 +330,22 @@ const headerStyle = ()=>{
     const comStyle = { fontSize:'16px', background: 'rgb(214, 225, 255)', color:'black' }
     return comStyle
 }
+const headerStyle1 = ({ column, rowIndex, columnIndex })=>{
+    const comStyle = { fontSize:'16px', background: 'rgb(214, 225, 255)', color:'black' }
+
+      // 1.1 让第0行的第0列跨3行
+      // if (columnIndex === 0) {
+      //   nextTick(() => {
+      //     document
+      //       .getElementsByClassName(column.id)[0]
+      //       .setAttribute('rowSpan', 3)
+      //     return comStyle
+      //   })
+      // }
+    return comStyle
+}
 
-const costcheck = ref('1')
+const costcheck = ref(1)
 </script>
 
 <style scoped lang="scss">

+ 39 - 32
src/views/static/components/tab-decost.vue

@@ -20,43 +20,50 @@
 
 <script setup>
 import { nextTick, ref, watch } from 'vue'
+import mainApi from '~api/static/actual.js'
+import { getArrValue } from 'js-fast-way'
 
 const props = defineProps({
 cur: {
   type: [String, Number],
   default: '',
 },
+checkyear:{
+  type: [String, Number],
+  default: '',
+},
 })
 
 const tabsKey = ref(props.cur)
-
+const year = ref('')
 //监听
 watch(() => [
 props.cur,
-], ([key]) => {
+props.checkyear,
+], ([key, checkyear]) => {
 tabsKey.value = key
-console.log(key)
+console.log(key, 'key')
+year.value = checkyear
+  if (key === 'decost') {
+    console.log('获部门计划')
+    budgetAndPracticalByDept()
+  }
 })
 
-
-const tableData = ref([
-{ time:'一月', beginremain:'2000' },
-{ time:'二月', market:'2000', precost:1000, realcost:2000 },
-{ time:'三月', beginremain:'2000' },
-{ time:'四月', beginremain:'2000' },
-{ time:'五月', beginremain:'2000' },
-{ time:'六月', beginremain:'2000' },  
-{ time:'七月', beginremain:'2000' },
-{ time:'八月', beginremain:'2000' },
-{ time:'九月', beginremain:'2000' },
-{ time:'十月', beginremain:'2000' },
-{ time:'十一月', beginremain:'2000' },
-{ time:'十二月', beginremain:'2000' },
-{ time:'总计', beginremain:'2000' },
-
-
-
-])
+const tableData = ref([])
+//获取部门统计
+const budgetAndPracticalByDept = async () => {
+    const { error, code, data } = await mainApi.budgetAndPracticalByDept(
+     { year:year.value },
+    )
+    //判断状态
+    if (!error && code === 200) {
+      tableData.value = getArrValue(data)
+  
+    } else {
+      tableData.value = []
+    }
+}
 const tableColData = ref([
   {
     id:'time',
@@ -72,11 +79,11 @@ const tableColData = ref([
         name: '市场部',
         children:[
             {
-            id: 'precost',
+            id: 'budget1',
             name: '预算支出',
             },
             {
-            id: 'realcost',
+            id: 'practical1',
             name: '实际支出',
             },
     
@@ -87,11 +94,11 @@ const tableColData = ref([
         name: '研发部',
         children:[
             {
-            id: 'precost',
+            id: 'budget2',
             name: '预算支出',
             },
             {
-            id: 'realcost',
+            id: 'practical2',
             name: '实际支出',
             },
     
@@ -102,11 +109,11 @@ const tableColData = ref([
         name: '实施部',
         children:[
             {
-            id: 'precost',
+            id: 'budget3',
             name: '预算支出',
             },
             {
-            id: 'realcost',
+            id: 'practical3',
             name: '实际支出',
             },
     
@@ -117,11 +124,11 @@ const tableColData = ref([
         name: '维护部',
         children:[
             {
-            id: 'precost',
+            id: 'budget4',
             name: '预算支出',
             },
             {
-            id: 'realcost',
+            id: 'practical4',
             name: '实际支出',
             },
     
@@ -132,11 +139,11 @@ const tableColData = ref([
         name: '管理中心',
         children:[
             {
-            id: 'precost',
+            id: 'budget5',
             name: '预算支出',
             },
             {
-            id: 'realcost',
+            id: 'practical5',
             name: '实际支出',
             },
     

+ 33 - 26
src/views/static/components/tab-mannager.vue

@@ -20,6 +20,8 @@
 
 <script setup>
 import { nextTick, ref, watch } from 'vue'
+import mainApi from '~api/static/actual.js'
+import { getArrValue } from 'js-fast-way'
 
 
 const props = defineProps({
@@ -27,38 +29,43 @@ cur: {
   type: [String, Number],
   default: '',
 },
+checkyear:{
+  type: [String, Number],
+  default: '',
+},
 })
 
 const tabsKey = ref(props.cur)
-
+const year = ref('')
 //监听
 watch(() => [
 props.cur,
-], ([key]) => {
+props.checkyear,
+], ([key, checkyear]) => {
 tabsKey.value = key
-console.log(key)
+console.log(key, 'key')
+year.value = checkyear
+  if (key === 'mannager') {
+    console.log('获部门计划')
+    budgetAndPracticalByManage()
+  }
 })
 
 
-const tableData = ref([
-
-{ time:'一月', beginremain:'2000' },
-{ time:'二月', market:'2000', precost:1000, realcost:2000 },
-{ time:'三月', beginremain:'2000' },
-{ time:'四月', beginremain:'2000' },
-{ time:'五月', beginremain:'2000' },
-{ time:'六月', beginremain:'2000' },  
-{ time:'七月', beginremain:'2000' },
-{ time:'八月', beginremain:'2000' },
-{ time:'九月', beginremain:'2000' },
-{ time:'十月', beginremain:'2000' },
-{ time:'十一月', beginremain:'2000' },
-{ time:'十二月', beginremain:'2000' },
-{ time:'总计', beginremain:'2000' },
-
-
-
-])
+const tableData = ref([])
+//获取部门统计
+const budgetAndPracticalByManage = async () => {
+    const { error, code, data } = await mainApi.budgetAndPracticalByManage(
+     { year:year.value },
+    )
+    //判断状态
+    if (!error && code === 200) {
+      tableData.value = getArrValue(data)
+  
+    } else {
+      tableData.value = []
+    }
+}
 const tableColData = ref([
   {
     id:'time',
@@ -77,11 +84,11 @@ const tableColData = ref([
         name: '人工成本',
         children:[
             {
-            id: 'precost',
+            id: 'disburse1',
             name: '预算支出',
             },
             {
-            id: 'realcost',
+            id: 'disburse2',
             name: '实际支出',
             },
     
@@ -92,11 +99,11 @@ const tableColData = ref([
         name: '管理成本',
         children:[
             {
-            id: 'precost',
+            id: 'disburse3',
             name: '预算支出',
             },
             {
-            id: 'realcost',
+            id: 'disburse4',
             name: '实际支出',
             },
     

+ 27 - 21
src/views/static/components/tab-month.vue

@@ -20,45 +20,51 @@
 
 <script setup>
 import { nextTick, ref, watch } from 'vue'
-
+import mainApi from '~api/static/actual.js'
+import { getArrValue } from 'js-fast-way'
 const props = defineProps({
 cur: {
   type: [String, Number],
   default: '',
 },
+checkyear:{
+  type: [String, Number],
+  default: '',
+},
 })
 
 const tabsKey = ref(props.cur)
+const year = ref('')
 
 //监听
 watch(() => [
 props.cur,
-], ([key]) => {
+props.checkyear,
+], ([key, checkyear]) => {
 tabsKey.value = key
-console.log(key)
+year.value = checkyear
+  if (key === 'month') {
+    console.log('获取月度计划')
+    budgetAndPracticalByMonth()
+  }
 })
 
 
 const tableData = ref([
-// { time:'一月', beginremain:'2000' },
-// { time:'二月', beginremain:'2000' },
-// { time:'三月', beginremain:'2000' },
-// { time:'四月', beginremain:'2000' },
-// { time:'五月', beginremain:'2000' },
-// { time:'六月', beginremain:'2000' },  
-// { time:'七月', beginremain:'2000' },
-// { time:'八月', beginremain:'2000' },
-// { time:'九月', beginremain:'2000' },
-// { time:'十月', beginremain:'2000' },
-// { time:'十一月', beginremain:'2000' },
-// { time:'十二月', beginremain:'2000' },
-// { time:'总计', beginremain:'2000' },
-{ time:'一月', income1:1000, disburse1:1000, income2:2000, disburse2:2000, income3:300, disburse3:3000 },
-
-
-
-
 ])
+//获取月度统计
+const budgetAndPracticalByMonth = async () => {
+    const { error, code, data } = await mainApi.budgetAndPracticalByMonth(
+     { year:year.value },
+    )
+    //判断状态
+    if (!error && code === 200) {
+      tableData.value = getArrValue(data)
+  
+    } else {
+      tableData.value = []
+    }
+}
 const tableColData = ref([
   {
     id:'time',

+ 29 - 15
src/views/system/components/tab-approve.vue

@@ -52,8 +52,8 @@
     </HcCard>
     <!-- 预算分类新增编辑弹窗 -->
     <HcDialog bg-color="#ffffff" widths="22rem" is-to-body :show="priceModal" :title="priceTitle" @close="priceModalClose" @save="saveparentClick">
-        <el-form :model="priceform" label-position="top" label-width="auto" size="large">
-            <el-form-item label="一级科目名称:">
+        <el-form ref="formRef" :model="priceform" label-position="top" label-width="auto" size="large" :rules="formRules"> 
+            <el-form-item label="一级科目名称:" prop="dictName">
                 <el-input v-model="priceform.dictName" />
             </el-form-item>
         </el-form>
@@ -63,7 +63,7 @@
 <script setup>
 import { onMounted, ref, watch } from 'vue'
 import { getApproveList, getParentList, removeDictionary, submitApproveList, submitDictionary } from '~api/system/parameter.js'
-import { getArrValue } from 'js-fast-way'
+import { formValidate, getArrValue } from 'js-fast-way'
 
 const props = defineProps({
     cur: {
@@ -100,6 +100,7 @@ const menuItem = ref({})
 const getParentListData = async ()=>{
     const { error, code, data, msg } = await getParentList({
         type:tabsType.value,
+        size:1000,
 
     })
     if (!error && code === 200) {
@@ -225,20 +226,31 @@ const contextMenuClick = ({ key, item }) => {
 }
 
 //新增一级科目
+const formRef = ref(null)
+const formRules = {
+    dictName: [
+        { required: true, message: '请输入名称', trigger: 'blur' },
+    ],
+}   
+
+  
+
 const saveparentClick = async ()=>{
-    const { error, code, msg } = await submitDictionary({
-        type:tabsType.value,
-        dictName:priceform.value?.dictName,
-        id:menuKey.value || null,
-    })
+    const res = await formValidate(formRef.value)
+    if (res) {
+        const { error, code, msg } = await submitDictionary({
+            type:tabsType.value,
+            dictName:priceform.value?.dictName,
+            id:menuKey.value || null,
+        })
 
-    if (!error && code === 200) {
-        window.$message?.success(msg)
-        priceModal.value = false
-        getParentListData()
-    } else {
-        window.$message?.warning(msg)
+        if (!error && code === 200) {
+            window.$message?.success(msg)
+            priceModal.value = false
+            getParentListData()
+        } 
     }
+  
 }
 const tableColumn = [
     { key: 'roleName', name: '审批岗位', align:'center' },
@@ -281,6 +293,7 @@ const getcheckData = async ()=>{
     const { error, code, data, msg } = await getParentList({
         code:'dept_info',
         type:11,
+        size:1000,
 
     })
     if (!error && code === 200) {
@@ -344,7 +357,8 @@ const submitApprove = async ()=>{
         box-shadow: none;
         .hc-menu-contents-box {
             position: relative;
-            padding: 0;
+            // padding: 0;
+            padding-bottom: 30px;
             height: 100%;
             // height: calc(100% - 60px);
         }

+ 78 - 23
src/views/system/components/tab-cost.vue

@@ -22,10 +22,16 @@
 
                     <!-- 预算分类新增编辑弹窗 -->
                     <HcDialog bg-color="#ffffff" widths="22rem" is-to-body :show="priceModal" :title="priceTitle" @close="priceModalClose" @save="saveparentClick">
-                        <el-form :model="priceform" label-position="top" label-width="auto" size="large">
-                            <el-form-item label="测算一级科目名称:">
+                        <el-form ref="priceformref" :model="priceform" label-position="top" label-width="auto" size="large" :rules="priceformRules">
+                            <el-form-item label="测算一级科目名称:" prop="dictName">
                                 <el-input v-model="priceform.dictName" />
                             </el-form-item>
+                            <el-form-item label="测算一级科目值:" prop="dictValue">
+                                <el-input v-model="priceform.dictValue" />
+                            </el-form-item>
+                            <el-form-item label="序号:" prop="sort">
+                                <el-input v-model="priceform.sort" oninput="value=value.replace(/[^\d]/g,'')" />
+                            </el-form-item>
                         </el-form>
                     </HcDialog>
                 </div>
@@ -52,10 +58,16 @@
 
                     <!-- 任务明细弹窗 -->
                     <HcDialog bg-color="#ffffff" widths="24rem" is-to-body :show="editTaskModal" :title="taskTitle" @close="testModalClose" @save="savechilidClick">
-                        <el-form label-position="top" label-width="auto" :model="formLabelAlign" size="large">
-                            <el-form-item label="测算二级科目名称:">
+                        <el-form ref="secondformref" label-position="top" label-width="auto" :model="formLabelAlign" size="large" :rules="secondformRules">
+                            <el-form-item label="测算二级科目名称:" prop="dictName">
                                 <el-input v-model="formLabelAlign.dictName" />
                             </el-form-item>
+                            <el-form-item label="测算一级科目值:" prop="dictValue">
+                                <el-input v-model="formLabelAlign.dictValue" />
+                            </el-form-item>
+                            <el-form-item label="序号:" prop="sort">
+                                <el-input v-model="formLabelAlign.sort" oninput="value=value.replace(/[^\d]/g,'')" />
+                            </el-form-item>
                         </el-form>
                     </HcDialog>
                 </HcCardItem>
@@ -67,7 +79,7 @@
 <script setup>
 import { onMounted, ref, watch } from 'vue'
 import { getChildList, getParentList, removeDictionary, submitDictionary } from '~api/system/parameter.js'
-import { getArrValue } from 'js-fast-way'
+import { formValidate, getArrValue } from 'js-fast-way'
 
 const props = defineProps({
     cur: {
@@ -133,6 +145,8 @@ const contextMenuClick = ({ key, item }) => {
         openpriceEdit(2)
         menuKey.value = item?.id
         priceform.value.dictName = item.dictName
+        priceform.value.sort = item.sort
+        priceform.value.dictValue = item.dictValue
     } else if (key === 'del') {
         window?.$messageBox?.alert('您确定要删除该预算分类信息吗? 一旦注销数据将彻底清除,请谨慎操作?', '删除提醒', {
             showCancelButton: true,
@@ -174,17 +188,44 @@ const priceform = ref({})
 const priceModalClose = () => {
     priceModal.value = false
 }
+const priceformRules = {
+    dictName: [
+        { required: true, message: '请输入名称', trigger: 'blur' },
+    ],
+    sort: [
+        { required: false, message: '请输入序号', trigger: 'blur' },
+    ],
+    dictValue: [
+        { required: true, message: '请输入字典值', trigger: 'blur' },
+    ],
+
+}
+const secondformRules = {
+    dictName: [
+        { required: true, message: '请输入名称', trigger: 'blur' },
+    ],
+    sort: [
+        { required: true, message: '请输入序号', trigger: 'blur' },
+    ],
+    dictValue: [
+        { required: true, message: '请输入字典值', trigger: 'blur' },
+    ],
 
+}
 const taskTitle = ref('')
 const openEdit = (type, row) => {
     
     if (type === 1) {
         formLabelAlign.value.dictName = ''
         formLabelAlign.value.id = ''
+        formLabelAlign.value.sort = ''
+        formLabelAlign.value.dictValue = ''
         taskTitle.value = '新增'
     } else {
         formLabelAlign.value.dictName = row.dictName
         formLabelAlign.value.id = row.id
+        formLabelAlign.value.sort = row.sort
+        formLabelAlign.value.dictValue = row.dictValue
         taskTitle.value = '编辑'
     }
     if (menuKey.value) {
@@ -233,18 +274,22 @@ const tableColumn = [
 const tableData = ref([])
 const tableLoaing = ref(false)
 const formLabelAlign = ref({
-    name: '',
-    region: '',
-    type: '',
+   
+    
 })
 
 
 //新增一级科目
+const priceformref = ref(null)
 const saveparentClick = async ()=>{
-    const { error, code, msg } = await submitDictionary({
+    const res = await formValidate(priceformref.value)
+    if (res) {
+        const { error, code, msg } = await submitDictionary({
         type:tabsType.value,
         dictName:priceform.value?.dictName,
         id:menuKey.value || null,
+        sort:priceform.value?.sort,
+        dictValue:priceform.value?.dictValue,
     })
    
     if (!error && code === 200) {
@@ -254,28 +299,38 @@ const saveparentClick = async ()=>{
     } else {
         window.$message?.warning(msg)
     }
+    }
+ 
 }
 //新增二级级科目
+const secondformref = ref(null)
 const savechilidClick = async ()=>{
-    const { error, code, msg } = await submitDictionary({
-        type:tabsType.value,
-        dictName:formLabelAlign.value?.dictName,
-        id:formLabelAlign.value.id || null,
-        parentId:menuKey.value,
-    })
-   
-    if (!error && code === 200) {
-        window.$message?.success(msg)
-        editTaskModal.value = false
-        getChildListData()
-    } else {
-        window.$message?.warning(msg)
+    const res = await formValidate(secondformref.value)
+    if (res) {
+        const { error, code, msg } = await submitDictionary({
+            type:tabsType.value,
+            dictName:formLabelAlign.value?.dictName,
+            id:formLabelAlign.value.id || null,
+            parentId:menuKey.value,
+            sort:formLabelAlign.value?.sort,
+            dictValue:formLabelAlign.value?.dictValue,
+        })
+    
+        if (!error && code === 200) {
+            window.$message?.success(msg)
+            editTaskModal.value = false
+            getChildListData()
+        } else {
+            window.$message?.warning(msg)
+        }
     }
+
 }
 //获取一级科目
 const getParentListData = async ()=>{
     const { error, code, data, msg } = await getParentList({
         type:tabsType.value,
+        size:1000,
        
     })
     if (!error && code === 200) {
@@ -322,7 +377,7 @@ const getChildListData = async ()=>{
         box-shadow: none;
         .hc-menu-contents-box {
             position: relative;
-            padding: 0;
+            padding-bottom: 30px;
             height: 100%;
             // height: calc(100% - 60px);
         }

+ 28 - 17
src/views/system/components/tab-invoice.vue

@@ -18,8 +18,8 @@
         </HcTable>
    
         <HcDialog bg-color="#ffffff" is-to-body widths="24rem" :show="positonModal" :title="positonModalTitle" @close="positonModalClose" @save="savepositionClick">
-            <el-form label-position="top" label-width="auto" :model="formposition" size="large">
-                <el-form-item label="发票类型名称:">
+            <el-form ref="formRef" label-position="top" label-width="auto" :model="formposition" size="large" :rules="formRules">
+                <el-form-item label="发票类型名称:" prop="dictName">
                     <el-input v-model="formposition.dictName" />
                 </el-form-item>
             </el-form>
@@ -30,7 +30,7 @@
 <script setup>
 import { onMounted, ref, watch } from 'vue'
 import { getParentList, removeDictionary, submitDictionary } from '~api/system/parameter.js'
-import { getArrValue } from 'js-fast-way'
+import { formValidate, getArrValue } from 'js-fast-way'
 const props = defineProps({
     cur: {
         type: [String, Number],
@@ -63,6 +63,7 @@ const getParentListData = async ()=>{
     tableLoaing.value = true
     const { error, code, data, msg } = await getParentList({
         type:tabsType.value,
+        size:1000,
     })
     tableLoaing.value = false
     if (!error && code === 200) {
@@ -109,23 +110,33 @@ const positonModalClose = () => {
 }
 
 const formposition = ref({})
-
+const formRef = ref(null)
+const formRules = {
+    dictName: [
+        { required: true, message: '请输入名称', trigger: 'blur' },
+    ],
+  
+}
 //新增编辑提交
 const savepositionClick = async ()=>{
-    const { error, code, msg } = await submitDictionary({
-        type:tabsType.value,
-        dictValue:formposition.value?.dictValue,
-        dictName:formposition.value?.dictName,
-        id:editItem.value.id || null,
-      
-    })
-    positonModal.value = false
-    if (!error && code === 200) {
-        window.$message?.success(msg)
-        getParentListData()
-    } else {
-        window.$message?.warning(msg)
+    const res = await formValidate(formRef.value)
+    if (res) {
+        const { error, code, msg } = await submitDictionary({
+            type:tabsType.value,
+            dictValue:formposition.value?.dictValue,
+            dictName:formposition.value?.dictName,
+            id:editItem.value.id || null,
+        
+        })
+        positonModal.value = false
+        if (!error && code === 200) {
+            window.$message?.success(msg)
+            getParentListData()
+        } else {
+            window.$message?.warning(msg)
+        }
     }
+
 }
 const delTaskposition = (row) => {
     window?.$messageBox?.alert('您确定要删除该信息吗? 一旦注销数据将彻底清除,请谨慎操作?', '删除提醒', {

+ 1 - 0
src/views/system/components/tab-price-type.vue

@@ -331,6 +331,7 @@ const savechilidClick = async ()=>{
 const getParentListData = async ()=>{
     const { error, code, data, msg } = await getParentList({
         type:tabsType.value,
+        size:1000,
        
     })
     if (!error && code === 200) {

+ 16 - 4
src/views/system/components/tab-price.vue

@@ -18,8 +18,8 @@
         </HcTable>
 
         <HcDialog bg-color="#ffffff" is-to-body widths="24rem" :show="positonModal" :title="positonModalTitle" @close="positonModalClose" @save="savepositionClick">
-            <el-form label-position="top" label-width="auto" :model="formposition" size="large">
-                <el-form-item label="岗位类型名称:">
+            <el-form ref="positionref" label-position="top" label-width="auto" :model="formposition" size="large" :rules="positionformRules">
+                <el-form-item label="岗位类型名称:" prop="dictName">
                     <el-input v-model="formposition.dictName" />
                 </el-form-item>
                 <el-form-item label="日单价:">
@@ -34,7 +34,7 @@
 <script setup>
 import { onMounted, ref, watch } from 'vue'
 import { getParentList, removeDictionary, submitDictionary } from '~api/system/parameter.js'
-import { getArrValue } from 'js-fast-way'
+import { formValidate, getArrValue } from 'js-fast-way'
 const props = defineProps({
     cur: {
         type: [String, Number],
@@ -67,6 +67,7 @@ const getParentListData = async ()=>{
     tableLoaing.value = true
     const { error, code, data, msg } = await getParentList({
         type:tabsType.value,
+        size:1000,
     })
     tableLoaing.value = false
     if (!error && code === 200) {
@@ -112,9 +113,18 @@ const positonModalClose = () => {
 }
 
 const formposition = ref({})
+const positionformRules = {
+    dictName: [
+        { required: true, message: '请输入名称', trigger: 'blur' },
+    ],
+  
+}
 //新增编辑提交
+const positionref = ref(null)
 const savepositionClick = async ()=>{
-    const { error, code, msg } = await submitDictionary({
+    const res = await formValidate(positionref.value)
+    if (res) {
+        const { error, code, msg } = await submitDictionary({
         type:tabsType.value,
         dictValue:formposition.value?.dictValue,
         dictName:formposition.value?.dictName,
@@ -128,6 +138,8 @@ const savepositionClick = async ()=>{
     } else {
         window.$message?.warning(msg)
     }
+    }
+ 
 }
 const delTaskposition = (row) => {
     window?.$messageBox?.alert('您确定要删除该信息吗? 一旦注销数据将彻底清除,请谨慎操作?', '删除提醒', {

+ 30 - 17
src/views/system/components/tab-reimbursement.vue

@@ -18,8 +18,8 @@
         </HcTable>
    
         <HcDialog bg-color="#ffffff" is-to-body widths="24rem" :show="positonModal" :title="positonModalTitle" @close="positonModalClose" @save="savepositionClick">
-            <el-form label-position="top" label-width="auto" :model="formposition" size="large">
-                <el-form-item label="报销类型名称:">
+            <el-form ref="formRef" label-position="top" label-width="auto" :model="formposition" size="large" :rules="positionformRules">
+                <el-form-item label="报销类型名称:" prop="dictName">
                     <el-input v-model="formposition.dictName" />
                 </el-form-item>
             </el-form>
@@ -30,7 +30,7 @@
 <script setup>
 import { onMounted, ref, watch } from 'vue'
 import { getParentList, removeDictionary, submitDictionary } from '~api/system/parameter.js'
-import { getArrValue } from 'js-fast-way'
+import { formValidate, getArrValue } from 'js-fast-way'
 const props = defineProps({
     cur: {
         type: [String, Number],
@@ -63,6 +63,7 @@ const getParentListData = async ()=>{
     tableLoaing.value = true
     const { error, code, data, msg } = await getParentList({
         type:tabsType.value,
+        size:1000,
     })
     tableLoaing.value = false
     if (!error && code === 200) {
@@ -109,23 +110,35 @@ const positonModalClose = () => {
 }
 
 const formposition = ref({})
-
+const positionformRules = {
+    dictName: [
+        { required: true, message: '请输入名称', trigger: 'blur' },
+    ],
+  
+}
 //新增编辑提交
+const formRef = ref(null)
+
+
 const savepositionClick = async ()=>{
-    const { error, code, msg } = await submitDictionary({
-        type:tabsType.value,
-        dictValue:formposition.value?.dictValue,
-        dictName:formposition.value?.dictName,
-        id:editItem.value.id || null,
-      
-    })
-    positonModal.value = false
-    if (!error && code === 200) {
-        window.$message?.success(msg)
-        getParentListData()
-    } else {
-        window.$message?.warning(msg)
+    const res = await formValidate(formRef.value)
+    if (res) {
+            const { error, code, msg } = await submitDictionary({
+            type:tabsType.value,
+            dictValue:formposition.value?.dictValue,
+            dictName:formposition.value?.dictName,
+            id:editItem.value.id || null,
+        
+        })
+        positonModal.value = false
+        if (!error && code === 200) {
+            window.$message?.success(msg)
+            getParentListData()
+        } else {
+            window.$message?.warning(msg)
+        }
     }
+
 }
 const delTaskposition = (row) => {
     window?.$messageBox?.alert('您确定要删除该信息吗? 一旦注销数据将彻底清除,请谨慎操作?', '删除提醒', {

+ 31 - 18
src/views/system/components/tab-task-type.vue

@@ -23,11 +23,11 @@
 
         <!-- 任务类型弹窗 -->
         <HcDialog bg-color="#ffffff" is-to-body widths="24rem" :show="tasktypeModal" :title="taskTypeTitle" @close="taskTypeModalClose" @save="saveparentClick">
-            <el-form label-position="top" :model="formtaskType" label-width="auto" size="large">
-                <el-form-item label="任务类型名称">
+            <el-form ref="taskformref" label-position="top" :model="formtaskType" label-width="auto" size="large" :rules="taskformRules">
+                <el-form-item label="任务类型名称" prop="dictName">
                     <el-input v-model="formtaskType.dictName" />
                 </el-form-item>
-                <el-form-item label="类型">
+                <el-form-item label="类型" prop="dictValue">
                     <el-select v-model="formtaskType.dictValue" class="block" placeholder="请选择">
                         <el-option v-for="item in typeoptions" :key="item.value" :label="item.name" :value="item.value" />
                     </el-select>
@@ -40,7 +40,7 @@
 <script setup>
 import { onMounted, ref, watch } from 'vue'
 import { getParentList, removeDictionary, submitDictionary } from '~api/system/parameter.js'
-import { getArrValue } from 'js-fast-way'
+import { formValidate, getArrValue } from 'js-fast-way'
 const props = defineProps({
     cur: {
         type: [String, Number],
@@ -91,29 +91,42 @@ const openTypeEdit = (type, row) => {
     }
     tasktypeModal.value = true
 }
-
+const taskformRules = {
+    dictName: [
+        { required: true, message: '请输入名称', trigger: 'blur' },
+    ],
+    dictValue: [
+        { required: true, message: '请选择类型', trigger: 'blur' },
+    ],
+}
 //新增一级科目
+const taskformref = ref(null)
 const saveparentClick = async ()=>{
-    const { error, code, msg } = await submitDictionary({
-        type:tabsType.value,
-        dictValue:formtaskType.value?.dictValue,
-        dictName:formtaskType.value?.dictName,
-        id:editItem.value.id || null,
-      
-    })
-    tasktypeModal.value = false
-    if (!error && code === 200) {
-        window.$message?.success(msg)
-        getParentListData()
-    } else {
-        window.$message?.warning(msg)
+    const res = await formValidate(taskformref.value)
+    if (res) {
+            const { error, code, msg } = await submitDictionary({
+            type:tabsType.value,
+            dictValue:formtaskType.value?.dictValue,
+            dictName:formtaskType.value?.dictName,
+            id:editItem.value.id || null,
+        
+        })
+        tasktypeModal.value = false
+        if (!error && code === 200) {
+            window.$message?.success(msg)
+            getParentListData()
+        } else {
+            window.$message?.warning(msg)
+        }
     }
+ 
 }
 const tableLoaing = ref(false)
 const getParentListData = async ()=>{
     tableLoaing.value = true
     const { error, code, data, msg } = await getParentList({
         type:tabsType.value,
+        size:1000,
     })
     tableLoaing.value = false
     if (!error && code === 200) {

+ 61 - 58
src/views/system/organization.vue

@@ -1,84 +1,87 @@
 <template>
     <HcCard>
         <template #extra>
-            <el-button type="primary" @click="isedit = true" size="large" v-if="!isedit">
+            <el-button v-if="!isedit" type="primary" size="large" @click="isedit = true">
                 <span>编辑组织机构</span>
             </el-button>
-            <el-button type="primary" @click="isedit = false" size="large" v-if="isedit">
+            <el-button v-if="isedit" type="primary" size="large" @click="isedit = false">
                 <span>返回上一级</span>
             </el-button>
         </template>
-        <div class="h-full text-center" v-if="!isedit">
-            <vue3-tree-org :data="userDeptTreeData" :horizontal="false" :collapsable="false" :node-draggable="false" draggable
+        <div v-if="!isedit" class="h-full text-center">
+            <vue3-tree-org
+                :data="userDeptTreeData" :horizontal="false" :collapsable="false" :node-draggable="false" draggable
                 center :scalable="false" :default-expand-level="5" :define-menus="[]" disabled
             >
-                <template v-slot="{node}">
-                    <div class="hac-node-vue3-tree-org-label">{{ node.label }}</div>
+                <template #default="{ node }">
+                    <div class="hac-node-vue3-tree-org-label">
+                        {{ node.label }}
+                    </div>
                 </template>
             </vue3-tree-org>
         </div>
-        <div class="h-full" v-if="isedit">
+        <div v-if="isedit" class="h-full">
             <el-scrollbar>
-                <HcTreeData :datas="deptTreeData" @menuTap="treeMenuTap"/>
+                <HcTreeData :datas="deptTreeData" @menuTap="treeMenuTap" />
             </el-scrollbar>
         </div>
 
-        <HcDialog bgColor="#ffffff" isToBody :show="formModal" :title="formModalTitle"
-                  @save="formModalSave" @close="formModalClose" widths="26rem"
+        <HcDialog
+            bg-color="#ffffff" is-to-body :show="formModal" :title="formModalTitle"
+            widths="26rem" @save="formModalSave" @close="formModalClose"
         >
             <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="top" size="large">
                 <el-form-item label="组织节点名称:" prop="deptName">
-                    <el-input v-model="formModel.deptName"/>
+                    <el-input v-model="formModel.deptName" />
                 </el-form-item>
                 <el-form-item label="上级组织节点名称:">
-                    <el-input v-model="formModel.parentDeptName" placeholder="已为顶级节点" disabled/>
+                    <el-input v-model="formModel.parentDeptName" placeholder="已为顶级节点" disabled />
                 </el-form-item>
                 <el-form-item label="组织节点类别:">
-                    <el-select block v-model="formModel.deptType" disabled>
-                        <el-option label="公司" :value="1"/>
-                        <el-option label="部门" :value="2"/>
-                        <el-option label="岗位" :value="3"/>
+                    <el-select v-model="formModel.deptType" block disabled>
+                        <el-option label="公司" :value="1" />
+                        <el-option label="部门" :value="2" />
+                        <el-option label="岗位" :value="3" />
                     </el-select>
                 </el-form-item>
             </el-form>
         </HcDialog>
 
-        <HcDialog bgColor="#ffffff" isToBody isTable :show="authModal" title="权限配置" @save="authModalSave" @close="authModalClose" widths="40rem">
+        <HcDialog bg-color="#ffffff" is-to-body is-table :show="authModal" title="权限配置" widths="40rem" @save="authModalSave" @close="authModalClose">
             <el-scrollbar>
-                <HcDataTree ref="authTreeRef" treeKey="id" :h-props="treeProps" :datas="treeMenuNode" :defaultCheckedKeys="treeMenuKeys" showCheckbox>
-                    <template #default="{node, data}">
-                        <span class="hc-tree-menu-label">{{node.label}}</span>
-                        <span class="hc-tree-menu-remark">{{data.remark}}</span>
+                <HcDataTree ref="authTreeRef" tree-key="id" :h-props="treeProps" :datas="treeMenuNode" :default-checked-keys="treeMenuKeys" show-checkbox>
+                    <template #default="{ node, data }">
+                        <span class="hc-tree-menu-label">{{ node.label }}</span>
+                        <span class="hc-tree-menu-remark">{{ data.remark }}</span>
                     </template>
                 </HcDataTree>
             </el-scrollbar>
         </HcDialog>
     </HcCard>
-
 </template>
 
 <script setup>
-import {onActivated, ref} from "vue";
-import mainApi from "~api/system/organization";
-import HcTreeData from "./components/HcTreeData.vue";
-import {arrIndex, formValidate, getArrValue} from "js-fast-way";
-import menuApi from "~api/system/menu";
-import {delMessage} from "~uti/tools";
+import { onActivated, ref } from 'vue'
+import mainApi from '~api/system/organization'
+import HcTreeData from './components/HcTreeData.vue'
+import { arrIndex, formValidate, getArrValue } from 'js-fast-way'
+import menuApi from '~api/system/menu'
+import { delMessage } from '~uti/tools'
 
 //显示模式
 const isedit = ref(true)
 
 //页面被激活时
 onActivated(() => {
-    getTreeData();
+    getTreeData()
     // 获取用户节点树
-    getUserDeptTreeData();
+    getUserDeptTreeData()
 })
 
 //获取树数据
 const deptTreeData = ref({})
 const getTreeData = async () => {
-    const {error, code, data} = await mainApi.deptList()
+    const { error, code, data } = await mainApi.deptList()
     if (!error && code === 200) {
         const res = await setDeptTreeData(data)
         deptTreeData.value = res[0]
@@ -90,7 +93,7 @@ const getTreeData = async () => {
 //获取树数据
 const userDeptTreeData = ref({})
 const getUserDeptTreeData = async () => {
-    const {error, code, data} = await mainApi.treeUserdept()
+    const { error, code, data } = await mainApi.treeUserdept()
     if (!error && code === 200) {
         const res = await setDeptTreeData(data)
         userDeptTreeData.value = res[0]
@@ -100,11 +103,11 @@ const getUserDeptTreeData = async () => {
 }
 
 //组织架构显示信息
-const lavel1_style = {color: "#fff", background: "#108ffe", borderColor: "#108ffe", padding: '10px 15px'}
-const lavel2_style = {background: "#E8E8E8", padding: '10px 15px'}
+const lavel1_style = { color: '#fff', background: '#108ffe', borderColor: '#108ffe', padding: '10px 15px' }
+const lavel2_style = { background: '#E8E8E8', padding: '10px 15px' }
 const lavel3_style = {
-    background: "none", border: 'none', borderBottom: '1px solid #c8c8c8', borderRadius: '0',
-    boxShadow: 'none', fontSize: '14px', padding: '6px 2px'
+    background: 'none', border: 'none', borderBottom: '1px solid #c8c8c8', borderRadius: '0',
+    boxShadow: 'none', fontSize: '14px', padding: '6px 2px',
 }
 
 //遍历处理组织结构数据树
@@ -112,9 +115,9 @@ const lavel3_style = {
 const setDeptTreeData = async (data) => {
     let res = [], arr = getArrValue(data)
     for (let i = 0; i < arr.length; i++) {
-        const {deptName, deptType, children} = arr[i]
-        const obj = {...arr[i], label: deptName, children: [],
-            style: deptType === 1 ? lavel1_style : deptType === 2 ? lavel2_style : lavel3_style
+        const { deptName, deptType, children } = arr[i]
+        const obj = { ...arr[i], label: deptName, children: [],
+            style: deptType === 1 ? lavel1_style : deptType === 2 ? lavel2_style : lavel3_style,
         }
         if (children && children.length > 0) {
             obj.children = await setDeptTreeData(children)
@@ -132,34 +135,34 @@ const formModalTitle = ref('')
 const formRef = ref(null)
 const formModel = ref({})
 const formRules = {
-    deptName: {required: true, trigger: 'blur', message: "请输入组织节点名称"}
+    deptName: { required: true, trigger: 'blur', message: '请输入组织节点名称' },
 }
 
 //树节点的菜单点击事件
 const treeInfo = ref({})
-const treeMenuTap = ({key, node, data}) => {
+const treeMenuTap = ({ key, node, data }) => {
     treeInfo.value = data
     if (key === 'add') {
         formModel.value = {
             parentId: data.id,
             parentDeptName: data.deptName,
             //如果当前节点为顶级节点,则为部门类型,如果为部门节点,则为岗位类型
-            deptType: node.level === 1 ? 2 : node.level === 2 ? 3 : 0
+            deptType: node.level === 1 ? 2 : node.level === 2 ? 3 : 0,
         }
         const type = node.level === 1 ? '部门' : node.level === 2 ? '岗位' : '未知'
         formModalTitle.value = '新增' + type + '信息'
         formModal.value = true
     } else if (key === 'edit') {
         if (node.level > 1) {
-            const parent = node.parent.data;
+            const parent = node.parent.data
             formModel.value = {
                 parentDeptName: parent.deptName,
-                ...data
+                ...data,
             }
         } else {
             formModel.value = data
         }
-        const type = node.level === 1 ? '公司' : node.level === 2 ? '部门' : node.level === 3 ? '岗位' :'未知'
+        const type = node.level === 1 ? '公司' : node.level === 2 ? '部门' : node.level === 3 ? '岗位' : '未知'
         formModalTitle.value = '编辑' + type + '信息'
         formModal.value = true
     } else if (key === 'del') {
@@ -175,7 +178,7 @@ const treeMenuTap = ({key, node, data}) => {
 const formModalSave = async () => {
     const isForm = await formValidate(formRef.value)
     if (isForm) {
-        const {error, code, msg} = await mainApi.submit(formModel.value)
+        const { error, code, msg } = await mainApi.submit(formModel.value)
         if (!error && code === 200) {
             window?.$message?.success(msg)
             getTreeData().then()
@@ -196,7 +199,7 @@ const formModalClose = () => {
 
 //删除节点
 const delNodeClick = async (data) => {
-    const {error, code, msg} = await mainApi.remove(data.id)
+    const { error, code, msg } = await mainApi.remove(data.id)
     if (!error && code === 200) {
         window?.$message?.success(msg)
         getTreeData().then()
@@ -211,7 +214,7 @@ const authTreeRef = ref(null)
 const treeMenuNode = ref([])
 const treeProps = ref({
     label: 'name',
-    children: 'children'
+    children: 'children',
 })
 
 //默认勾选的节点
@@ -225,11 +228,11 @@ const authModalShow = (data) => {
 }
 
 const getMenuData = async () => {
-    const {error, code, data} = await menuApi.lazyList({})
+    const { error, code, data } = await menuApi.lazyList({})
     if (!error && code === 200) {
         const arr = getArrValue(data)
         //移除系统设置的菜单
-        const index = arrIndex(arr, 'code', "system")
+        const index = arrIndex(arr, 'code', 'system')
         arr.splice(index, 1)
         //赋值
         treeMenuNode.value = arr
@@ -241,15 +244,15 @@ const getMenuData = async () => {
 //获取已勾选的菜单key
 const getMenuKeyApi = async (id) => {
     treeMenuKeys.value = []
-    const {error, code, data} = await mainApi.getMenuKeys(id)
+    const { error, code, data } = await mainApi.getMenuKeys(id)
     if (!error && code === 200) {
         let newArr = [], arr = getArrValue(data?.usermenu)
         arr.forEach((item)=>{
-            let res = item.split("---");
-            if(res[1] === 'all'){
+            let res = item.split('---')
+            if (res[1] === 'all') {
                 newArr.push(res[0])
             }
-        });
+        })
         treeMenuKeys.value.push(newArr)
         authTreeRef.value?.treeRef.setCheckedKeys(newArr)
     } else {
@@ -259,9 +262,9 @@ const getMenuKeyApi = async (id) => {
 
 //权限配置弹窗保存
 const authModalSave = async () => {
-    let id = treeInfo.value?.id, menuAll = [];
-    const menuList = authTreeRef.value?.treeRef.getCheckedKeys()        // 全选节点
-    const menuHalf = authTreeRef.value?.treeRef.getHalfCheckedKeys()    // 半选
+    let id = treeInfo.value?.id, menuAll = []
+    const menuList = authTreeRef.value?.treeRef.getCheckedKeys() // 全选节点
+    const menuHalf = authTreeRef.value?.treeRef.getHalfCheckedKeys() // 半选
     menuList.forEach((id)=>{
         menuAll.push(id + '---all')
     })
@@ -269,7 +272,7 @@ const authModalSave = async () => {
         menuAll.push(id + '---hanlf')
     })
     //发起请求
-    const {error, code, msg} = await mainApi.setMenuGrant(id, menuAll)
+    const { error, code, msg } = await mainApi.setMenuGrant(id, menuAll)
     if (!error && code === 200) {
         window?.$message?.success(msg)
         authModal.value = false

+ 104 - 96
src/views/system/user.vue

@@ -3,82 +3,89 @@
         <template #header>
             <div class="w-40">
                 <el-select v-model="searchForm.deptId" placeholder="选择岗位类型" clearable size="large">
-                    <el-option v-for="item in searchOrganization" :label="item.deptName" :value="item.id"/>
+                    <el-option v-for="item in searchOrganization" :label="item.deptName" :value="item.id" />
                 </el-select>
             </div>
             <div class="w-64 ml-3">
-                <el-input v-model="searchForm.realName" size="large" placeholder="请输入名称搜索" clearable/>
+                <el-input v-model="searchForm.realName" size="large" placeholder="请输入名称搜索" clearable />
             </div>
             <div class="ml-3">
-                <el-button type="primary" @click="searchClick" size="large">
-                    <HcIcon name="search-2"/>
+                <el-button type="primary" size="large" @click="searchClick">
+                    <HcIcon name="search-2" />
                     <span>搜索</span>
                 </el-button>
             </div>
         </template>
         <template #extra>
-            <el-button type="primary" @click="addUserClick" size="large">
-                <HcIcon name="add"/>
+            <el-button v-auth-btn="['system-user-add-btn']" type="primary" size="large" @click="addUserClick">
+                <HcIcon name="add" />
                 <span>创建账户</span>
             </el-button>
-            <el-button type="danger" @click="delClick" size="large" :disabled="tableCheckedKeys.length <= 0">
-                <HcIcon name="delete-bin-2"/>
+            <el-button v-auth-btn="['system-user-del-btn']" type="danger" size="large" :disabled="tableCheckedKeys.length <= 0" @click="delClick">
+                <HcIcon name="delete-bin-2" />
                 <span>注销账户</span>
             </el-button>
         </template>
-        <HcTable :column="tableColumn" :datas="tableData" isCheck @selection-change="tableSelectionChange" :loading="tableLoaing">
-            <template #status="{row}">
-                <span>{{row.status === 1 ? '启用': '停用'}}</span>
+        <HcTable :column="tableColumn" :datas="tableData" is-check :loading="tableLoaing" @selection-change="tableSelectionChange">
+            <template #status="{ row }">
+                <span>{{ row.status === 1 ? '启用' : '停用' }}</span>
             </template>
-            <template #action="{row}">
-                <el-button size="small" type="primary" @click="rowEidtClick(row)">编辑</el-button>
+            <template #action="{ row }">
+                <el-button v-auth-btn="['system-user-edit-btn']" size="small" type="primary" @click="rowEidtClick(row)">
+                    编辑
+                </el-button>
             </template>
         </HcTable>
         <template #action>
-            <HcPages :pages="searchForm" @change="pageChange"></HcPages>
+            <HcPages :pages="searchForm" @change="pageChange" />
         </template>
 
-        <!--用户信息弹窗-->
-        <HcDialog bgColor="#ffffff" isToBody isTable :show="formModal" :saveText="formModel.id ? '提交保存' : '确定创建'" :title="formModel.id ? '编辑账户' : '创建账户'"
-                  @save="formModalSave" @close="formModalClose" widths="51rem"
+        <!-- 用户信息弹窗 -->
+        <HcDialog
+            bg-color="#ffffff" is-to-body is-table :show="formModal" :save-text="formModel.id ? '提交保存' : '确定创建'" :title="formModel.id ? '编辑账户' : '创建账户'"
+            widths="51rem" @save="formModalSave" @close="formModalClose"
         >
             <HcCardItem ui="hac-bg-grey" class="h-auto">
                 <template #header>
-                    <div class="hac-card-title">基础信息</div>
+                    <div class="hac-card-title">
+                        基础信息
+                    </div>
                 </template>
                 <template #extra>
-                    <span class="text-sm text-orange" v-if="formModel.id">如果不需要修改密码,就请不要填写密码信息</span>
+                    <span v-if="formModel.id" class="text-sm text-orange">如果不需要修改密码,就请不要填写密码信息</span>
                 </template>
                 <el-form ref="formRef" :model="formModel" :rules="formRules" size="large" label-width="auto" label-position="left">
                     <el-form-item label="登录账号:" prop="account">
-                        <el-input v-model="formModel.account" placeholder="仅支持英文或拼音" autocomplete="new-password" onkeyup="value=value.replace(/[^\w\.\/]/ig,'')" :disabled="!!formModel.id"/>
+                        <el-input v-model="formModel.account" placeholder="仅支持英文或拼音" autocomplete="new-password" onkeyup="value=value.replace(/[^\w\.\/]/ig,'')" :disabled="!!formModel.id" />
                     </el-form-item>
-                    <el-form-item label="登录密码:" :prop="formModel.id?'':'password'">
-                        <el-input v-model="formModel.password" placeholder="请输入英文开头可包含数字的密码" autocomplete="new-password" show-password type="password" onkeyup="value=value.replace(/[^\w\.\/]/ig,'')"/>
+                    <el-form-item label="登录密码:" :prop="formModel.id ? '' : 'password'">
+                        <el-input v-model="formModel.password" placeholder="请输入英文开头可包含数字的密码" autocomplete="new-password" show-password type="password" onkeyup="value=value.replace(/[^\w\.\/]/ig,'')" />
                     </el-form-item>
-                    <el-form-item label="确认密码:" :prop="formModel.id?'':'password1'">
-                        <el-input v-model="formModel.password1" placeholder="请再次输入密码" autocomplete="new-password" show-password type="password" onkeyup="value=value.replace(/[^\w\.\/]/ig,'')"/>
+                    <el-form-item label="确认密码:" :prop="formModel.id ? '' : 'password1'">
+                        <el-input v-model="formModel.password1" placeholder="请再次输入密码" autocomplete="new-password" show-password type="password" onkeyup="value=value.replace(/[^\w\.\/]/ig,'')" />
                     </el-form-item>
                 </el-form>
             </HcCardItem>
             <HcCardItem ui="hac-bg-grey" class="h-auto mt-4">
                 <template #header>
-                    <div class="hac-card-title">机构信息</div>
+                    <div class="hac-card-title">
+                        机构信息
+                    </div>
                 </template>
                 <el-form ref="formRef3" :model="formModel" :rules="formRules" label-position="left" label-width="auto" size="large">
                     <el-form-item label="部门:" prop="deptId">
-                        <el-select v-model="formModel.deptId" placeholder="选择部门" style="width: 100%;" @change="getpostData" clearable>
-                                        <el-option v-for="item in sectionData" :label="item.deptName" :value="item.id"/>
+                        <el-select v-model="formModel.deptId" placeholder="选择部门" style="width: 100%;" clearable @change="getpostData">
+                            <el-option v-for="item in sectionData" :label="item.deptName" :value="item.id" />
                         </el-select>
                     </el-form-item>
                     <el-form-item label="岗位:" prop="postId">
-                        <el-select v-model="formModel.postId" placeholder="选择岗位" style="width: 100%;" clearable  :getdata="getpostData(formModel.deptId)">
+                        <el-select v-model="formModel.postId" placeholder="选择岗位" style="width: 100%;" clearable :getdata="getpostData(formModel.deptId)">
                             <el-option v-for="item in postData" :label="item.deptName" :value="item.id" />
                         </el-select>
                     </el-form-item>
                     <el-form-item label="部门负责人:">
-                        <el-select v-model="isLeaderIds" placeholder="是否为部门负责人"   style="width: 100%;" multiple clearable>
-                            <el-option v-for="item in userDeptData" :label="item.deptName" :value="item.id"/>
+                        <el-select v-model="isLeaderIds" placeholder="是否为部门负责人" style="width: 100%;" multiple clearable>
+                            <el-option v-for="item in userDeptData" :label="item.deptName" :value="item.id" />
                         </el-select>
                     </el-form-item>
                 </el-form>
@@ -121,44 +128,44 @@
 
             <HcCardItem ui="hac-bg-grey" class="h-auto mt-4">
                 <template #header>
-                    <div class="hac-card-title">详细信息</div>
+                    <div class="hac-card-title">
+                        详细信息
+                    </div>
                 </template>
                 <el-form ref="formRef1" :model="formModel" :rules="formRules" label-position="left" label-width="auto" size="large">
                     <el-form-item label="用户姓名:" prop="realName">
-                        <el-input v-model="formModel.realName"/>
+                        <el-input v-model="formModel.realName" />
                     </el-form-item>
                     <el-form-item label="手机号码:" prop="phone">
-                        <el-input v-model="formModel.phone" placeholder="请输入绑定手机"/>
+                        <el-input v-model="formModel.phone" placeholder="请输入绑定手机" />
                     </el-form-item>
                     <el-form-item label="身份证号:">
-                        <el-input v-model="formModel.idNumber"/>
+                        <el-input v-model="formModel.idNumber" />
                     </el-form-item>
                     <el-form-item label="日单价:" prop="oneMoney">
-                        <el-input v-model="formModel.oneMoney"/>
-
+                        <el-input v-model="formModel.oneMoney" />
                     </el-form-item>
                     <el-form-item label="启用状态:" prop="status">
                         <el-select v-model="formModel.status" class="block">
-                            <el-option label="启用" :value="1"/>
-                            <el-option label="停用" :value="0"/>
+                            <el-option label="启用" :value="1" />
+                            <el-option label="停用" :value="0" />
                         </el-select>
                     </el-form-item>
                 </el-form>
             </HcCardItem>
         </HcDialog>
-
     </HcCard>
 </template>
 
 <script setup>
-import {ref, onMounted} from "vue";
-import mainApi from '~api/system/user';
-import organizationApi from '~api/system/organization';
-import {arrIndex, arrToId, formValidate, isPhone, getArrValue, isIdCard} from "js-fast-way"
-import {Plus, Delete} from '@element-plus/icons-vue'
-import {delMessage} from "~uti/tools";
-import {useAppStore} from "~src/store";
-const useAppState = useAppStore();
+import { onMounted, ref } from 'vue'
+import mainApi from '~api/system/user'
+import organizationApi from '~api/system/organization'
+import { arrIndex, arrToId, formValidate, getArrValue, isIdCard, isPhone } from 'js-fast-way'
+import { Delete, Plus } from '@element-plus/icons-vue'
+import { delMessage } from '~uti/tools'
+import { useAppStore } from '~src/store'
+const useAppState = useAppStore()
 
 onMounted(() => {
     getTableData()
@@ -169,7 +176,7 @@ onMounted(() => {
 const searchOrganization = ref([])
 const getOrganization = async () => {
     const { error, code, data } = await organizationApi.getList({
-        deptType: 3
+        deptType: 3,
     })
     if (!error && code === 200) {
         searchOrganization.value = getArrValue(data)
@@ -180,10 +187,10 @@ const getOrganization = async () => {
 
 
 
-const searchForm = ref({deptId: null, realName: '', current: 1, size: 20, total: 0})
+const searchForm = ref({ deptId: null, realName: '', current: 1, size: 20, total: 0 })
 
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
     getTableData()
@@ -195,20 +202,20 @@ const searchClick = () => {
 
 //表格数据
 const tableColumn = [
-    {key: 'name', name: '用户名称'},
-    {key: 'account', name: '账号ID'},
-    {key: 'plaintextPassword', name: '密码'},
-    {key: 'deptName', name: '所属部门'},
-    {key: 'postName', name: '岗位'},
-    {key: 'createTime', name: '创建日期'},
-    {key: 'status', name: '启用状态'},
-    {key: 'action', name: '操作', width: 100}
+    { key: 'name', name: '用户名称' },
+    { key: 'account', name: '账号ID' },
+    { key: 'plaintextPassword', name: '密码' },
+    { key: 'deptName', name: '所属部门' },
+    { key: 'postName', name: '岗位' },
+    { key: 'createTime', name: '创建日期' },
+    { key: 'status', name: '启用状态' },
+    { key: 'action', name: '操作', width: 100 },
 ]
 const tableData = ref([])
 
 //获取表格数据
 const tableLoaing = ref(false)
-const getTableData = async()=>{
+const getTableData = async ()=>{
     tableLoaing.value = true
     const { error, code, data } = await mainApi.page(searchForm.value)
     tableLoaing.value = false
@@ -221,7 +228,7 @@ const getTableData = async()=>{
     }
 }
 
-const tableCheckedKeys = ref([]);
+const tableCheckedKeys = ref([])
 const tableSelectionChange = (rows) => {
     tableCheckedKeys.value = rows
 }
@@ -232,7 +239,7 @@ const formModal = ref(false)
 //用户信息表单
 const formRef = ref(null)
 const formRef1 = ref(null)
-const formRef3=ref(null)
+const formRef3 = ref(null)
 
 //循环表单的ref
 const formRefs = ref([])
@@ -242,7 +249,7 @@ const setFormItemRefs = (el, index) => {
         if (indexs !== -1) {
             formRefs.value[index].ref = el
         } else {
-            formRefs.value.push({index: index, ref: el});
+            formRefs.value.push({ index: index, ref: el })
         }
     }
 }
@@ -255,16 +262,17 @@ const getFormRef = async (index) => {
 const formModel = ref({
     // deptList: [{isLeader: 0}], status: 1
 })
-const isLeaderIds=ref([])
+const isLeaderIds = ref([])
 const formRules = {
-    account: [{required: true, message: '请输入登录账号', trigger: 'blur'}],
-    password: [{required: true, message: '请输入密码', trigger: 'blur'}],
-    password1: [{required: true, message: '请输入确认密码', trigger: 'blur'}],
-    deptId: [{required: true, message: '请选择选择部门', trigger: 'change'}],
-    postId: [{required: true, message: '请选择选择岗位', trigger: 'change'}],
-
-    oneMoney: [{required: true, message: '请输入日单价', trigger: 'blur'}],
-    status: [{required: true, message: '请选择启用状态', trigger: 'change'}],
+    realName: [{ required: true, message: '请输入用户姓名', trigger: 'blur' }],
+    account: [{ required: true, message: '请输入登录账号', trigger: 'blur' }],
+    password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
+    password1: [{ required: true, message: '请输入确认密码', trigger: 'blur' }],
+    deptId: [{ required: true, message: '请选择选择部门', trigger: 'change' }],
+    postId: [{ required: true, message: '请选择选择岗位', trigger: 'change' }],
+
+    oneMoney: [{ required: true, message: '请输入日单价', trigger: 'blur' }],
+    status: [{ required: true, message: '请选择启用状态', trigger: 'change' }],
     phone: {
         required: true,
         validator: (rule, value, callback) => {
@@ -276,29 +284,29 @@ const formRules = {
                 callback()
             }
         },
-        trigger: "blur"
+        trigger: 'blur',
     },
 }
 
 //添加用户
 const addUserClick = () => {
-    isLeaderIds.value=[]
+    isLeaderIds.value = []
     formModel.value = {
         // deptList: [{isLeader: 0}],
         tenantId: useAppState.tenantId,
         status: 1,
-        userType: 5
+        userType: 5,
     }
     postData.value = [{}]
     formModal.value = true
-    getSectionData();
-    getUserDeptData();
+    getSectionData()
+    getUserDeptData()
 }
 
 //编辑用户信息
 const rowEidtClick = (row) => {
     // const deptList = getArrValue(row.deptList)
-    isLeaderIds.value=[]
+    isLeaderIds.value = []
     //设置表单数据
     const form = {
         id: row.id,
@@ -328,23 +336,23 @@ const rowEidtClick = (row) => {
     // }
     //设置表单数据
     formModel.value = form
-    if(form?.isLeader){
-        isLeaderIds.value=form?.isLeader?.split(',')
-    }else{
-        isLeaderIds.value=[]
+    if (form?.isLeader) {
+        isLeaderIds.value = form?.isLeader?.split(',')
+    } else {
+        isLeaderIds.value = []
     }
 
     formModal.value = true
     getSectionData()
 
     // 获取下拉框   部门负责人
-    getUserDeptData();
+    getUserDeptData()
 }
 
 //部门下拉数据
 const sectionData = ref([])
 const getSectionData = async () => {
-    const { error, code, data } = await organizationApi.getList({deptType: 2})
+    const { error, code, data } = await organizationApi.getList({ deptType: 2 })
     if (!error && code === 200) {
         sectionData.value = getArrValue(data)
     } else {
@@ -354,10 +362,10 @@ const getSectionData = async () => {
 
 //获取岗位数据
 const postData = ref([])
-const getpostData=async(id)=>{
-    if(id){
+const getpostData = async (id)=>{
+    if (id) {
         //获取岗位数据
-         const { error, code, data } = await organizationApi.getList({parentId: id})
+         const { error, code, data } = await organizationApi.getList({ parentId: id })
         if (!error && code === 200) {
             postData.value = getArrValue(data)
         } else {
@@ -382,14 +390,14 @@ const getUserDeptData = async () => {
 const initPostData = async (id, index) => {
     if (id) {
         //获取岗位数据
-        const { error, code, data } = await organizationApi.getList({parentId: id})
+        const { error, code, data } = await organizationApi.getList({ parentId: id })
         if (!error && code === 200) {
             postData.value[index] = getArrValue(data)
         } else {
             postData.value[index] = []
         }
         //处理负责人限制
-        let isLeader = 0;
+        let isLeader = 0
         const deptList = formModel.value.deptList
         deptList.forEach((item, indexs) => {
             if (item.deptId === id) {
@@ -423,7 +431,7 @@ const isLeaderChange = (id, index) => {
 
 //新增组织
 const addOrganizationClick = () => {
-    formModel.value.deptList.push({isLeader: 0})
+    formModel.value.deptList.push({ isLeader: 0 })
     postData.value.push({})
 }
 
@@ -439,15 +447,15 @@ const formModalSave = async () => {
     const isForm = await formValidate(formRef.value)
     const isForm1 = await formValidate(formRef1.value)
     const isForm3 = await formValidate(formRef3.value)
-    if (!isForm || !isForm1||!isForm3) {
+    if (!isForm || !isForm1 || !isForm3) {
         window.$message?.error('请先完善表单信息')
         return
     }
     const form = formModel.value
-    console.log(form,'form');
-    let isLeader=isLeaderIds.value.join()
-    form.isLeader=isLeader
-    form.roleId=form.postId
+    console.log(form, 'form')
+    let isLeader = isLeaderIds.value.join()
+    form.isLeader = isLeader
+    form.roleId = form.postId
     //判断密码是否一致
     if (form.password && !form.password1) {
         window.$message?.error('请输入确认密码')
@@ -480,7 +488,7 @@ const formModalSave = async () => {
 
 //新增用户
 const formSubmitApi = async (form) => {
-    const {error, code, msg} = await mainApi.submit({
+    const { error, code, msg } = await mainApi.submit({
         ...form,
         name: form.realName,
     })
@@ -496,7 +504,7 @@ const formSubmitApi = async (form) => {
 
 //修改用户
 const formUpdateApi = async (form) => {
-    const {error, code, msg} = await mainApi.update({
+    const { error, code, msg } = await mainApi.update({
         ...form,
         name: form.realName,
     })

+ 2 - 2
src/views/task/logs/index.vue

@@ -39,12 +39,12 @@
                 <span>提交日志</span>
             </el-button>
             <template v-else>
-                <el-button v-if="!isShowEdit" size="large" type="primary" @click="editLogsClick">
+                <el-button v-if="!isShowEdit" v-auth-btn="['task-logs-edit-btn']" size="large" type="primary" @click="editLogsClick">
                     <HcIcon name="add" />
                     <span>写日志</span>
                 </el-button>
                 <!-- 修改自己的日志 -->
-                <el-button v-else size="large" type="primary" @click="editmyLog">
+                <el-button v-else v-auth-btn="['task-logs-edit-btn']" size="large" type="primary" @click="editmyLog">
                     <HcIcon name="add" />
                     <span>修改日志</span>
                 </el-button>

+ 1 - 1
src/views/task/plan/components/TaskTable.vue

@@ -37,7 +37,7 @@
             </div>
         </template>
         <template #extra>
-            <el-button size="large" :type="isTableKey === 1 ? 'primary' : 'info'" :disabled="isTableKey !== 1" hc-btn @click="showChangeState">
+            <el-button v-auth-btn="['task-plan-edit-btn']" size="large" :type="isTableKey === 1 ? 'primary' : 'info'" :disabled="isTableKey !== 1" hc-btn @click="showChangeState">
                 <HcIcon name="edit-circle" />
                 <span>变更状态</span>
             </el-button>