Ver Fonte

代码优化

duy há 2 anos atrás
pai
commit
f8dfc5052a
38 ficheiros alterados com 2378 adições e 2438 exclusões
  1. 12 12
      src/App.vue
  2. 94 94
      src/views/project/contract/components/base.vue
  3. 32 29
      src/views/project/contract/components/file.vue
  4. 56 61
      src/views/project/contract/components/milestone.vue
  5. 18 18
      src/views/project/contract/components/record.vue
  6. 94 99
      src/views/project/contract/form.vue
  7. 47 53
      src/views/project/contract/index.vue
  8. 67 66
      src/views/project/cost/data.vue
  9. 212 213
      src/views/project/cost/form.vue
  10. 50 52
      src/views/project/cost/index.vue
  11. 72 73
      src/views/project/list/index.vue
  12. 123 119
      src/views/project/list/list-info.vue
  13. 28 28
      src/views/risk/warning.vue
  14. 81 79
      src/views/static/actual.vue
  15. 107 113
      src/views/static/components/tab-all.vue
  16. 64 68
      src/views/static/components/tab-decost.vue
  17. 55 60
      src/views/static/components/tab-mannager.vue
  18. 61 65
      src/views/static/components/tab-month.vue
  19. 67 67
      src/views/static/plan.vue
  20. 96 80
      src/views/static/project.vue
  21. 21 20
      src/views/system/components/HcTreeData.vue
  22. 4 4
      src/views/system/components/tab-approve.vue
  23. 83 83
      src/views/system/components/tab-cost.vue
  24. 42 41
      src/views/system/components/tab-invoice.vue
  25. 203 224
      src/views/system/components/tab-other.vue
  26. 107 107
      src/views/system/components/tab-price-type.vue
  27. 44 42
      src/views/system/components/tab-price.vue
  28. 42 41
      src/views/system/components/tab-reimbursement.vue
  29. 51 51
      src/views/system/components/tab-task-type.vue
  30. 66 54
      src/views/system/menu.vue
  31. 25 27
      src/views/system/parameter.vue
  32. 98 157
      src/views/system/user.vue
  33. 2 2
      src/views/task/logs/components/logs-content.vue
  34. 5 5
      src/views/task/logs/index.vue
  35. 6 7
      src/views/task/plan/components/TaskTable.vue
  36. 7 8
      src/views/task/plan/index.vue
  37. 27 22
      src/views/user/config.vue
  38. 109 94
      src/views/user/index.vue

+ 12 - 12
src/App.vue

@@ -1,16 +1,16 @@
 <template>
     <HcAppConfig>
-        <router-view/>
+        <router-view />
     </HcAppConfig>
 </template>
 
 <script setup>
-import {nextTick, ref, watch} from "vue";
-import {useAppStore} from "~src/store";
-import {useOsTheme} from 'hc-vue3-ui'
-import {setElementMainColor, getObjValue} from "js-fast-way"
-import {getStoreValue, setStoreValue} from "~uti/storage";
-import {getVersionJson} from "~api/other";
+import { nextTick, ref, watch } from 'vue'
+import { useAppStore } from '~src/store'
+import { useOsTheme } from 'hc-vue3-ui'
+import { getObjValue, setElementMainColor } from 'js-fast-way'
+import { getStoreValue, setStoreValue } from '~uti/storage'
+import { getVersionJson } from '~api/other'
 
 //初始变量
 const appStore = useAppStore()
@@ -20,7 +20,7 @@ const UserTheme = ref(appStore.getTheme)
 watch(() => [
     appStore.getTheme,
     appStore.getThemeVal,
-    appStore.getColor
+    appStore.getColor,
 ], ([Theme, ThemeVal, ColorVal]) => {
     UserTheme.value = Theme
     setUserTheme(ThemeVal, ColorVal)
@@ -41,7 +41,7 @@ nextTick(() => {
 //获取版本更新信息
 const getVersionJsonApi = async () => {
     const cache_version = getStoreValue('version')
-    const {res} = await getVersionJson()
+    const { res } = await getVersionJson()
     const version = getObjValue(res)?.value
     setStoreValue('version', version)
     if (cache_version && cache_version !== version) {
@@ -55,7 +55,7 @@ const getVersionJsonApi = async () => {
                     //刷新页面
                     window.location.reload()
                 }
-            }
+            },
         })
     }
 }
@@ -69,10 +69,10 @@ const setUserTheme = (theme, appColor) => {
     //设置主题
     let val = UserTheme.value
     if (val === 'auto') {
-        theme = useOsTheme();
+        theme = useOsTheme()
     }
     if (theme === '') {
-        theme = val;
+        theme = val
     }
     //挂载相关样式
     document.documentElement.setAttribute('class', `${theme} color-${colorName}`)

+ 94 - 94
src/views/project/contract/components/base.vue

@@ -1,89 +1,93 @@
 <template>
-    <HcCard actionUi="text-center">
+    <HcCard action-ui="text-center">
         <div class="hc-project-contract-form-base" :class="isDisabled ? 'hc-card-form-center' : ''">
             <div class="base-form-box">
                 <el-scrollbar>
-                    <el-form ref="formBaseRef"
-                             :model="formBaseModel"
-                             :rules="formBaseRules"
-                             
-                             label-position="left"
-                             label-width="auto"
-                             size="large"
+                    <el-form
+                        ref="formBaseRef"
+                        :model="formBaseModel"
+                        :rules="formBaseRules"
+                        label-position="left"
+                        label-width="auto"
+                        size="large"
                     >
                         <el-form-item label="合同编号:">
-                            <el-input v-model="formBaseModel.number" :disabled="isDisabled"/>
+                            <el-input v-model="formBaseModel.number" :disabled="isDisabled" />
                         </el-form-item>
                         <el-form-item label="合同名称:" prop="name">
-                            <el-input v-model="formBaseModel.name" :disabled="isDisabled"/>
+                            <el-input v-model="formBaseModel.name" :disabled="isDisabled" />
                         </el-form-item>
                   
                         <el-form-item label="合同类型:" prop="contractType">
-                                    <el-select v-model="formBaseModel.contractType" block clearable placeholder="合同类型:" :disabled="isDisabled">
-                                        <el-option v-for="item in contractTypeval" :label="item.dictName" :value="item.dictValue"/>
-                                    </el-select>
+                            <el-select v-model="formBaseModel.contractType" block clearable placeholder="合同类型:" :disabled="isDisabled">
+                                <el-option v-for="item in contractTypeval" :key="item.dictValue" :label="item.dictName" :value="item.dictValue" />
+                            </el-select>
                         </el-form-item>
                         <el-form-item label="合同金额:" prop="contractMoney">
-                            <el-input v-model="formBaseModel.contractMoney" :disabled="isDisabled"/>
+                            <el-input v-model="formBaseModel.contractMoney" :disabled="isDisabled" />
                         </el-form-item>
                         <el-form-item label="所属项目:" prop="projectId" block clearable placeholder="所属项目:">
-                            <el-select block v-model="formBaseModel.projectId"  :disabled="isDisabled||dataType==='edit'">
-                                <el-option v-for="item in projectListval" :label="item.name" :value="item.id"/>
+                            <el-select v-model="formBaseModel.projectId" block :disabled="isDisabled || dataType === 'edit'">
+                                <el-option v-for="item in projectListval" :key="item.id" :label="item.name" :value="item.id" />
                             </el-select>
                         </el-form-item>
                         <el-form-item label="签订时间:" prop="contractSignTime">
-                            <el-date-picker class="block" v-model="formBaseModel.contractSignTime" format="YYYY-MM-DD" type="date" value-format="YYYY-MM-DD"  :disabled="isDisabled"/>
+                            <el-date-picker v-model="formBaseModel.contractSignTime" class="block" format="YYYY-MM-DD" type="date" value-format="YYYY-MM-DD" :disabled="isDisabled" />
                         </el-form-item>
-                        <el-form-item label="合同起止日期:"  >
-                            <HcDatePicker :dates="betweenTime" clearable  @change="betweenTimeUpdate"  :disabled="isDisabled"/>
+                        <el-form-item label="合同起止日期:">
+                            <HcDatePicker :dates="betweenTime" clearable :disabled="isDisabled" @change="betweenTimeUpdate" />
                         </el-form-item>
                         <el-form-item label="对方单位回款联系人名称:">
-                            <el-input v-model="formBaseModel.returnedUserName" :disabled="isDisabled"/>
+                            <el-input v-model="formBaseModel.returnedUserName" :disabled="isDisabled" />
                         </el-form-item>
                         <el-form-item label="对方单位回款联系人电话:">
-                            <el-input v-model="formBaseModel.returnedUserPhone" :disabled="isDisabled"/>
+                            <el-input v-model="formBaseModel.returnedUserPhone" :disabled="isDisabled" />
                         </el-form-item>
                         <el-form-item label="合同已履约回款:">
-                            <el-input v-model="formBaseModel.returnedMoney" disabled/>
+                            <el-input v-model="formBaseModel.returnedMoney" disabled />
                         </el-form-item>
                         <el-form-item label="合同未履约回款:">
-                            <el-input v-model="formBaseModel.unreturnedMoney" disabled/>
+                            <el-input v-model="formBaseModel.unreturnedMoney" disabled />
                         </el-form-item>
                     </el-form>
                 </el-scrollbar>
             </div>
-            <div class="base-invoice-box" v-if="!isDisabled">
+            <div v-if="!isDisabled" class="base-invoice-box">
                 <el-scrollbar>
-                    <div class="title">开票相关信息</div>
+                    <div class="title">
+                        开票相关信息
+                    </div>
                     <div class="invoice-form">
-                        <el-form ref="formInvoiceRef"
-                                 :model="formBaseModel"
-                                 :rules="formInvoiceRules"
-                                 :disabled="isDisabled"
-                                 label-position="left"
-                                 label-width="auto"
-                                 size="large"
+                        <el-form
+                            ref="formInvoiceRef"
+                            :model="formBaseModel"
+                            :rules="formInvoiceRules"
+                            :disabled="isDisabled"
+                            label-position="left"
+                            label-width="auto"
+                            size="large"
                         >
                             <el-form-item label="发票抬头:">
-                                <el-input v-model="formBaseModel.invoiceHead"/>
+                                <el-input v-model="formBaseModel.invoiceHead" />
                             </el-form-item>
                             <el-form-item label="纳税人识别号:">
-                                <el-input v-model="formBaseModel.taxpayerNumber"/>
+                                <el-input v-model="formBaseModel.taxpayerNumber" />
                             </el-form-item>
                             <el-form-item label="开户银行:">
-                                <el-input v-model="formBaseModel.openAccountBank"/>
+                                <el-input v-model="formBaseModel.openAccountBank" />
                             </el-form-item>
                             <el-form-item label="银行账户:">
-                                <el-input v-model="formBaseModel.bankAccount"/>
+                                <el-input v-model="formBaseModel.bankAccount" />
                             </el-form-item>
                             <el-form-item label="收件人:">
-                                <el-input v-model="formBaseModel.addresseeUserName"/>
+                                <el-input v-model="formBaseModel.addresseeUserName" />
                             </el-form-item>
                             <el-form-item label="联系电话:">
-                                <el-input v-model="formBaseModel.addresseePhone"/>
+                                <el-input v-model="formBaseModel.addresseePhone" />
                             </el-form-item>
                             <el-form-item label="邮寄地址:">
-                                <el-input v-model="formBaseModel.mailingAddress"
+                                <el-input
+                                    v-model="formBaseModel.mailingAddress"
                                     :autosize="{ minRows: 5, maxRows: 8 }"
                                     type="textarea"
                                 />
@@ -95,12 +99,12 @@
         </div>
         <template #action>
             <el-button size="large" type="info" hc-btn @click="goBackClick">
-                <HcIcon name="arrow-go-back"/>
+                <HcIcon name="arrow-go-back" />
                 <span v-if="isDisabled">返回上一级</span>
                 <span v-else>取消并返回</span>
             </el-button>
-            <el-button size="large" type="primary" hc-btn @click="saveClick" v-if="!isDisabled" :loading="saveLoaingVal">
-                <HcIcon name="check-double"/>
+            <el-button v-if="!isDisabled" size="large" type="primary" hc-btn :loading="saveLoaingVal" @click="saveClick">
+                <HcIcon name="check-double" />
                 <span>提交保存</span>
             </el-button>
         </template>
@@ -108,81 +112,81 @@
 </template>
 
 <script setup>
-import {ref, watch,onActivated} from "vue";
-import {useRouter,useRoute} from 'vue-router'
-import {getArrValue,formValidate} from "js-fast-way"
+import { ref, watch } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import { formValidate } from 'js-fast-way'
 
 
-const router = useRouter()
-const useRoutes = useRoute()
-const dataType = ref(useRoutes?.query?.type ?? '')
 //参数
 const props = defineProps({
     datas: {
         type: Object,
-        default: () => ({})
+        default: () => ({}),
     },
     disabled: {
         type: Boolean,
-        default: false
+        default: false,
     },
     saveLoaing:{
         type: Boolean,
-        default: false
+        default: false,
     },
     contractType:{
         type:Array,
-        default:()=>([])
+        default:()=>([]),
     },
     projectList:{
         type:Array,
-        default:()=>([])
+        default:()=>([]),
     },
     isres:{
         type: Boolean,
-        default: false//验证是否可以保存
-    }
+        default: false, //验证是否可以保存
+    },
  
 })
-
+const emit = defineEmits(['saveClick', 'update:datas', 'changeIsres'])
+const router = useRouter()
+const useRoutes = useRoute()
+const dataType = ref(useRoutes?.query?.type ?? '')
 const infoData = ref(props.datas)
 const isDisabled = ref(props.disabled)
-const saveLoaingVal=ref(props.saveLoaing)
+const saveLoaingVal = ref(props.saveLoaing)
 const formBaseModel = ref(props.datas)
 const isresdata = ref(props.isres)
 //获取合同类型
-const contractTypeval=ref(props.contractType)
+const contractTypeval = ref(props.contractType)
 
 //所属项目projectList
-const projectListval=ref(props.projectList)
+const projectListval = ref(props.projectList)
 
 //深度监听
 watch(() => [
     props.datas,
     formBaseModel,
-    props.isres
-], ([datas,val,isres]) => {
-    console.log(val,'val');
+    props.isres,
+], ([datas, val, isres]) => {
+    console.log(val, 'val')
     emit('update:datas', val)
-    dataType.value=useRoutes?.query?.type ?? ''
+    dataType.value = useRoutes?.query?.type ?? ''
     infoData.value = datas
-    formBaseModel.value=datas
-    betweenTime.value[0]=val.value['startTime']
-    betweenTime.value[1]=val.value['endTime']
-    isresdata.value=isres
-}, {deep: true})
+    formBaseModel.value = datas
+    betweenTime.value[0] = val.value['startTime']
+    betweenTime.value[1] = val.value['endTime']
+    isresdata.value = isres
+}, { deep: true })
 
 //监听
 watch(() => [
     props.disabled,
     props.saveLoaing,
     props.contractType,
-    props.projectList
-], ([disabled,saveLoaing,contractType,projectList]) => {
+    props.projectList,
+], ([disabled, saveLoaing, contractType, projectList]) => {
     isDisabled.value = disabled
-    saveLoaingVal.value=saveLoaing
-    contractTypeval.value=contractType
-    projectListval.value=projectList
+    saveLoaingVal.value = saveLoaing
+    contractTypeval.value = contractType
+    projectListval.value = projectList
 })
 
 //基础表单
@@ -190,35 +194,35 @@ const formBaseRef = ref(null)
 
 const formBaseRules = {
     name: [
-        {required: true, message: '请输入合同名称', trigger: 'blur'},
+        { required: true, message: '请输入合同名称', trigger: 'blur' },
     ],
     contractType: [
-        {required: true, message: '请选择合同类型', trigger: 'blur'},
+        { required: true, message: '请选择合同类型', trigger: 'blur' },
     ],
     projectId: [
-        {required: true, message: '请选择所属项目', trigger: 'blur'},
+        { required: true, message: '请选择所属项目', trigger: 'blur' },
     ],
     contractMoney: [
-        {required: true, message: '请输入合同金额', trigger: 'blur'},
+        { required: true, message: '请输入合同金额', trigger: 'blur' },
     ],
     contractSignTime: [
-        {required: true, message: '请选择签订时间', trigger: 'blur'},
+        { required: true, message: '请选择签订时间', trigger: 'blur' },
     ],
   
 }
 
 //日期时间被选择
-const betweenTime = ref([ infoData.value['startTime'],infoData.value['endTime']])
-const betweenTimeUpdate = ({arr, query}) => {
+const betweenTime = ref([ infoData.value['startTime'], infoData.value['endTime']])
+const betweenTimeUpdate = ({ arr }) => {
     betweenTime.value = arr
-    formBaseModel.value.startTime=arr[0]
-    formBaseModel.value.endTime=arr[1]
+    formBaseModel.value.startTime = arr[0]
+    formBaseModel.value.endTime = arr[1]
 }
 
 
 //开发票表单
 const formInvoiceRef = ref(null)
-const formInvoiceModel = ref({})
+
 const formInvoiceRules = {}
 
 
@@ -226,27 +230,23 @@ const formInvoiceRules = {}
 const goBackClick = () => {
     router.back()
 }
-const emit= defineEmits(['saveClick',"update:datas","changeIsres"])
-
 //提交保存
-const saveClick = async() => {
-    console.log(formBaseModel.value,'formBaseModel');
-    let startTime=formBaseModel.value.startTime
-    let endTime=formBaseModel.value.endTime
-    if(!startTime||!endTime){
+const saveClick = async () => {
+    console.log(formBaseModel.value, 'formBaseModel')
+    let startTime = formBaseModel.value.startTime
+    let endTime = formBaseModel.value.endTime
+    if (!startTime || !endTime) {
         window.$message.warning('请选择合同起止日期')
     }
     const res = await formValidate(formBaseRef.value)
-    emit('changeIsres',res)
-    if(res&&startTime&&endTime){
+    emit('changeIsres', res)
+    if (res && startTime && endTime) {
         emit('saveClick')
     }
     
  
 
 }
-
-
 </script>
 
 <style scoped lang="scss">

+ 32 - 29
src/views/project/contract/components/file.vue

@@ -1,32 +1,34 @@
 <template>
-    <HcCard actionUi="text-center">
-        <div class="hc-tabs-simple-extra-btn" v-if="infoData.pdfUrl && !isDisabled">
+    <HcCard action-ui="text-center">
+        <div v-if="infoData.pdfUrl && !isDisabled" class="hc-tabs-simple-extra-btn">
             <el-button size="large" type="primary" hc-btn @click="reuploadClick">
-                <HcIcon name="upload-cloud-2"/>
+                <HcIcon name="upload-cloud-2" />
                 <span>点击重新上传</span>
             </el-button>
         </div>
 
         <div class="hc-project-contract-form-file">
-            <div class="hc-form-file-pdf" v-show="infoData.pdfUrl">
-                <HcPdf :src="infoData.pdfUrl"/>
+            <div v-show="infoData.pdfUrl" class="hc-form-file-pdf">
+                <HcPdf :src="infoData.pdfUrl" />
             </div>
-            <div class="hc-form-file-upload" v-show="!infoData.pdfUrl">
-                <HcUploadFile ref="HcUploadFileRef" :options="UploadFileOptions" @success="HcUploadFileSuccess" drop v-if="!isDisabled">
-                    <div class="accept-tip">支持的文件格式:图片(png、jpg、jpeg)、 Excel(xls、xlsx) PDF 、Word(doc、docx)</div>
+            <div v-show="!infoData.pdfUrl" class="hc-form-file-upload">
+                <HcUploadFile v-if="!isDisabled" ref="HcUploadFileRef" :options="UploadFileOptions" drop @success="HcUploadFileSuccess">
+                    <div class="accept-tip">
+                        支持的文件格式:图片(png、jpg、jpeg)、 Excel(xls、xlsx) PDF 、Word(doc、docx)
+                    </div>
                 </HcUploadFile>
-                <HcStatus text="未上传相关附件文件" v-else/>
+                <HcStatus v-else text="未上传相关附件文件" />
             </div>
         </div>
 
         <template #action>
             <el-button size="large" type="info" hc-btn @click="goBackClick">
-                <HcIcon name="arrow-go-back"/>
+                <HcIcon name="arrow-go-back" />
                 <span v-if="isDisabled">返回上一级</span>
                 <span v-else>取消并返回</span>
             </el-button>
-            <el-button size="large" type="primary" hc-btn @click="saveClick" v-if="!isDisabled" :loading="saveLoaingVal">
-                <HcIcon name="check-double"/>
+            <el-button v-if="!isDisabled" size="large" type="primary" hc-btn :loading="saveLoaingVal" @click="saveClick">
+                <HcIcon name="check-double" />
                 <span>提交保存</span>
             </el-button>
         </template>
@@ -34,33 +36,35 @@
 </template>
 
 <script setup>
-import {ref, watch} from "vue";
-import {useRouter} from 'vue-router'
-import {getObjValue} from "js-fast-way";
-import {getTokenHeader} from "~src/api/request/header";
-
-const router = useRouter()
+import { ref, watch } from 'vue'
+import { useRouter } from 'vue-router'
+import { getObjValue } from 'js-fast-way'
+import { getTokenHeader } from '~src/api/request/header'
 
 //参数
 const props = defineProps({
     datas: {
         type: Object,
-        default: () => ({})
+        default: () => ({}),
     },
     disabled: {
         type: Boolean,
-        default: false
+        default: false,
     },
     saveLoaing:{
         type: Boolean,
-        default: false
+        default: false,
     },
 
 })
 
+const emit = defineEmits(['saveClick', 'update:datas'])
+
+const router = useRouter()
+
 const infoData = ref(props.datas)
 const isDisabled = ref(props.disabled)
-const saveLoaingVal=ref(props.saveLoaing)
+const saveLoaingVal = ref(props.saveLoaing)
 
 
 //深度监听
@@ -68,19 +72,19 @@ watch(() => [
     props.datas,
     infoData,
    
-], ([datas,infoData]) => {
+], ([datas, infoData]) => {
     infoData.value = datas
     emit('update:datas', infoData)
    
-}, {deep: true})
+}, { deep: true })
 
 //监听
 watch(() => [
     props.disabled,
     props.saveLoaing,
-], ([disabled,saveLoaing]) => {
+], ([disabled, saveLoaing]) => {
     isDisabled.value = disabled
-    saveLoaingVal.value=saveLoaing
+    saveLoaingVal.value = saveLoaing
 })
 
 //上传配置
@@ -93,7 +97,7 @@ const UploadFileOptions = {
 const HcUploadFileSuccess = (res) => {
     const { pdfUrl } = getObjValue(res.resData)
     infoData.value.pdfUrl = pdfUrl
-    HcUploadFileRef.value?.setModalShow(false);
+    HcUploadFileRef.value?.setModalShow(false)
 }
 
 //重新上传
@@ -106,10 +110,9 @@ const goBackClick = () => {
     router.back()
 }
 
-const emit= defineEmits(['saveClick',"update:datas"])
 //提交保存
 const saveClick = () => {
-    console.log(infoData.value,'infoData');
+    console.log(infoData.value, 'infoData')
 
         emit('saveClick')
  

+ 56 - 61
src/views/project/contract/components/milestone.vue

@@ -1,60 +1,59 @@
 <template>
-    <HcCard actionUi="text-center">
+    <HcCard action-ui="text-center">
         <template #extra>
-            <div v-if="infoData.length===0">
+            <div v-if="infoData.length === 0">
                 <el-button size="small" type="primary" :disabled="isDisabled" @click="addRow">
-                    <HcIcon name="add"/>
+                    <HcIcon name="add" />
                     <span>新增</span>
                 </el-button>
             </div>
-          
         </template>
         <HcTable :column="tableColumn" :datas="infoData">
-            <template #returnedCondition="{row,index}">
-                <span v-if="isDisabled">{{row.returnedCondition}}</span>
-                <el-input v-model="row.returnedCondition" v-else />
+            <template #returnedCondition="{ row }">
+                <span v-if="isDisabled">{{ row.returnedCondition }}</span>
+                <el-input v-else v-model="row.returnedCondition" />
             </template>
-            <template #shouldReturnedTime="{row,index}">
-                <span v-if="isDisabled">{{row.shouldReturnedTime}}</span>
-                <el-date-picker class="block" v-model="row.shouldReturnedTime" format="YYYY-MM-DD" type="date" value-format="YYYY-MM-DD" v-else/>
+            <template #shouldReturnedTime="{ row }">
+                <span v-if="isDisabled">{{ row.shouldReturnedTime }}</span>
+                <el-date-picker v-else v-model="row.shouldReturnedTime" class="block" format="YYYY-MM-DD" type="date" value-format="YYYY-MM-DD" />
             </template>
-            <template #shouldReturnedMoney="{row,index}">
-                <span v-if="isDisabled">{{row.shouldReturnedMoney}}</span>
-                <el-input v-model="row.shouldReturnedMoney" v-else/>
+            <template #shouldReturnedMoney="{ row }">
+                <span v-if="isDisabled">{{ row.shouldReturnedMoney }}</span>
+                <el-input v-else v-model="row.shouldReturnedMoney" />
             </template>
-            <template #practicalReturnedTime="{row,index}">
-                <span v-if="isDisabled">{{row.practicalReturnedTime}}</span>
-                <el-date-picker class="block" v-model="row.practicalReturnedTime" format="YYYY-MM-DD" type="date" value-format="YYYY-MM-DD" v-else disabled/>
+            <template #practicalReturnedTime="{ row }">
+                <span v-if="isDisabled">{{ row.practicalReturnedTime }}</span>
+                <el-date-picker v-else v-model="row.practicalReturnedTime" class="block" format="YYYY-MM-DD" type="date" value-format="YYYY-MM-DD" disabled />
             </template>
-            <template #practicalReturnedMoney="{row,index}">
-                <span v-if="isDisabled">{{row.practicalReturnedMoney}}</span>
-                <el-input v-model="row.practicalReturnedMoney" v-else disabled/>
+            <template #practicalReturnedMoney="{ row }">
+                <span v-if="isDisabled">{{ row.practicalReturnedMoney }}</span>
+                <el-input v-else v-model="row.practicalReturnedMoney" disabled />
             </template>
-            <template #reminderUser="{row,index}">
-                <span v-if="isDisabled">{{row.reminderUserName}}</span>
-                <el-select v-model="row.reminderUser" block  placeholder="请选择" v-else>
-                                        <el-option v-for="item in reminderUserList" :label="item.name" :value="item.id"/>
-                 </el-select>
+            <template #reminderUser="{ row }">
+                <span v-if="isDisabled">{{ row.reminderUserName }}</span>
+                <el-select v-else v-model="row.reminderUser" block placeholder="请选择">
+                    <el-option v-for="item in reminderUserList" :key="item.id" :label="item.name" :value="item.id" />
+                </el-select>
             </template>
-            <template #action="{row,index}">
-                <el-button size="small" type="primary" :disabled="isDisabled"  @click="addRow">
-                    <HcIcon name="add"/>
+            <template #action="{ index }">
+                <el-button size="small" type="primary" :disabled="isDisabled" @click="addRow">
+                    <HcIcon name="add" />
                     <span>新增</span>
                 </el-button>
-                <el-button size="small" type="danger" :disabled="isDisabled"  @click="delRow(index)">
-                    <HcIcon name="delete-bin"/>
+                <el-button size="small" type="danger" :disabled="isDisabled" @click="delRow(index)">
+                    <HcIcon name="delete-bin" />
                     <span>删除</span>
                 </el-button>
             </template>
         </HcTable>
         <template #action>
             <el-button size="large" type="info" hc-btn @click="goBackClick">
-                <HcIcon name="arrow-go-back"/>
+                <HcIcon name="arrow-go-back" />
                 <span v-if="isDisabled">返回上一级</span>
                 <span v-else>取消并返回</span>
             </el-button>
-            <el-button size="large" type="primary" hc-btn @click="saveClick" v-if="!isDisabled" :loading="saveLoaingVal">
-                <HcIcon name="check-double"/>
+            <el-button v-if="!isDisabled" size="large" type="primary" hc-btn :loading="saveLoaingVal" @click="saveClick">
+                <HcIcon name="check-double" />
                 <span>提交保存</span>
             </el-button>
         </template>
@@ -62,37 +61,35 @@
 </template>
 
 <script setup>
-import {ref, watch} from "vue";
-import {useRouter} from 'vue-router'
-
+import { ref, watch } from 'vue'
+import { useRouter } from 'vue-router'
 
-const router = useRouter()
-const emit= defineEmits(['saveClick',"update:datas"])
 
 //参数
 const props = defineProps({
     datas: {
         type: Array,
-        default: () => ([])
+        default: () => ([]),
     },
     disabled: {
         type: Boolean,
-        default: false
+        default: false,
     },
     saveLoaing:{
         type: Boolean,
-        default: false
+        default: false,
     },
     reminderUserList:{
         type:Array,
-        default:()=>([])
+        default:()=>([]),
     },
 
 })
-
+const emit = defineEmits(['saveClick', 'update:datas'])
+const router = useRouter()
 const infoData = ref(props.datas)
 const isDisabled = ref(props.disabled)
-const saveLoaingVal=ref(props.saveLoaing)
+const saveLoaingVal = ref(props.saveLoaing)
 
 
 //深度监听
@@ -100,36 +97,34 @@ watch(() => [
     props.datas,
     infoData,
 
-], ([datas,infoData]) => {
-   console.log(datas,'datas');
+], ([datas, infoData]) => {
+   console.log(datas, 'datas')
     infoData.value = datas
     emit('update:datas', infoData)
 
 
-}, {deep: true})
+}, { deep: true })
 
 //监听
 watch(() => [
     props.disabled,
     props.saveLoaing,
-], ([disabled,saveLoaing]) => {
+], ([disabled, saveLoaing]) => {
     isDisabled.value = disabled
-    saveLoaingVal.value=saveLoaing
+    saveLoaingVal.value = saveLoaing
 })
 
 //成本测算表格
 const tableColumn = [
-    {key: 'returnedCondition', name: '回款条件',  align: 'center'},
-    {key: 'shouldReturnedTime', name: '应收款时间',  align: 'center'},
-    {key: 'shouldReturnedMoney', name: '应收回款金额', align: 'center'},
-    {key: 'practicalReturnedTime', name: '实际回款时间',  align: 'center'},
-    {key: 'practicalReturnedMoney', name: '实际回款金额', align: 'center'},
-    {key: 'reminderUser', name: '催款执行人', align: 'center'},
-    {key: 'action', name: '操作', width: '180', align: 'center'},
+    { key: 'returnedCondition', name: '回款条件', align: 'center' },
+    { key: 'shouldReturnedTime', name: '应收款时间', align: 'center' },
+    { key: 'shouldReturnedMoney', name: '应收回款金额', align: 'center' },
+    { key: 'practicalReturnedTime', name: '实际回款时间', align: 'center' },
+    { key: 'practicalReturnedMoney', name: '实际回款金额', align: 'center' },
+    { key: 'reminderUser', name: '催款执行人', align: 'center' },
+    { key: 'action', name: '操作', width: '180', align: 'center' },
 ]
-const tableData = ref([
-    {id: 1}, {id: 2}, {id: 3}, {id: 4},
-])
+
 
 
 //返回
@@ -137,17 +132,17 @@ const goBackClick = () => {
     router.back()
 }
 
-const addRow=()=>{
+const addRow = ()=>{
     infoData.value.push({})
 }
-const delRow=(index)=>{
+const delRow = (index)=>{
     infoData.value.splice(index, 1)
  
 }
 
 //提交保存
 const saveClick = () => {
-    console.log(infoData.value,'infoData');
+    console.log(infoData.value, 'infoData')
  
         emit('saveClick')
  

+ 18 - 18
src/views/project/contract/components/record.vue

@@ -1,38 +1,38 @@
 <template>
-    <HcCard actionUi="text-center">
+    <HcCard action-ui="text-center">
         <HcTable :column="tableColumn" :datas="tableData">
-            <template #action="{row,index}">
+            <template #action="{ row }">
                 <span class="text-blue" @click="rowNameTap(row)">查看发票</span>
             </template>
         </HcTable>
         <template #action>
             <el-button size="large" type="info" hc-btn @click="goBackClick">
-                <HcIcon name="arrow-go-back"/>
+                <HcIcon name="arrow-go-back" />
                 <span>返回上一级</span>
             </el-button>
         </template>
 
-        <!--查看发票-->
-        <HcDialog bgColor="#ffffff" isToBody isTable :footer="false" :show="recordModal" title="发票信息" widths="66rem" @close="closeRecordClick">
-            <HcPdf :src="pdfUrl"/>
+        <!-- 查看发票 -->
+        <HcDialog bg-color="#ffffff" is-to-body is-table :footer="false" :show="recordModal" title="发票信息" widths="66rem" @close="closeRecordClick">
+            <HcPdf :src="pdfUrl" />
         </HcDialog>
     </HcCard>
 </template>
 
 <script setup>
-import {ref, watch} from "vue";
-import {useRouter} from 'vue-router'
-
-const router = useRouter()
+import { ref, watch } from 'vue'
+import { useRouter } from 'vue-router'
 
 //参数
 const props = defineProps({
     datas: {
         type: Array,
-        default: () => ([])
+        default: () => ([]),
     },
 })
 
+const router = useRouter()
+
 const tableData = ref(props.datas)
 
 //深度监听
@@ -40,14 +40,14 @@ watch(() => [
     props.datas,
 ], ([datas]) => {
     tableData.value = datas
-}, {deep: true})
+}, { deep: true })
 
 //成本测算表格
 const tableColumn = [
-    {key: 'invoiceDate', name: '开票日期',  align: 'center'},
-    {key: 'invoiceHead', name: '对方名称',  align: 'center'},
-    {key: 'invoiceMoney', name: '开票金额', align: 'center'},
-    {key: 'action', name: '发票附件',  align: 'center'},
+    { key: 'invoiceDate', name: '开票日期', align: 'center' },
+    { key: 'invoiceHead', name: '对方名称', align: 'center' },
+    { key: 'invoiceMoney', name: '开票金额', align: 'center' },
+    { key: 'action', name: '发票附件', align: 'center' },
 ]
 // const tableData = ref([
 //     {id: 1}, {id: 2}, {id: 3}, {id: 4},
@@ -55,10 +55,10 @@ const tableColumn = [
 
 //查看发票
 const recordModal = ref(false)
-const pdfUrl=ref('')
+const pdfUrl = ref('')
 const rowNameTap = (row) => {
     recordModal.value = true
-    pdfUrl.value=row?.invoicePdfUrl
+    pdfUrl.value = row?.invoicePdfUrl
 }
 
 const closeRecordClick = () => {

+ 94 - 99
src/views/project/contract/form.vue

@@ -1,43 +1,42 @@
 <template>
-    <HcTabsSimple :cur="tabsKey" :datas="tabsData" @tabClick="tabsClick">
+    <HcTabsSimple :cur="tabsKey" :datas="tabsData" @tab-click="tabsClick">
         <template #tab-base>
             <baseTabCard 
-            :datas="infoData" 
-            :disabled="dataType === 'view'" 
-            v-if="tabsKey === 'base'" 
-            @saveClick="saveClick" 
-            :saveLoaing="saveLoaing" 
-            :contractType="contractType" 
-            :projectList="projectList"
-            :isres="isres"
-            @changeIsres="changeIsres"
+                v-if="tabsKey === 'base'" 
+                :datas="infoData" 
+                :disabled="dataType === 'view'" 
+                :save-loaing="saveLoaing" 
+                :contract-type="contractType" 
+                :project-list="projectList" 
+                :isres="isres"
+                @save-click="saveClick"
+                @change-isres="changeIsres"
             />
         </template>
         <template #tab-file>
-            <fileTabCard :datas="infoDataFile" :disabled="dataType === 'view'" v-if="tabsKey === 'file'" @saveClick="saveClick"  :saveLoaing="saveLoaing" />
+            <fileTabCard v-if="tabsKey === 'file'" :datas="infoDataFile" :disabled="dataType === 'view'" :save-loaing="saveLoaing" @saveClick="saveClick" />
         </template>
         <template #tab-milestone>
-            <milestoneTab :datas="milestoneData" :disabled="dataType === 'view'" v-if="tabsKey === 'milestone'" @saveClick="saveClick"  :saveLoaing="saveLoaing" :reminderUserList="reminderUserList" />
+            <milestoneTab v-if="tabsKey === 'milestone'" :datas="milestoneData" :disabled="dataType === 'view'" :save-loaing="saveLoaing" :reminder-user-list="reminderUserList" @saveClick="saveClick" />
         </template>
         <template #tab-record>
-            <recordTabCard :datas="recordData" v-if="tabsKey === 'record'" />
+            <recordTabCard v-if="tabsKey === 'record'" :datas="recordData" />
         </template>
-        
     </HcTabsSimple>
 </template>
 
 <script setup>
-import {onActivated, ref} from "vue";
-import {useRouter, useRoute} from 'vue-router'
-import baseTabCard from "./components/base.vue";
-import fileTabCard from "./components/file.vue";
-import milestoneTab from "./components/milestone.vue";
-import recordTabCard from "./components/record.vue";
-import {arrIndex,getObjValue,getArrValue} from "js-fast-way";
-import contractApi from '~api/project/project-contract.js';
-import { getuserList} from "~api/other";
-import {useAppStore} from "~src/store";
-const useAppState = useAppStore();
+import { onActivated, ref } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import baseTabCard from './components/base.vue'
+import fileTabCard from './components/file.vue'
+import milestoneTab from './components/milestone.vue'
+import recordTabCard from './components/record.vue'
+import { arrIndex, getArrValue, getObjValue } from 'js-fast-way'
+import contractApi from '~api/project/project-contract.js'
+import { getuserList } from '~api/other'
+import { useAppStore } from '~src/store'
+const useAppState = useAppStore()
 
 //初始变量
 const router = useRouter()
@@ -52,31 +51,31 @@ onActivated(() => {
     setTabsData()
     getContractType()
     getUserDict()
-    tabsKey.value='base'
-    if(dataType.value!=='add'){
+    tabsKey.value = 'base'
+    if (dataType.value !== 'add') {
         getContractInfoById()
         getListByContractId()
         getRecordData()
         getProjectList(2)
-    }else if(dataType.value=='add'){
-        infoData.value={}
-        infoDataFile.value={}
-        milestoneData.value=[{}]
+    } else if (dataType.value === 'add') {
+        infoData.value = {}
+        infoDataFile.value = {}
+        milestoneData.value = [{}]
         getProjectList(1)
     }
 
  
 })
-const infoDataFile=ref({pdfUrl:''})
+const infoDataFile = ref({ pdfUrl:'' })
 //获取详情
-const getContractInfoById=async()=>{
-    const {error, code, data} = await contractApi.getContractInfoById({id: dataId.value})
+const getContractInfoById = async ()=>{
+    const { error, code, data } = await contractApi.getContractInfoById({ id: dataId.value })
     if (!error && code === 200) {
-        infoData.value=getObjValue(data)
-        infoDataFile.value.pdfUrl=infoData.value.contractAccessory
+        infoData.value = getObjValue(data)
+        infoDataFile.value.pdfUrl = infoData.value.contractAccessory
 
     } else {
-        infoData.value={}
+        infoData.value = {}
     }
 }
 //设置选项卡数据
@@ -84,11 +83,11 @@ const setTabsData = () => {
     const index = arrIndex(tabsData.value, 'key', 'record')
     if (dataType.value === 'view') {
         //预览模式下,索引不存在,就添加此选项
-        if (index === -1)  {
+        if (index === -1) {
             tabsData.value.push({
                 icon: 'file-history',
                 label: '合同开票记录',
-                key: 'record'
+                key: 'record',
             })
         }
     } else {
@@ -102,86 +101,82 @@ const setTabsData = () => {
 //选项卡
 const tabsKey = ref('base')
 const tabsData = ref([
-    {icon: 'file-list-3', label: '合同基础信息', key: 'base'},
-    {icon: 'file-word', label: '合同附件', key: 'file'},
-    {icon: 'creative-commons-sa', label: '合同回款里程碑', key: 'milestone'},
+    { icon: 'file-list-3', label: '合同基础信息', key: 'base' },
+    { icon: 'file-word', label: '合同附件', key: 'file' },
+    { icon: 'creative-commons-sa', label: '合同回款里程碑', key: 'milestone' },
 ])
 const tabsClick = (key) => {
     tabsKey.value = key
-    if(tabsKey.value=='base'){
-        console.log(infoData.value,'基础信息');
+    if (tabsKey.value === 'base') {
+        console.log(infoData.value, '基础信息')
     }
 
 }
 
 
-const isNoDropShadow = ref(false)
 //合同里程碑
-const milestoneData=ref([])
-const getListByContractId=async()=>{
-    const {error, code, data} = await contractApi.getListByContractId({contractId: dataId.value})
+const milestoneData = ref([])
+const getListByContractId = async ()=>{
+    const { error, code, data } = await contractApi.getListByContractId({ contractId: dataId.value })
     if (!error && code === 200) {
-        milestoneData.value=getArrValue(data)
+        milestoneData.value = getArrValue(data)
        
 
     } else {
-        milestoneData.value=[]
+        milestoneData.value = []
     }
 }
 //合同开票记录
-const recordData=ref([])
-const getRecordData=async()=>{
-    const {error, code, data} = await contractApi.getContractInvoiceList({contractId: dataId.value})
+const recordData = ref([])
+const getRecordData = async ()=>{
+    const { error, code, data } = await contractApi.getContractInvoiceList({ contractId: dataId.value })
     if (!error && code === 200) {
-        recordData.value=getArrValue(data)
+        recordData.value = getArrValue(data)
        
 
     } else {
-        recordData.value=[]
+        recordData.value = []
     }
 }
-const saveLoaing=ref(false)
-const isEmptyObj=(obj)=> {
-    let arr = Object.keys(obj);
-    return(arr.length == 0)
+const saveLoaing = ref(false)
+const isEmptyObj = (obj)=> {
+    let arr = Object.keys(obj)
+    return (arr.length === 0)
 
 }
-const isres=ref(false)
+const isres = ref(false)
 //改变是否可以保存的状态
-const changeIsres=(val)=>{
-    isres.value=val
+const changeIsres = (val)=>{
+    isres.value = val
 }    
 //保存
-const saveClick=(info,type)=>{
-  console.log(infoData.value,'indo11111');
-  console.log(infoDataFile.value,'infoDataFile');
-  console.log(milestoneData.value,'milestoneData');
+const saveClick = ()=>{
   //限制空对象不提交
-  milestoneData.value.forEach((ele,index)=>{
-    let ele1=isEmptyObj(ele)
-    if(ele1){
+  milestoneData.value.forEach((ele, index)=>{
+    let ele1 = isEmptyObj(ele)
+    if (ele1) {
         milestoneData.value.splice(index)
     }
   })
-  console.log( milestoneData.value,' milestoneData.value111');
-  let saveobj={...infoData.value}
-  saveobj.contractAccessory=infoDataFile.value.pdfUrl
-  saveobj.list=milestoneData.value
+  console.log( milestoneData.value, ' milestoneData.value111')
+  let saveobj = { ...infoData.value }
+  saveobj.contractAccessory = infoDataFile.value.pdfUrl
+  saveobj.list = milestoneData.value
 
-    if (dataId.value.length>0) {
-        saveobj.id=dataId.value
+    if (dataId.value.length > 0) {
+        saveobj.id = dataId.value
         updateContractInfo(saveobj)
-    }else{
+    } else {
         addContractInfo(saveobj)
     }
 
 }
 //新增合同
-const addContractInfo=async(obj)=>{
-    console.log(obj,'新增');
-    saveLoaing.value=true;
-    const {error, code, data,msg} = await contractApi.addContractInfo( obj)
-    saveLoaing.value=false;
+const addContractInfo = async (obj)=>{
+    console.log(obj, '新增')
+    saveLoaing.value = true
+    const { error, code, msg } = await contractApi.addContractInfo( obj)
+    saveLoaing.value = false
     if (!error && code === 200) {
         window.$message.success(msg)
         router.push({
@@ -191,11 +186,11 @@ const addContractInfo=async(obj)=>{
 
 }
 //修改合同
-const updateContractInfo=async(obj)=>{
-    console.log(obj,'编辑');
-    saveLoaing.value=true;
-    const {error, code, data,msg} = await contractApi.updateContractInfo( obj)
-    saveLoaing.value=false;
+const updateContractInfo = async (obj)=>{
+    console.log(obj, '编辑')
+    saveLoaing.value = true
+    const { error, code, msg } = await contractApi.updateContractInfo( obj)
+    saveLoaing.value = false
     if (!error && code === 200) {
        window.$message.success(msg)
        router.push({
@@ -205,30 +200,30 @@ const updateContractInfo=async(obj)=>{
 
 }
 //获取合同类型
-const contractType=ref([])
-const getContractType=async()=>{
-    const {error, code, data} = await contractApi.getContractTypeDict()
+const contractType = ref([])
+const getContractType = async ()=>{
+    const { error, code, data } = await contractApi.getContractTypeDict()
     if (!error && code === 200) {
-        contractType.value=getArrValue(data)
+        contractType.value = getArrValue(data)
     } else {
-        contractType.value=[]
+        contractType.value = []
     }
 }
 //所属项目projectList
-const projectList=ref([])
-const getProjectList=async(type)=>{
-    const {error, code, data} = await contractApi.getNoConnectionProject({type})
+const projectList = ref([])
+const getProjectList = async (type)=>{
+    const { error, code, data } = await contractApi.getNoConnectionProject({ type })
     if (!error && code === 200) {
-        projectList.value=getArrValue(data)
+        projectList.value = getArrValue(data)
     } else {
-        projectList.value=[]
+        projectList.value = []
     }
 }
 //催款执行人reminderUserList
-const reminderUserList=ref([])
+const reminderUserList = ref([])
 //获取部门人员列表
-const getUserDict=async()=>{
-    const {error, code, data} = await getuserList({tenantId:useAppState.tenantId})
+const getUserDict = async ()=>{
+    const { error, code, data } = await getuserList({ tenantId:useAppState.tenantId })
     if (!error && code === 200) {
         reminderUserList.value = getArrValue(data)
 

+ 47 - 53
src/views/project/contract/index.vue

@@ -1,69 +1,63 @@
 <template>
     <HcCard>
         <template #header>
-            <!-- <div class="w-36">
-                <el-select v-model="searchForm.projectType" block clearable placeholder="项目类型" size="large">
-                    <el-option v-for="item in projectType" :label="item.dictName" :value="item.dictValue"/>
-                </el-select>
-            </div>
-            <div class="w-40 ml-2">
-                <el-select v-model="searchForm.projectServerType" block clearable placeholder="服务类型" size="large">
-                    <el-option v-for="item in serverType" :label="item.dictName" :value="item.dictValue"/>
-                </el-select>
-            </div> -->
             <div class="w-48 ml-2">
-                <el-input v-model="searchForm.queryValue" clearable placeholder="请输入合同名称进行查询" size="large"/>
+                <el-input v-model="searchForm.queryValue" clearable placeholder="请输入合同名称进行查询" size="large" />
             </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="primary" hc-btn @click="updateClick">
-                <HcIcon name="refresh"/>
+                <HcIcon name="refresh" />
                 <span>合同回款更新</span>
             </el-button>
             <el-button size="large" type="primary" hc-btn @click="addRowClick">
-                <HcIcon name="add"/>
+                <HcIcon name="add" />
                 <span>新增项目合同信息</span>
             </el-button>
         </template>
 
-        <HcTable :isIndex="false" :column="tableColumn" :datas="tableData" :loading="tableLoading">
-            <template #name="{row}">
-                <span class="text-blue text-hover" @click="rowNameTap(row)">{{row.name}}</span>
+        <HcTable :is-index="false" :column="tableColumn" :datas="tableData" :loading="tableLoading">
+            <template #name="{ row }">
+                <span class="text-blue text-hover" @click="rowNameTap(row)">{{ row.name }}</span>
             </template>
-            <template #key4="{row}">
-                <span >{{row.startTime+'~'+row.endTime}}</span>
+            <template #key4="{ row }">
+                <span>{{ `${row.startTime}~${row.endTime}` }}</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="delRowClick(row)">删除</el-button>
+            <template #action="{ row }">
+                <el-button plain size="small" type="primary" @click="editRowClick(row)">
+                    编辑
+                </el-button>
+                <el-button plain size="small" type="danger" @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 {ref,onMounted,onActivated} from "vue";
-import {useRouter} from 'vue-router'
-import contractApi from '~api/project/project-contract.js';
-import {getArrValue} from "js-fast-way"
-import {delMessage} from "~uti/tools";
-import projectApi from '~api/project/project-list.js';
+import { onActivated, ref } from 'vue'
+import { useRouter } from 'vue-router'
+import contractApi from '~api/project/project-contract.js'
+import { getArrValue } from 'js-fast-way'
+import { delMessage } from '~uti/tools'
+
 
 const router = useRouter()
 onActivated(()=>{
@@ -77,22 +71,22 @@ onActivated(()=>{
 //搜索表单
 const searchForm = ref({
     queryValue: 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,20 +95,20 @@ const pageChange = ({current, size}) => {
 //获取数据
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'number', name: '合同编号', width: '120', align: 'center'},
-    {key: 'name', name: '合同名称'},
-    {key: 'contractTypeValue', name: '合同类型', width: '140', align: 'center'},
-    {key: 'contractSignTime', name: '签订时间', width: '160', align: 'center'},
-    {key: 'key4', name: '合同起止日期', width: '220', align: 'center'},
-    {key: 'returnedMoney', name: '合同已履约回款', width: '140', align: 'center'},
-    {key: 'unreturnedMoney', name: '合同未履约回款', width: '140', align: 'center'},
-    {key: 'action', name: '操作', width: '180', align: 'center'},
+    { key: 'number', name: '合同编号', width: '120', align: 'center' },
+    { key: 'name', name: '合同名称' },
+    { key: 'contractTypeValue', name: '合同类型', width: '140', align: 'center' },
+    { key: 'contractSignTime', name: '签订时间', width: '160', align: 'center' },
+    { key: 'key4', name: '合同起止日期', width: '220', align: 'center' },
+    { key: 'returnedMoney', name: '合同已履约回款', width: '140', align: 'center' },
+    { key: 'unreturnedMoney', name: '合同未履约回款', width: '140', align: 'center' },
+    { key: 'action', name: '操作', width: '180', align: 'center' },
 ]
 const tableData = ref([])
 
-const getTableData = async() => {
+const getTableData = async () => {
     tableLoading.value = true
-    const {error, code, data} = await contractApi.getPage(searchForm.value)
+    const { error, code, data } = await contractApi.getPage(searchForm.value)
     tableLoading.value = false
     if (!error && code === 200) {
         tableData.value = getArrValue(data)
@@ -131,8 +125,8 @@ const rowNameTap = (row) => {
         name: 'project-contract-form',
         query: {
             id: row.id,
-            type: 'view'
-        }
+            type: 'view',
+        },
     })
 }
 
@@ -140,7 +134,7 @@ const rowNameTap = (row) => {
 const addRowClick = () => {
     router.push({
         name: 'project-contract-form',
-        query: {type: 'add'}
+        query: { type: 'add' },
     })
 }
 
@@ -150,15 +144,15 @@ const editRowClick = (row) => {
         name: 'project-contract-form',
         query: {
             id: row.id,
-            type: 'edit'
-        }
+            type: 'edit',
+        },
     })
 }
 
 //删除
-const delRowClick = ({id}) => {
+const delRowClick = ({ id }) => {
     delMessage(async () => {
-        const {error, code, msg} = await contractApi.deleteContractInfoById({id})
+        const { error, code, msg } = await contractApi.deleteContractInfoById({ id })
         //判断状态
         if (!error && code === 200) {
             window.$message?.success(msg)
@@ -172,7 +166,7 @@ const delRowClick = ({id}) => {
 //合同回款更新
 const updateClick = () => {
     router.push({
-        name: 'project-contract-update'
+        name: 'project-contract-update',
     })
 }
 </script>

+ 67 - 66
src/views/project/cost/data.vue

@@ -2,69 +2,76 @@
     <HcCard>
         <template #header>
             <div class="hc-card-header-back" @click="goBackClick">
-                <HcIcon name="arrow-go-back"/>
+                <HcIcon name="arrow-go-back" />
                 <span>返回</span>
             </div>
-            <span class="mr-2">{{projectName}} 总成本为</span>
+            <span class="mr-2">{{ projectName }} 总成本为</span>
             <span class="text-red text-xl">{{ previewTotalCost }}</span>
             <span class="ml-2">元</span>
         </template>
         <template #extra>
             <div class="w-44">
-                <el-select block clearable placeholder="费用支出所属分类" size="large"  v-model="costTypeval" @change="changeCost">
-                    <el-option v-for="item in costTypeList" :label="item.dictName" :value="item.dictValue"/>
+                <el-select v-model="costTypeval" block clearable placeholder="费用支出所属分类" size="large" @change="changeCost">
+                    <el-option v-for="item in costTypeList" :key="item.dictValue" :label="item.dictName" :value="item.dictValue" />
                 </el-select>
             </div>
             <div class="w-40 ml-2">
-                <el-select block clearable placeholder="请选择参建方" size="large"  v-model="unitTypeval"  @change="changeUnit">
-                    <el-option v-for="item in unitType" :label="item.dictName" :value="item.dictValue"/>
+                <el-select v-model="unitTypeval" block clearable placeholder="请选择参建方" size="large" @change="changeUnit">
+                    <el-option v-for="item in unitType" :key="item.dictValue" :label="item.dictName" :value="item.dictValue" />
                 </el-select>
             </div>
         </template>
         <div class="hc-table-ref-box no-border hc-project-cost-data">
-            <el-table :data="tableData" border
-                      :header-cell-style="tableHeaderCellStyle"
-                      :cell-style="tableCellStyle"
-                      style="width: 100%; height: 100%"
-                      :loading="tableLoading"
+            <el-table
+                :data="tableData" border
+                :header-cell-style="tableHeaderCellStyle"
+                :cell-style="tableCellStyle"
+                style="width: 100%; height: 100%"
+                :loading="tableLoading"
             >
-                <el-table-column prop="costTypeValue" label="费用分类" align="center"/>
-                <el-table-column prop="projectProcessValue" label="项目环节" align="center"/>
-                <el-table-column prop="budgetTypeValue" label="预算类型" align="center"/>
-                <el-table-column prop="taskDetailValue" label="任务明细" align="center"/>
-                <el-table-column prop="budgetDays" label="预计工作量(小数/整数)" align="center"/>
+                <el-table-column prop="costTypeValue" label="费用分类" align="center" />
+                <el-table-column prop="projectProcessValue" label="项目环节" align="center" />
+                <el-table-column prop="budgetTypeValue" label="预算类型" align="center" />
+                <el-table-column prop="taskDetailValue" label="任务明细" align="center" />
+                <el-table-column prop="budgetDays" label="预计工作量(小数/整数)" align="center" />
                 <el-table-column prop="postTypeValue" label="投入岗位类型(日单价)" align="center">
                     <template #default="{ row }">
-                        <div style="background: #00CCFF">{{ row.postTypeValue }}</div>
+                        <div style="background: #00CCFF">
+                            {{ row.postTypeValue }}
+                        </div>
                     </template>
                 </el-table-column>
-                <el-table-column prop="staffCount" label="投入人员数量" align="center"/>
+                <el-table-column prop="staffCount" label="投入人员数量" align="center" />
                 <el-table-column prop="budgetStaffCost" label="预计人工成本(元)" align="center">
                     <template #default="{ row }">
-                        <div style="background: #fe6e22">{{ row.budgetStaffCost }}</div>
+                        <div style="background: #fe6e22">
+                            {{ row.budgetStaffCost }}
+                        </div>
                     </template>
                 </el-table-column>
-                <el-table-column prop="budgetTravelExpense" label="预计差旅费(元)" align="center"/>
-                <el-table-column prop="outsourceUnitPrice" label="外包单价" align="center"/>
-                <el-table-column prop="outsourcePeopleCount" label="外包数量" align="center"/>
-                <el-table-column prop="outsourceCountMoney" label="外包金额" align="center"/>
-                <el-table-column prop="otherBudgetMoney" label="其他预算金额" align="center"/>
+                <el-table-column prop="budgetTravelExpense" label="预计差旅费(元)" align="center" />
+                <el-table-column prop="outsourceUnitPrice" label="外包单价" align="center" />
+                <el-table-column prop="outsourcePeopleCount" label="外包数量" align="center" />
+                <el-table-column prop="outsourceCountMoney" label="外包金额" align="center" />
+                <el-table-column prop="otherBudgetMoney" label="其他预算金额" align="center" />
                 <el-table-column prop="budgetCountMoney" label="总预算金额" align="center">
                     <template #default="{ row }">
-                        <div style="background: #fe6e22">{{ row.budgetCountMoney }}</div>
+                        <div style="background: #fe6e22">
+                            {{ row.budgetCountMoney }}
+                        </div>
                     </template>
                 </el-table-column>
-                <el-table-column prop="budgetRemark" label="测算备注" align="center"/>
+                <el-table-column prop="budgetRemark" label="测算备注" align="center" />
             </el-table>
         </div>
     </HcCard>
 </template>
 
 <script setup>
-import {onActivated, ref} from "vue";
-import {useRouter, useRoute} from 'vue-router'
-import costApi from '~api/project/cost.js';
-import {getArrValue,getObjValue,formValidate} from "js-fast-way"
+import { onActivated, ref } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import costApi from '~api/project/cost.js'
+import { getArrValue } from 'js-fast-way'
 //初始变量
 const router = useRouter()
 const useRoutes = useRoute()
@@ -79,85 +86,79 @@ onActivated(() => {
     getUnitType()
 })
 //获取岗位分类postTypeList
-const costTypeList=ref([])
-const costTypeval=ref(null)
-const getCostType=async(type)=>{
-    const {error, code, data} = await costApi.getCostType()
+const costTypeList = ref([])
+const costTypeval = ref(null)
+const getCostType = async ()=>{
+    const { error, code, data } = await costApi.getCostType()
     if (!error && code === 200) {
-        costTypeList.value=getArrValue(data)
+        costTypeList.value = getArrValue(data)
      
 
 
     } else {
-        costTypeList.value=[]
+        costTypeList.value = []
     }
 }
-const unitType=ref([])
-const unitTypeval=ref(null)
-const getUnitType=async(type)=>{
-    const {error, code, data} = await costApi.getUnitType()
+const unitType = ref([])
+const unitTypeval = ref(null)
+const getUnitType = async ()=>{
+    const { error, code, data } = await costApi.getUnitType()
     if (!error && code === 200) {
-        unitType.value=getArrValue(data)
-     
-
-
+        unitType.value = getArrValue(data)
     } else {
-        unitType.value=[]
+        unitType.value = []
     }
 }
-const projectType = ref([
-    {key: '1', name: '选项1'},
-    {key: '2', name: '选项2'},
-])
+
 
 //表格数据
 const tableData = ref([
  
 ])
-const tableLoading=ref(false)
-const projectName=ref('')
-const previewTotalCost=ref('')
-const getTableData = async() => {
+const tableLoading = ref(false)
+const projectName = ref('')
+const previewTotalCost = ref('')
+const getTableData = async () => {
     tableLoading.value = true
-    const {error, code, data} = await costApi.getBudgetList({
+    const { error, code, data } = await costApi.getBudgetList({
         projectId:dataId.value,
         costType:costTypeval.value,
-        unitType:unitTypeval.value
+        unitType:unitTypeval.value,
     })
     tableLoading.value = false
     if (!error && code === 200) {
         tableData.value = getArrValue(data['previewList'])
-        projectName.value=data?.projectName
-        previewTotalCost.value=data?.previewTotalCost
+        projectName.value = data?.projectName
+        previewTotalCost.value = data?.previewTotalCost
    
     } else {
         tableData.value = []
     
     }
 }
-const changeUnit=()=>{
+const changeUnit = ()=>{
     getTableData()
 }
-const changeCost=()=>{
+const changeCost = ()=>{
     getTableData()
 }
 //自定义表头样式
-const tableHeaderCellStyle = ({column}) => {
+const tableHeaderCellStyle = ({ column }) => {
     if (column.property === 'key6' || column.property === 'key14') {
-        return {backgroundColor: 'rgba(233, 157, 66, 0.23)', color: '#101010'}
+        return { backgroundColor: 'rgba(233, 157, 66, 0.23)', color: '#101010' }
     } else if (column.property === 'key8') {
-        return {backgroundColor: 'rgba(147, 210, 243, 0.23)', color: '#101010'}
+        return { backgroundColor: 'rgba(147, 210, 243, 0.23)', color: '#101010' }
     } else {
-        return {backgroundColor: 'rgba(73, 128, 248, 0.23)', color: '#101010'}
+        return { backgroundColor: 'rgba(73, 128, 248, 0.23)', color: '#101010' }
     }
 }
 
 //自定义列的样式
-const tableCellStyle = ({column}) => {
+const tableCellStyle = ({ column }) => {
     if (column.property === 'key6' || column.property === 'key14') {
-        return {backgroundColor: 'rgba(233, 157, 66, 0.23)'}
+        return { backgroundColor: 'rgba(233, 157, 66, 0.23)' }
     } else if (column.property === 'key8') {
-        return {backgroundColor: 'rgba(147, 210, 243, 0.23)'}
+        return { backgroundColor: 'rgba(147, 210, 243, 0.23)' }
     } else {
         return {}
     }

+ 212 - 213
src/views/project/cost/form.vue

@@ -1,141 +1,144 @@
 <template>
-    <HcTabsSimple :cur="tabsKey" :datas="tabsData" @tabClick="tabsClick">
+    <HcTabsSimple :cur="tabsKey" :datas="tabsData" @tab-click="tabsClick">
         <template #tab-base>
-            <HcCard scrollbar actionUi="text-center">
+            <HcCard scrollbar action-ui="text-center">
                 <div class="hc-card-form-center">
                     <el-form ref="formBaseRef" :model="formBaseModel" :rules="formBaseRules" label-width="auto" size="large">
                         <el-form-item label="项目名称:" prop="projectId">
                             <el-select v-model="formBaseModel.projectId" block placeholder="项目名称">
-                                <el-option v-for="item in projectList" :label="item.name" :value="item.id"/>
+                                <el-option v-for="item in projectList" :key="item.id" :label="item.name" :value="item.id" />
                             </el-select>
                         </el-form-item>
                         <el-form-item label="成本测算总金额:">
-                            <el-input v-model="formBaseModel.projectCostTotal" disabled/>
+                            <el-input v-model="formBaseModel.projectCostTotal" disabled />
                         </el-form-item>
                         <el-form-item label="研发部成本总金额:">
-                            <el-input v-model="formBaseModel.devCostTotal" disabled/>
+                            <el-input v-model="formBaseModel.devCostTotal" disabled />
                         </el-form-item>
                         <el-form-item label="业务部成本总金额:">
-                            <el-input v-model="formBaseModel.businessCostTotal" disabled/>
+                            <el-input v-model="formBaseModel.businessCostTotal" disabled />
                         </el-form-item>
                         <el-form-item label="市场部成本总金额:">
-                            <el-input v-model="formBaseModel.marketCostTotal" disabled/>
+                            <el-input v-model="formBaseModel.marketCostTotal" disabled />
                         </el-form-item>
                         <el-form-item label="维护部成本总金额:">
-                            <el-input v-model="formBaseModel.maintainCostTotal" disabled/>
+                            <el-input v-model="formBaseModel.maintainCostTotal" disabled />
                         </el-form-item>
                         <el-form-item label="外包劳务成本总金额:">
-                            <el-input v-model="formBaseModel.outsourceCostTotal" disabled/>
+                            <el-input v-model="formBaseModel.outsourceCostTotal" disabled />
                         </el-form-item>
                         <el-form-item label="管理费成本总金额:">
-                            <el-input v-model="formBaseModel.manageCostTotal" disabled/>
+                            <el-input v-model="formBaseModel.manageCostTotal" disabled />
                         </el-form-item>
                     </el-form>
                 </div>
                 <template #action>
                     <el-button size="large" type="info" hc-btn @click="goBackClick">
-                        <HcIcon name="arrow-go-back"/>
+                        <HcIcon name="arrow-go-back" />
                         <span>取消并返回</span>
                     </el-button>
-                    <el-button size="large" type="primary" hc-btn @click="submitForm" :loading="submitLoaing">
-                        <HcIcon name="check-double"/>
+                    <el-button size="large" type="primary" hc-btn :loading="submitLoaing" @click="submitForm">
+                        <HcIcon name="check-double" />
                         <span>提交保存</span>
                     </el-button>
                 </template>
             </HcCard>
         </template>
         <template #tab-table>
-            <HcCard actionUi="text-center" :title="formBaseModel.projectName">
+            <HcCard action-ui="text-center" :title="formBaseModel.projectName">
                 <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">
-                    <template #deptId="{row,index}">  
-                            <el-select  v-model="row.deptId" block placeholder="请选择" :disabled="!row.isEdit">
-                                <el-option v-for="item in departMent" :label="item.deptName" :value="item.id"/>
-                             </el-select>
-                            
+                <HcTable :is-index="false" :column="tableColumn" :datas="tableData">
+                    <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" />
+                        </el-select>
                     </template>
-                    <template #costType="{row,index}">  
-                            <el-select  v-model="row.costType" block placeholder="请选择" :disabled="!row.isEdit">
-                                <el-option v-for="item in costTypeList" :label="item.dictName" :value="item.dictValue"/>
-                             </el-select>
+                    <template #costType="{ row }">  
+                        <el-select v-model="row.costType" block placeholder="请选择" :disabled="!row.isEdit">
+                            <el-option v-for="item in costTypeList" :key="item.dictValue" :label="item.dictName" :value="item.dictValue" />
+                        </el-select>
                     </template>
-                    <template #projectProcess="{row,index}">
-                        <el-select  v-model="row.projectProcess" block placeholder="请选择" :disabled="!row.isEdit">
-                                <el-option v-for="item in processList" :label="item.name" :value="item.id"/>
-                         </el-select>
+                    <template #projectProcess="{ row }">
+                        <el-select v-model="row.projectProcess" block placeholder="请选择" :disabled="!row.isEdit">
+                            <el-option v-for="item in processList" :key="item.id" :label="item.name" :value="item.id" />
+                        </el-select>
                     </template>
-                    <template #budgetType="{row,index}">
+                    <template #budgetType="{ row }">
                         <el-select v-model="row.budgetType" :disabled="!row.isEdit">
-                            <el-option v-for="item in budgetTypeList" :label="item.dictName" :value="item.dictValue"/>
+                            <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-option v-for="item in taskDetailList[index]" :label="item.dictName" :value="item.dictValue"/>
+                    <template #taskDetail="{ row, index }">
+                        <el-select v-model="row.taskDetail" :getdata="budgetTypeChange(row?.budgetType, index)" :disabled="!row.isEdit">
+                            <el-option v-for="item in taskDetailList[index]" :key="item.dictValue" :label="item.dictName" :value="item.dictValue" />
                         </el-select>
                     </template>
-                    <template #budgetDays="{row,index}">
-                        <el-input v-model="row.budgetDays" :disabled="!row.isEdit"/>
+                    <template #budgetDays="{ row }">
+                        <el-input v-model="row.budgetDays" :disabled="!row.isEdit" />
                     </template>
-                    <template #postType="{row,index}">
+                    <template #postType="{ row }">
                         <el-select v-model="row.postType" :disabled="!row.isEdit">
-                            <el-option v-for="item in postTypeList" :label="item.dictName" :value="item.id"/>
+                            <el-option v-for="item in postTypeList" :key="item.id" :label="item.dictName" :value="item.id" />
                         </el-select>
                     </template>
                     
-                    <template #staffCount="{row,index}">
-                        <el-input v-model="row.staffCount" :disabled="!row.isEdit"/>
+                    <template #staffCount="{ row }">
+                        <el-input v-model="row.staffCount" :disabled="!row.isEdit" />
                     </template>
-                    <template #budgetStaffCost="{row,index}">
-                        <el-input v-model="row.budgetStaffCost" disabled/>
+                    <template #budgetStaffCost="{ row }">
+                        <el-input v-model="row.budgetStaffCost" disabled />
                     </template>
-                    <template #budgetTravelExpense="{row,index}">
-                        <el-input v-model="row.budgetTravelExpense" :disabled="!row.isEdit"/>
+                    <template #budgetTravelExpense="{ row }">
+                        <el-input v-model="row.budgetTravelExpense" :disabled="!row.isEdit" />
                     </template>
-                    <template #outsourceUnitPrice="{row,index}">
-                        <el-input v-model="row.outsourceUnitPrice" :disabled="!row.isEdit"/>
+                    <template #outsourceUnitPrice="{ row }">
+                        <el-input v-model="row.outsourceUnitPrice" :disabled="!row.isEdit" />
                     </template>
-                    <template #outsourcePeopleCount="{row,index}">
-                        <el-input v-model="row.outsourcePeopleCount" :disabled="!row.isEdit"/>
+                    <template #outsourcePeopleCount="{ row }">
+                        <el-input v-model="row.outsourcePeopleCount" :disabled="!row.isEdit" />
                     </template>
-                    <template #outsourceCountMoney="{row,index}">
+                    <template #outsourceCountMoney="{ row }">
                         <el-input v-model="row.outsourceCountMoney" disabled />
                     </template>
-                    <template #otherBudgetMoney="{row,index}">
-                        <el-input v-model="row.otherBudgetMoney" :disabled="!row.isEdit" onkeyup="this.value=this.value.match(/\d+\.?\d{0,2}/)"/>
+                    <template #otherBudgetMoney="{ row }">
+                        <el-input v-model="row.otherBudgetMoney" :disabled="!row.isEdit" onkeyup="this.value=this.value.match(/\d+\.?\d{0,2}/)" />
                     </template>
-                <template #budgetCountMoney="{row,index}">
-                        <el-input v-model="row.budgetCountMoney" disabled/>
+                    <template #budgetCountMoney="{ row }">
+                        <el-input v-model="row.budgetCountMoney" disabled />
                     </template> 
-                   <template #budgetRemark="{row,index}">
-                        <el-input v-model="row.budgetRemark" :disabled="!row.isEdit"/>
+                    <template #budgetRemark="{ row }">
+                        <el-input v-model="row.budgetRemark" :disabled="!row.isEdit" />
                     </template>
-                    <template #key15="{row,index}">
-                        <el-input v-model="row.key15"/>
+                    <template #key15="{ row }">
+                        <el-input v-model="row.key15" />
                     </template> 
-                    <template #action="{row,index}">
+                    <template #action="{ row, index }">
                         <el-button size="small" type="primary" @click="addRow">
-                            <HcIcon name="add"/>
+                            <HcIcon name="add" />
                             <span>新增</span>
                         </el-button>
-                        <el-button size="small" type="success" v-if="row.isEdit" @click="saveRow(row)">保存</el-button>
-                        <el-button size="small" type="primary" v-else @click="row.isEdit = true" :disabled="row?.approve===1||row?.approve===2">编辑</el-button>
-                        <el-button size="small" type="danger" @click="delRow(index)" :disabled="row?.approve===1||row?.approve===2">
-                            <HcIcon name="delete-bin"/>
+                        <el-button v-if="row.isEdit" size="small" type="success" @click="saveRow(row)">
+                            保存
+                        </el-button>
+                        <el-button v-else size="small" type="primary" :disabled="row?.approve === 1 || row?.approve === 2" @click="row.isEdit = true">
+                            编辑
+                        </el-button>
+                        <el-button size="small" type="danger" :disabled="row?.approve === 1 || row?.approve === 2" @click="delRow(index)">
+                            <HcIcon name="delete-bin" />
                             <span>删除</span>
                         </el-button>
                     </template>
                 </HcTable>
                 <template #action>
                     <el-button size="large" type="info" hc-btn @click="goBackClick">
-                        <HcIcon name="arrow-go-back"/>
+                        <HcIcon name="arrow-go-back" />
                         <span>取消并返回</span>
                     </el-button>
-                    <el-button size="large" type="primary" hc-btn @click="submitForm" :loading="submitLoaing"> 
-                        <HcIcon name="check-double"/>
+                    <el-button size="large" type="primary" hc-btn :loading="submitLoaing" @click="submitForm"> 
+                        <HcIcon name="check-double" />
                         <span>提交保存</span>
                     </el-button>
                 </template>
@@ -145,11 +148,11 @@
 </template>
 
 <script setup>
-import {onActivated, ref,watch} from "vue";
-import {useRouter, useRoute} from 'vue-router'
-import costApi from '~api/project/cost.js';
-import {getArrValue,getObjValue,formValidate,objHasKey} from "js-fast-way"
-import { getdepartmentList} from "~api/other";
+import { onActivated, ref, watch } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import costApi from '~api/project/cost.js'
+import { formValidate, getArrValue, getObjValue } from 'js-fast-way'
+import { getdepartmentList } from '~api/other'
 //初始变量
 const router = useRouter()
 const useRoutes = useRoute()
@@ -159,20 +162,20 @@ const dataId = ref(useRoutes?.query?.id ?? '')
 onActivated(() => {
     dataId.value = useRoutes?.query?.id ?? ''
   //清除数据
-    tableData.value=[{}]
-    constructUnitData.value=[]
-    supervisorUnitData.value=[]
-    bulidUnitData.value=[]
-    tableData.value=[{}]
+    tableData.value = [{}]
+    constructUnitData.value = []
+    supervisorUnitData.value = []
+    bulidUnitData.value = []
+    tableData.value = [{}]
     tabsKey.value = 'base'
-    tabKey.value='construction'
+    tabKey.value = 'construction'
     getBudgetTypeList()
-    if(dataId.value.length>0){
+    if (dataId.value.length > 0) {
         getBudgetStatsById()
         getProjectList(2)
-    }else{
+    } else {
         getProjectList(1)
-        formBaseModel.value={}
+        formBaseModel.value = {}
     }
 
     getCostTypeDict()
@@ -187,87 +190,87 @@ onActivated(() => {
 })
 
 
-const projectList=ref([])
+const projectList = ref([])
 //获取项目下拉框
-const getProjectList=async(type)=>{
-    const {error, code, data} = await costApi.getProjectList({type})
+const getProjectList = async (type)=>{
+    const { error, code, data } = await costApi.getProjectList({ type })
     if (!error && code === 200) {
-        projectList.value=getArrValue(data)
+        projectList.value = getArrValue(data)
 
     } else {
-        projectList.value={}
+        projectList.value = {}
     }
 }
 //获取费用分类
-const costTypeList=ref([])
-const getCostTypeDict=async(type)=>{
-    const {error, code, data} = await costApi.getCostTypeDict()
+const costTypeList = ref([])
+const getCostTypeDict = async ()=>{
+    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.getSecondSubject()
     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:1 })
         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 ()=>{
+    const { error, code, data } = await costApi.getPostDict()
     if (!error && code === 200) {
-        postTypeList.value=getArrValue(data)
+        postTypeList.value = getArrValue(data)
 
     } else {
-        postTypeList.value=[]
+        postTypeList.value = []
     }
 }
 //费用分摊部门
 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)
@@ -276,35 +279,35 @@ const getdepartmentListData = async () => {
     }
 }
 //测算表格数据
-const constructUnitData=ref([])
-const bulidUnitData=ref([])
-const supervisorUnitData=ref([])
+const constructUnitData = ref([])
+const bulidUnitData = ref([])
+const supervisorUnitData = ref([])
 //获取详情
-const getBudgetStatsById=async()=>{
-    const {error, code, data} = await costApi.getBudgetStatsById({id: dataId.value})
+const getBudgetStatsById = async ()=>{
+    const { error, code, data } = await costApi.getBudgetStatsById({ id: dataId.value })
     if (!error && code === 200) {
-        formBaseModel.value=getObjValue(data)
-        tableData.value= formBaseModel.value?.constructUnit||[{}]
-        constructUnitData.value=formBaseModel.value?.constructUnit||[]
-        bulidUnitData.value=formBaseModel.value?.buildUnit||[]
-        supervisorUnitData.value=formBaseModel.value?.supervisorUnit||[]
+        formBaseModel.value = getObjValue(data)
+        tableData.value = formBaseModel.value?.constructUnit || [{}]
+        constructUnitData.value = formBaseModel.value?.constructUnit || []
+        bulidUnitData.value = formBaseModel.value?.buildUnit || []
+        supervisorUnitData.value = formBaseModel.value?.supervisorUnit || []
 
     } else {
-        formBaseModel.value={}
+        formBaseModel.value = {}
     }
 }
 //选项卡
 const tabsKey = ref('base')
 const tabsData = ref([
-    {icon: 'file-list-3', label: '基础信息', key: 'base'},
-    {icon: 'file-list-2', label: '成本测算', key: 'table'},
+    { icon: 'file-list-3', label: '基础信息', key: 'base' },
+    { icon: 'file-list-2', label: '成本测算', key: 'table' },
 ])
 const tabsClick = (key) => {
    
-    if(!formBaseModel.value.projectId){
+    if (!formBaseModel.value.projectId) {
         window.$message.warning('请先在基础信息栏选择项目')
-    }else{
-        if(key==='table'){
+    } else {
+        if (key === 'table') {
             tabsKey.value = key
        
             getProcessList(formBaseModel.value.projectId)
@@ -324,7 +327,7 @@ const formBaseRules = {
     projectId: {
         required: true,
         trigger: 'blur',
-        message: "请选择项目名称"
+        message: '请选择项目名称',
     },
 }
 
@@ -335,34 +338,34 @@ const tableData = ref([])//成本测算表格
 watch(() => [
     tabKey.value,
     tableData.value,
-], ([val,table]) => {
-   if(val==='construction'){
-    constructUnitData.value=table
-    formBaseModel.value.constructUnit=table
-   }else if(val==='supervision'){
-    supervisorUnitData.value=table
-   }else if(val==='bulid'){
-    bulidUnitData.value=table
+], ([val, table]) => {
+   if (val === 'construction') {
+    constructUnitData.value = table
+    formBaseModel.value.constructUnit = table
+   } else if (val === 'supervision') {
+    supervisorUnitData.value = table
+   } else if (val === 'bulid') {
+    bulidUnitData.value = table
    }
-}, {deep: true})
+}, { deep: true })
 const tabTab = ref([
-    {key: 'bulid', name: '施工单位成本'},
-    {key: 'supervision', name: '监理单位成本'},
-    {key: 'construction', name: '建设单位成本'}
-]);
-const savetabdata=ref([])//当前数据
-const tabChange = ({key}) => {
+    { key: 'bulid', name: '施工单位成本' },
+    { key: 'supervision', name: '监理单位成本' },
+    { key: 'construction', name: '建设单位成本' },
+])
+
+const tabChange = ({ key }) => {
     tabKey.value = key
-    if(key=='supervision'){
-        tableData.value=supervisorUnitData.value.length>0?supervisorUnitData.value:[{}]
-        formBaseModel.value.supervisorUnit=tableData.value
-    }else if(key=='construction'){
-        tableData.value=constructUnitData.value.length>0?constructUnitData.value:[{}]
-        formBaseModel.value.constructUnit=tableData.value
-        console.log( formBaseModel.value.constructUnit,' formBaseModel.value.constructUnit');
-    }else if(key=='bulid'){
-        tableData.value=bulidUnitData.value.length>0?bulidUnitData.value:[{}]
-        formBaseModel.value.buildUnit=tableData.value
+    if (key === 'supervision') {
+        tableData.value = supervisorUnitData.value.length > 0 ? supervisorUnitData.value : [{}]
+        formBaseModel.value.supervisorUnit = tableData.value
+    } else if (key === 'construction') {
+        tableData.value = constructUnitData.value.length > 0 ? constructUnitData.value : [{}]
+        formBaseModel.value.constructUnit = tableData.value
+        console.log( formBaseModel.value.constructUnit, ' formBaseModel.value.constructUnit')
+    } else if (key === 'bulid') {
+        tableData.value = bulidUnitData.value.length > 0 ? bulidUnitData.value : [{}]
+        formBaseModel.value.buildUnit = tableData.value
     }
  
 }
@@ -370,53 +373,51 @@ const tabChange = ({key}) => {
 
 //成本测算表格
 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: 'action', name: '操作', width: '300', align: 'center', fixed: 'right'},
+    { 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: 'action', name: '操作', width: '300', align: 'center', fixed: 'right' },
 ]
 
 
-const originTableData=ref([{}])
-const addRow=()=>{
+
+const addRow = ()=>{
     tableData.value.push({
-        isEdit:true
+        isEdit:true,
     })
 }
-const delRow=(index)=>{
+const delRow = (index)=>{
     tableData.value.splice(index, 1)
-    console.log( tableData.value,' tableData.value');
-    if( tableData.value.length===0){
+    console.log( tableData.value, ' tableData.value')
+    if ( tableData.value.length === 0) {
         tableData.value.push({})
     }
  
 }
 //保存单行
-const saveRow=async(row)=>{
-    row.isEdit=false
+const saveRow = async (row)=>{
+    row.isEdit = false
     //统一测算金额
-    const {error, code, data} = await costApi.saveCountMoney(row)
+    const { error, code, data } = await costApi.saveCountMoney(row)
     if (!error && code === 200) {
-       let obj=getObjValue(data)
-       row.budgetCountMoney=obj.budgetCountMoney
-       row.outsourceCountMoney=obj.outsourceCountMoney
-       row.budgetStaffCost=obj.budgetStaffCost
+       let obj = getObjValue(data)
+       row.budgetCountMoney = obj.budgetCountMoney
+       row.outsourceCountMoney = obj.outsourceCountMoney
+       row.budgetStaffCost = obj.budgetStaffCost
 
-    } else {
-      
     }
     
 }
@@ -424,43 +425,43 @@ const saveRow=async(row)=>{
 const goBackClick = () => {
     router.back()
 }
-const isEmptyObj=(obj)=> {
-    let arr = Object.keys(obj);
-    return(arr.length == 0)
+const isEmptyObj = (obj)=> {
+    let arr = Object.keys(obj)
+    return (arr.length === 0)
 
 }    
 
 
 //保存submitForm
-const submitLoaing=ref(false)
-const submitForm=async()=>{
- console.log(formBaseModel.value.supervisorUnit,'formBaseModel.value.supervisorUnit');
+const submitLoaing = ref(false)
+const submitForm = async ()=>{
+ console.log(formBaseModel.value.supervisorUnit, 'formBaseModel.value.supervisorUnit')
     //取消空对象提交
-    if(formBaseModel.value?.supervisorUnit?.length>0){
-        let suisnullObj= isEmptyObj(formBaseModel.value?.supervisorUnit[0]) 
-        if(suisnullObj===true){
-            formBaseModel.value.supervisorUnit=null
+    if (formBaseModel.value?.supervisorUnit?.length > 0) {
+        let suisnullObj = isEmptyObj(formBaseModel.value?.supervisorUnit[0]) 
+        if (suisnullObj === true) {
+            formBaseModel.value.supervisorUnit = null
         }
     } 
-    if(formBaseModel.value?.constructUnit?.length>0){
-        let coisnullObj= isEmptyObj(formBaseModel.value?.constructUnit[0]) 
-        if(coisnullObj){
-            formBaseModel.value.constructUnit=null
+    if (formBaseModel.value?.constructUnit?.length > 0) {
+        let coisnullObj = isEmptyObj(formBaseModel.value?.constructUnit[0]) 
+        if (coisnullObj) {
+            formBaseModel.value.constructUnit = null
         }
     }
-    if(formBaseModel.value?.buildUnit?.length>0){
-        let buisnullObj= isEmptyObj(formBaseModel.value?.buildUnit[0]) 
-        if(buisnullObj){
-            formBaseModel.value.buildUnit=null
+    if (formBaseModel.value?.buildUnit?.length > 0) {
+        let buisnullObj = isEmptyObj(formBaseModel.value?.buildUnit[0]) 
+        if (buisnullObj) {
+            formBaseModel.value.buildUnit = null
         }
     }
 
 
     const res = await formValidate(formBaseRef.value)
-    if(res){
-        submitLoaing.value=true
-        const {error, code, data,msg} = await costApi.AddOrUpdate( formBaseModel.value)
-        submitLoaing.value=false
+    if (res) {
+        submitLoaing.value = true
+        const { error, code, msg } = await costApi.AddOrUpdate( formBaseModel.value)
+        submitLoaing.value = false
         if (!error && code === 200) {
         window.$message.success(msg)
           
@@ -472,8 +473,6 @@ const submitForm=async()=>{
     }
 
 }
-
-
 </script>
 
 <style lang="scss" scoped>

+ 50 - 52
src/views/project/cost/index.vue

@@ -2,51 +2,57 @@
     <HcCard>
         <template #header>
             <div class=" ml-2">
-                <el-input v-model="searchForm.queryValue" clearable placeholder="请输入项目名称进行查询" size="large"/>
+                <el-input v-model="searchForm.queryValue" clearable placeholder="请输入项目名称进行查询" size="large" />
             </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="primary" hc-btn @click="addRowClick">
-                <HcIcon name="add"/>
+                <HcIcon name="add" />
                 <span>新增项目成本测算</span>
             </el-button>
         </template>
 
         <HcTable :column="tableColumn" :datas="tableData" :loading="tableLoading">
-            <template #projectName="{row}">
-                <span class="text-blue text-hover" @click="rowNameTap(row)">{{row.projectName}}</span>
+            <template #projectName="{ row }">
+                <span class="text-blue text-hover" @click="rowNameTap(row)">{{ row.projectName }}</span>
             </template>
-            <template #action="{row,index}">
-                <el-button plain size="small" type="success" @click="approvalRowClick(row)"  :disabled="row?.approveStatus!=='1'">提交审批</el-button>
-                <el-button plain size="small" type="primary" @click="editRowClick(row)">编辑</el-button>
-                <el-button plain size="small" type="danger" @click="delRowClick(row)">删除</el-button>
+            <template #action="{ row }">
+                <el-button 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>
+                <el-button plain size="small" type="danger" @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 {ref,onMounted,onActivated} from "vue";
-import {useRouter} from 'vue-router'
-import costApi from '~api/project/cost.js';
-import {getArrValue} from "js-fast-way"
-import {delMessage} from "~uti/tools";
+import { onActivated, ref } from 'vue'
+import { useRouter } from 'vue-router'
+import costApi from '~api/project/cost.js'
+import { getArrValue } from 'js-fast-way'
+import { delMessage } from '~uti/tools'
 
 
 const router = useRouter()
@@ -54,40 +60,32 @@ onActivated(()=>{
     getTableData()
   
 })
-//项目类型
-const projectType = ref([])
 
-const serverType=ref([])
 
 
 
 
-//年度数据
-const annuals = ref([
-    {name: '2023年5月', key: '2023-05'},
-    {name: '2022年4月', key: '2022-04'},
-    {name: '2021年3月', key: '2021-03'}
-])
+
 
 //搜索表单
 const searchForm = ref({
     projectType: null, user: null, project: 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,25 +94,25 @@ const pageChange = ({current, size}) => {
 //获取数据
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'projectName', name: '项目名称'},
-    {key: 'projectCostTotal', name: '项目测算总金额', width: '120', align: 'center'},
-    {key: 'devCostTotal', name: '研发部成本总金额', width: '120', align: 'center'},
-    {key: 'businessCostTotal', name: '实施部成本总金额', width: '120', align: 'center'},
-    {key: 'maintainCostTotal', name: '维护部成本总金额', width: '120', align: 'center'},
-    {key: 'marketCostTotal', name: '市场部成本总金额', width: '120', align: 'center'},
-    {key: 'manageCostTotal', name: '管理费成本总金额', width: '120', align: 'center'},
-    {key: 'outsourceCostTotal', name: '外包劳务成本总金额', width: '120', align: 'center'},
-    {key: 'action', name: '操作', width: '250', align: 'center', fixed: 'right'},
+    { key: 'projectName', name: '项目名称' },
+    { key: 'projectCostTotal', name: '项目测算总金额', width: '120', align: 'center' },
+    { key: 'devCostTotal', name: '研发部成本总金额', width: '120', align: 'center' },
+    { key: 'businessCostTotal', name: '实施部成本总金额', width: '120', align: 'center' },
+    { key: 'maintainCostTotal', name: '维护部成本总金额', width: '120', align: 'center' },
+    { key: 'marketCostTotal', name: '市场部成本总金额', width: '120', align: 'center' },
+    { key: 'manageCostTotal', name: '管理费成本总金额', width: '120', align: 'center' },
+    { key: 'outsourceCostTotal', name: '外包劳务成本总金额', width: '120', align: 'center' },
+    { key: 'action', name: '操作', width: '250', align: 'center', fixed: 'right' },
 ]
 const tableData = ref([
-    {id: 1, key: '焦作至唐河高速公路方城至唐河段', key1: '810232', key2: '203200', key3: '192000', key4: '120350', key5: '63540', key6: '320000', key7: '12000'},
-    {id: 2, key: '焦作至唐河高速公路方城至唐河段', key1: '810232', key2: '203200', key3: '192000', key4: '120350', key5: '63540', key6: '320000', key7: '12000'},
-    {id: 3, key: '焦作至唐河高速公路方城至唐河段', key1: '810232', key2: '203200', key3: '192000', key4: '120350', key5: '63540', key6: '320000', key7: '12000'},
+    { id: 1, key: '焦作至唐河高速公路方城至唐河段', key1: '810232', key2: '203200', key3: '192000', key4: '120350', key5: '63540', key6: '320000', key7: '12000' },
+    { id: 2, key: '焦作至唐河高速公路方城至唐河段', key1: '810232', key2: '203200', key3: '192000', key4: '120350', key5: '63540', key6: '320000', key7: '12000' },
+    { id: 3, key: '焦作至唐河高速公路方城至唐河段', key1: '810232', key2: '203200', key3: '192000', key4: '120350', key5: '63540', key6: '320000', key7: '12000' },
 ])
 
-const getTableData = async() => {
+const getTableData = async () => {
     tableLoading.value = true
-    const {error, code, data} = await costApi.getprojectCostBudgetStats(searchForm.value)
+    const { error, code, data } = await costApi.getprojectCostBudgetStats(searchForm.value)
     tableLoading.value = false
     if (!error && code === 200) {
         tableData.value = getArrValue(data)
@@ -127,21 +125,21 @@ const getTableData = async() => {
 
 //新增报销记录
 const addRowClick = () => {
-    router.push({name: 'project-cost-form'})
+    router.push({ name: 'project-cost-form' })
 }
 
 //编辑报销记录
 const editRowClick = (row) => {
     router.push({
         name: 'project-cost-form',
-        query: {id: row.id}
+        query: { id: row.id },
     })
 }
 //删除成本预算deleteByStatsId
 
-const delRowClick = async(row) => {
-    delMessage(async() => {
-        const {error, code, data,msg} = await costApi.deleteByStatsId({id:row.id})  
+const delRowClick = async (row) => {
+    delMessage(async () => {
+        const { error, code, msg } = await costApi.deleteByStatsId({ id:row.id })  
             if (!error && code === 200) {
                 window.$message.success(msg)
                 getTableData()
@@ -154,13 +152,13 @@ const delRowClick = async(row) => {
 const rowNameTap = (row) => {
     router.push({
         name: 'project-cost-data',
-        query: {id: row.projectId}
+        query: { id: row.projectId },
     })
 }
 
 //提交审批
-const approvalRowClick = async(row) => {
-    const {error, code, data,msg} = await costApi.submitApprove({id:row.id})  
+const approvalRowClick = async (row) => {
+    const { error, code, msg } = await costApi.submitApprove({ id:row.id })  
     if (!error && code === 200) {
         window.$message.success(msg)
         getTableData()

+ 72 - 73
src/views/project/list/index.vue

@@ -3,17 +3,17 @@
         <template #header>
             <div class="w-36">
                 <el-select v-model="searchForm.projectType" block clearable placeholder="项目类型" size="large">
-                    <el-option v-for="item in projectType" :label="item.dictName" :value="item.dictValue"/>
+                    <el-option v-for="item in projectType" :key="item.dictValue" :label="item.dictName" :value="item.dictValue" />
                 </el-select>
             </div>
             <div class="w-40 ml-2">
                 <el-select v-model="searchForm.projectServerType" block clearable placeholder="服务类型" size="large">
-                    <el-option v-for="item in serverType" :label="item.dictName" :value="item.dictValue"/>
+                    <el-option v-for="item in serverType" :key="item.dictValue" :label="item.dictName" :value="item.dictValue" />
                 </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" :label="item.name" :value="item.id"/>
+                    <el-option v-for="item in projectUser" :key="item.id" :label="item.name" :value="item.id" />
                 </el-select>
             </div>
             <div class="w-36 ml-2 ">
@@ -29,55 +29,59 @@
                 />
             </div>
             <div class="w-48 ml-2">
-                <el-input v-model="searchForm.queryValue" clearable placeholder="请输入项目名称进行查询" @keyup="keyUpEvent" size="large"/>
+                <el-input v-model="searchForm.queryValue" clearable placeholder="请输入项目名称进行查询" size="large" @keyup="keyUpEvent" />
             </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="primary" hc-btn @click="addRowClick">
-                <HcIcon name="add"/>
+                <HcIcon name="add" />
                 <span>新增项目信息</span>
             </el-button>
         </template>
 
-        <HcTable :isIndex="false" :column="tableColumn" :datas="tableData" :loading="tableLoading">
-            <template #name="{row}">
-                <span class="text-blue text-hover" @click="rowClick(row)">{{row.name}}</span>
+        <HcTable :is-index="false" :column="tableColumn" :datas="tableData" :loading="tableLoading">
+            <template #name="{ row }">
+                <span class="text-blue text-hover" @click="rowClick(row)">{{ row.name }}</span>
             </template>
-            <template #key7="{row}">
-                <span class="text-blue ">{{row.startTime?row.startTime:''}}</span>
-                <span class="text-blue " v-if="row.endTime">~</span>
-                <span class="text-blue ">{{row.endTime?row.endTime:''}}</span>
+            <template #key7="{ row }">
+                <span class="text-blue ">{{ row.startTime ? row.startTime : '' }}</span>
+                <span v-if="row.endTime" class="text-blue ">~</span>
+                <span class="text-blue ">{{ row.endTime ? row.endTime : '' }}</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="delRowClick(row)" :loading="row.delLoad||false">删除</el-button>
+            <template #action="{ row }">
+                <el-button 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>
             </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 {useRouter} from 'vue-router'
-import projectApi from '~api/project/project-list.js';
-import {getArrValue} from "js-fast-way"
-import {delMessage} from "~uti/tools";
+import { onActivated, onMounted, ref } from 'vue'
+import { useRouter } from 'vue-router'
+import projectApi from '~api/project/project-list.js'
+import { getArrValue } from 'js-fast-way'
+import { delMessage } from '~uti/tools'
 
 const router = useRouter()
 onMounted(()=>{
@@ -104,42 +108,37 @@ const projectUser = ref([
    
 ])
 
-//年度数据
-const annuals = ref([
-    {name: '2023年5月', key: '2023-05'},
-    {name: '2022年4月', key: '2022-04'},
-    {name: '2021年3月', key: '2021-03'}
-])
+
 
 //搜索表单
 const searchForm = ref({
     projectType: null, contractType: null, projectUser: null, date: null, queryValue: '',
-    current: 1, size: 20, total: 0
+    current: 1, size: 20, total: 0,
 })
 
 //搜索框回车
 const keyUpEvent = (event) => {
-    if (event.key === "Enter") {
-        searchForm.value.current = 1;
+    if (event.key === 'Enter') {
+        searchForm.value.current = 1
         getTableData()
     }
 }
 
 //搜索
 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 }
     getTableData()
 }
 
 
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
     getTableData()
@@ -148,26 +147,26 @@ const pageChange = ({current, size}) => {
 //获取数据
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'number', name: '编号', width: '100', align: 'center'},
-    {key: 'name', name: '项目名称', minWidth: '260'},
-    {key: 'constructUnit', name: '客户单位', width: '200', align: 'center'},
-    {key: 'projectTypeValue', name: '项目类型', width: '140', align: 'center'},
-    {key: 'projectServerTypeValue', name: '服务类型', width: '140', align: 'center'},
-    {key: 'contractMoney', name: '合同额(W)', width: '100', align: 'center'},
-    {key: 'projectPrincipalName', name: '项目负责人', width: '100', align: 'center'},
-    {key: 'implementPrincipalName', name: '实施负责人', width: '100', align: 'center'},
-    {key: 'key7', name: '项目起止日期', width: '220', align: 'center'},
-    {key: 'action', name: '操作', width: '160', align: 'center', fixed: 'right'},
+    { key: 'number', name: '编号', width: '100', align: 'center' },
+    { key: 'name', name: '项目名称', minWidth: '260' },
+    { key: 'constructUnit', name: '客户单位', width: '200', align: 'center' },
+    { key: 'projectTypeValue', name: '项目类型', width: '140', align: 'center' },
+    { key: 'projectServerTypeValue', name: '服务类型', width: '140', align: 'center' },
+    { key: 'contractMoney', name: '合同额(W)', width: '100', align: 'center' },
+    { key: 'projectPrincipalName', name: '项目负责人', width: '100', align: 'center' },
+    { key: 'implementPrincipalName', name: '实施负责人', width: '100', align: 'center' },
+    { key: 'key7', name: '项目起止日期', width: '220', align: 'center' },
+    { key: 'action', name: '操作', width: '160', align: 'center', fixed: 'right' },
 ]
 const tableData = ref([
-    {id: 1, key: 'GS-01', key1: '焦作至唐河高速公路方城至唐河段', key2: '研发-配置', key3: '2022-07-01', key4: '高速公路', key5: '软件合同', key6: '40', key8: '张三', key7: '2022-07-01 ~ 2022-04-01'},
-    {id: 2, key: 'GS-01', key1: '焦作至唐河高速公路方城至唐河段', key2: '研发-配置', key3: '2022-07-01', key4: '高速公路', key5: '软件合同', key6: '40', key7: '2022-07-01 ~ 2022-04-01'},
-    {id: 3, key: 'GS-01', key1: '焦作至唐河高速公路方城至唐河段', key2: '研发-配置', key3: '2022-07-01', key4: '高速公路', key5: '软件合同', key6: '40', key7: '2022-07-01 ~ 2022-04-01'},
+    { id: 1, key: 'GS-01', key1: '焦作至唐河高速公路方城至唐河段', key2: '研发-配置', key3: '2022-07-01', key4: '高速公路', key5: '软件合同', key6: '40', key8: '张三', key7: '2022-07-01 ~ 2022-04-01' },
+    { id: 2, key: 'GS-01', key1: '焦作至唐河高速公路方城至唐河段', key2: '研发-配置', key3: '2022-07-01', key4: '高速公路', key5: '软件合同', key6: '40', key7: '2022-07-01 ~ 2022-04-01' },
+    { id: 3, key: 'GS-01', key1: '焦作至唐河高速公路方城至唐河段', key2: '研发-配置', key3: '2022-07-01', key4: '高速公路', key5: '软件合同', key6: '40', key7: '2022-07-01 ~ 2022-04-01' },
 ])
 
-const getTableData = async() => {
+const getTableData = async () => {
     tableLoading.value = true
-    const {error, code, data} = await projectApi.getProjectList(searchForm.value)
+    const { error, code, data } = await projectApi.getProjectList(searchForm.value)
     tableLoading.value = false
     if (!error && code === 200) {
         tableData.value = getArrValue(data['records'])
@@ -178,30 +177,30 @@ const getTableData = async() => {
     }
 }
 //获取项目类型
-const getProjectType=async()=>{
-    const {error, code, data} = await projectApi.getProjectTypeDict()
+const getProjectType = async ()=>{
+    const { error, code, data } = await projectApi.getProjectTypeDict()
     if (!error && code === 200) {
-        projectType.value=getArrValue(data)
+        projectType.value = getArrValue(data)
     } else {
-        projectType.value=[]
+        projectType.value = []
     }
 }
 //获取项目服务类型
-const getProjectServerTypeDict=async()=>{
-    const {error, code, data} = await projectApi.getProjectServerTypeDict()
+const getProjectServerTypeDict = async ()=>{
+    const { error, code, data } = await projectApi.getProjectServerTypeDict()
     if (!error && code === 200) {
-        serverType.value=getArrValue(data)
+        serverType.value = getArrValue(data)
     } else {
-        serverType.value=[]
+        serverType.value = []
     }
 }
 //获取实施负责人
-const getImplementUser=async()=>{
-    const {error, code, data} = await projectApi.getImplementUser()
+const getImplementUser = async ()=>{
+    const { error, code, data } = await projectApi.getImplementUser()
     if (!error && code === 200) {
-        projectUser.value=getArrValue(data)
+        projectUser.value = getArrValue(data)
     } else {
-        projectUser.value=[]
+        projectUser.value = []
     }
 }
 //查看
@@ -210,8 +209,8 @@ const rowClick = (row) => {
         name: 'project-list-info',
         query: {
             id: row.id,
-            type: 'view'
-        }
+            type: 'view',
+        },
     })
 }
 
@@ -221,8 +220,8 @@ const editRowClick = (row) => {
         name: 'project-list-info',
         query: {
             id: row.id,
-            type: 'edit'
-        }
+            type: 'edit',
+        },
     })
 }
 
@@ -231,16 +230,16 @@ const addRowClick = () => {
     router.push({
         name: 'project-list-info',
         query: {
-            type: 'add'
-        }
+            type: 'add',
+        },
     })
 }
 //删除
 const delRowClick = (row) => {
-    delMessage(async() => {
-            row.delLoad= true
-            const {error, code, data,msg} = await projectApi.removeProjectInfo({id:row.id})
-            row.delLoad= false
+    delMessage(async () => {
+            row.delLoad = true
+            const { error, code, msg } = await projectApi.removeProjectInfo({ id:row.id })
+            row.delLoad = false
             if (!error && code === 200) {
                 window.$message.success(msg)
                 getTableData()

+ 123 - 119
src/views/project/list/list-info.vue

@@ -1,5 +1,5 @@
 <template>
-    <HcCard actionUi="text-center">
+    <HcCard action-ui="text-center">
         <div class="hac-card-project-box">
             <div class="left-box">
                 <el-scrollbar>
@@ -7,19 +7,19 @@
                         <div class="project-form-top">
                             <HcCardItem title="基础信息">
                                 <el-form-item label="项目名称:" prop="name">
-                                    <el-input v-model="formModel.name"/>
+                                    <el-input v-model="formModel.name" />
                                 </el-form-item>
                                 <el-form-item label="建设单位:" prop="constructUnit">
-                                    <el-input v-model="formModel.constructUnit"/>
+                                    <el-input v-model="formModel.constructUnit" />
                                 </el-form-item>
                                 <el-form-item label="项目类型:" prop="projectType">
                                     <el-select v-model="formModel.projectType" block clearable placeholder="项目类型">
-                                        <el-option v-for="item in projectType" :label="item.dictName" :value="item.dictValue"/>
+                                        <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-option v-for="item in projectProcess" :label="item.dictName" :value="item.key"/>
+                                        <el-option v-for="item in projectProcess" :key="item.key" :label="item.dictName" :value="item.key" />
                                     </el-select>
                                 </el-form-item>
                                 <!-- <el-form-item label="项目进程:" prop="currentProcessName">
@@ -27,23 +27,23 @@
                                 </el-form-item> -->
                                 <el-form-item label="服务类型:" prop="projectServerType">
                                     <el-select v-model="formModel.projectServerType" block clearable placeholder="项目服务类型">
-                                        <el-option v-for="item in serverType" :label="item.dictName" :value="item.dictValue"/>
+                                        <el-option v-for="item in serverType" :key="item.dictValue" :label="item.dictName" :value="item.dictValue" />
                                     </el-select>
                                 </el-form-item>
                                 <el-form-item label="起止日期:">
-                                    <HcDatePicker :dates="probetweenTime" clearable @change="betweenTimeUpdate" size="large" disabled="disabled" />
+                                    <HcDatePicker :dates="probetweenTime" clearable size="large" disabled="disabled" @change="betweenTimeUpdate" />
                                 </el-form-item>
                                 <el-form-item label="合同额:">
-                                    <el-input v-model="formModel.contractMoney" disabled="disabled"/>
+                                    <el-input v-model="formModel.contractMoney" disabled="disabled" />
                                 </el-form-item>
                                 <el-form-item label="已回款:">
-                                    <el-input v-model="formModel.key7" disabled="disabled"/>
+                                    <el-input v-model="formModel.key7" disabled="disabled" />
                                 </el-form-item>
                                 <el-form-item label="未回款:">
-                                    <el-input v-model="formModel.key7" disabled="disabled"/>
+                                    <el-input v-model="formModel.key7" disabled="disabled" />
                                 </el-form-item>
                                 <el-form-item label="已支出:">
-                                    <el-input v-model="formModel.key7" disabled="disabled"/>
+                                    <el-input v-model="formModel.key7" disabled="disabled" />
                                 </el-form-item>
                             </HcCardItem>
                         </div>
@@ -51,17 +51,17 @@
                             <HcCardItem title="联系人信息">
                                 <el-form-item label="项目负责人:">
                                     <el-select v-model="formModel.projectPrincipal" block clearable placeholder="项目负责人" size="large">
-                                        <el-option v-for="item in userList" :label="item.name" :value="item.id"/>
+                                        <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-option v-for="item in userList" :label="item.name" :value="item.id"/>
+                                        <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-option v-for="item in userList" :label="item.name" :value="item.id"/>
+                                        <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id" />
                                     </el-select>
                                 </el-form-item>
                             </HcCardItem>
@@ -72,24 +72,28 @@
             <div class="right-box">
                 <el-scrollbar class="hc--right-15">
                     <el-timeline class="p-1">
-                        <el-timeline-item v-for="(item, index) in timeLineData" :key="index" :type="item.status===3?'success':item.status===2?'primary':'info'">
+                        <el-timeline-item v-for="(item, index) in timeLineData" :key="index" :type="item.status === 3 ? 'success' : item.status === 2 ? 'primary' : 'info'">
                             <div class="hac-time-line-box">
                                 <div class="hac-time-line-title-box">
-                                    <div class="title">{{item.name}}</div>
-                                    <div class="state">{{item.statusValue}}</div>
+                                    <div class="title">
+                                        {{ item.name }}
+                                    </div>
+                                    <div class="state">
+                                        {{ item.statusValue }}
+                                    </div>
                                 </div>
                                 <div class="hac-time-line-time">
-                                    <span class="time" v-if="item.processStartTime">{{item.processStartTime+"~"+item.processEndTime}}</span>
-                                    <span class="icon text-blue text-hover" v-if="dataType !== 'view'" @click="editTime(item)">
-                                        <HcIcon name="edit-2"/>
+                                    <span v-if="item.processStartTime" class="time">{{ `${item.processStartTime}~${item.processEndTime}` }}</span>
+                                    <span v-if="dataType !== 'view'" class="icon text-blue text-hover" @click="editTime(item)">
+                                        <HcIcon name="edit-2" />
                                     </span>
                                 </div>
-                                <div class="hac-time-line-time picker" v-if="item.editTime">
+                                <div v-if="item.editTime" class="hac-time-line-time picker">
                                     <div class="picker-box">
-                                        <HcDatePicker :dates="item.betweenTime" clearable @change="probetweenTimeUpdate($event,item)"/>
+                                        <HcDatePicker :dates="item.betweenTime" clearable @change="probetweenTimeUpdate($event, item)" />
                                     </div>
                                     <div class="icon-box text-blue text-hover" @click="item.editTime = false">
-                                        <HcIcon name="check"/>
+                                        <HcIcon name="check" />
                                     </div>
                                 </div>
                             </div>
@@ -100,12 +104,12 @@
         </div>
         <template #action>
             <el-button size="large" type="info" hc-btn @click="goBackClick">
-                <HcIcon name="arrow-go-back"/>
+                <HcIcon name="arrow-go-back" />
                 <span v-if="dataType !== 'view'">取消并返回</span>
                 <span v-else>返回</span>
             </el-button>
-            <el-button size="large" type="primary" hc-btn @click="doubleClick" v-if="dataType !== 'view'" :loading="saveLoading" :disabled="saveLoading" >
-                <HcIcon name="check-double"/>
+            <el-button v-if="dataType !== 'view'" size="large" type="primary" hc-btn :loading="saveLoading" :disabled="saveLoading" @click="doubleClick">
+                <HcIcon name="check-double" />
                 <span>提交保存</span>
             </el-button>
         </template>
@@ -113,13 +117,13 @@
 </template>
 
 <script setup>
-import {ref, onActivated,onMounted} from "vue";
-import {useRoute, useRouter} from 'vue-router'
-import projectApi from '~api/project/project-list.js';
-import {getArrValue,getObjValue,formValidate} from "js-fast-way"
-import { getuserList} from "~api/other";
-import {useAppStore} from "~src/store";
-const useAppState = useAppStore();
+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 { useAppStore } from '~src/store'
+const useAppState = useAppStore()
 
 const router = useRouter()
 const useRoutes = useRoute()
@@ -134,12 +138,12 @@ onActivated(() => {
     dataId.value = useRoutes?.query?.id ?? ''
     getBaseProcess()
     getUserDict()
-    if(dataType.value!=='add'){
+    if (dataType.value !== 'add') {
         getProjectInfoById()
         
-    }else{
-        formModel.value={}
-        probetweenTime.value=[]
+    } else {
+        formModel.value = {}
+        probetweenTime.value = []
     }
    
 })
@@ -149,28 +153,28 @@ onMounted(()=>{
   
 })
 //获取项目类型
-const getProjectType=async()=>{
-    const {error, code, data} = await projectApi.getProjectTypeDict()
+const getProjectType = async ()=>{
+    const { error, code, data } = await projectApi.getProjectTypeDict()
     if (!error && code === 200) {
-        projectType.value=getArrValue(data)
+        projectType.value = getArrValue(data)
     } else {
-        projectType.value=[]
+        projectType.value = []
     }
 }
 //获取项目服务类型
-const getProjectServerTypeDict=async()=>{
-    const {error, code, data} = await projectApi.getProjectServerTypeDict()
+const getProjectServerTypeDict = async ()=>{
+    const { error, code, data } = await projectApi.getProjectServerTypeDict()
     if (!error && code === 200) {
-        serverType.value=getArrValue(data)
+        serverType.value = getArrValue(data)
     } else {
-        serverType.value=[]
+        serverType.value = []
     }
 }
 //获取所有员工
-const userList=ref([])
+const userList = ref([])
 //获取部门人员列表
-const getUserDict=async()=>{
-    const {error, code, data} = await getuserList({tenantId:useAppState.tenantId})
+const getUserDict = async ()=>{
+    const { error, code, data } = await getuserList({ tenantId:useAppState.tenantId })
     if (!error && code === 200) {
         userList.value = getArrValue(data)
 
@@ -180,27 +184,27 @@ const getUserDict=async()=>{
     }
 }
 //获取项目详情
-const getProjectInfoById=async()=>{
-    const {error, code, data} = await projectApi.getProjectInfoById({id: dataId.value})
+const getProjectInfoById = async ()=>{
+    const { error, code, data } = await projectApi.getProjectInfoById({ id: dataId.value })
     if (!error && code === 200) {
-        formModel.value=getObjValue(data)
-        let arr=[]
-        arr[0]= formModel.value?.startTime
-        arr[1]= formModel.value?.endTime
-        probetweenTime.value=arr
-        formModel.value.contractMoney=formModel.value.contractMoney>0?formModel.value.contractMoney:''
-        timeLineData.value=formModel.value?.projectProcessList
+        formModel.value = getObjValue(data)
+        let arr = []
+        arr[0] = formModel.value?.startTime
+        arr[1] = formModel.value?.endTime
+        probetweenTime.value = arr
+        formModel.value.contractMoney = formModel.value.contractMoney > 0 ? formModel.value.contractMoney : ''
+        timeLineData.value = formModel.value?.projectProcessList
     } else {
-        formModel.value={}
+        formModel.value = {}
     }
 }
 //新增获取项目进程
-const getBaseProcess=async()=>{
-    const {error, code, data} = await projectApi.getBaseProcess()
+const getBaseProcess = async ()=>{
+    const { error, code, data } = await projectApi.getBaseProcess()
     if (!error && code === 200) {
-        timeLineData.value=getArrValue(data)
+        timeLineData.value = getArrValue(data)
     } else {
-        timeLineData.value=[]
+        timeLineData.value = []
 
     }
 }
@@ -209,20 +213,20 @@ const projectType = ref([])
 
 //项目服务类型
 const serverType = ref([])
-const contractType=ref([])
+
 //项目进程
 const projectProcess = ref([
-    {name: '商机-演示沟通', key: '1'},
-    {name: '商机-成本核算及报价', key: '2'},
-    {name: '合同-服务范围洽谈', key: '3'},
-    {name: '产品-研发', key: '4'},
-    {name: '产品-配置', key: '5'},
-    {name: '产品-测试', key: '6'},
-    {name: '产品-交付', key: '7'},
-    {name: '实施-系统培训', key: '8'},
-    {name: '实施-现场服务', key: '9'},
-    {name: '实施-合同回款', key: '10'},
-    {name: '项目验收', key: '11'},
+    { name: '商机-演示沟通', key: '1' },
+    { name: '商机-成本核算及报价', key: '2' },
+    { name: '合同-服务范围洽谈', key: '3' },
+    { name: '产品-研发', key: '4' },
+    { name: '产品-配置', key: '5' },
+    { name: '产品-测试', key: '6' },
+    { name: '产品-交付', key: '7' },
+    { name: '实施-系统培训', key: '8' },
+    { name: '实施-现场服务', key: '9' },
+    { name: '实施-合同回款', key: '10' },
+    { name: '项目验收', key: '11' },
 ])
 
 //顶部表单数据
@@ -234,17 +238,17 @@ const formRules = {
     name: {
         required: true,
         trigger: 'blur',
-        message: "请输入项目名称"
+        message: '请输入项目名称',
     },
     projectType: {
         required: true,
         trigger: 'blur',
-        message: "请选择项目类型"
+        message: '请选择项目类型',
     },
     constructUnit: {
         required: true,
         trigger: 'blur',
-        message: "请选择项目建设单位"
+        message: '请选择项目建设单位',
     },
 
 }
@@ -252,71 +256,71 @@ const formRules = {
 
 //日期时间被选择
 const probetweenTime = ref(null)
-const betweenTimeUpdate = ({arr, query}) => {
-    console.log(arr,'arr');
+const betweenTimeUpdate = ({ arr, query }) => {
+    console.log(arr, 'arr')
     probetweenTime.value = arr
     formModel.value.betweenTime = query
-    formModel.value.startTime=arr[0]
-    formModel.value.endTime=arr[1]
-    console.log(formModel.value.startTime,'sta');
-    if(arr.length===0){
-        formModel.value.startTime=''
-        formModel.value.endTime=''
-        console.log( formModel.value.endTime,'end');
+    formModel.value.startTime = arr[0]
+    formModel.value.endTime = arr[1]
+    console.log(formModel.value.startTime, 'sta')
+    if (arr.length === 0) {
+        formModel.value.startTime = ''
+        formModel.value.endTime = ''
+        console.log( formModel.value.endTime, 'end')
     }
 }
 const betweenTime = ref(null)
-const probetweenTimeUpdate = ({arr, query},item) => {
+const probetweenTimeUpdate = ({ arr }, item) => {
     betweenTime.value = arr
-    item.processStartTime=arr[0]
-    item.processEndTime=arr[1]
-    item.betweenTime=arr
+    item.processStartTime = arr[0]
+    item.processEndTime = arr[1]
+    item.betweenTime = arr
 }
-const editTime=(item)=>{
+const editTime = (item)=>{
     item.editTime = true
-    item.betweenTime=[item.processStartTime,item.processEndTime]
+    item.betweenTime = [item.processStartTime, item.processEndTime]
 }
 //时间线数据
 const timeLineData = ref([
-    {title: '商机-沟通演示', state: '已闭环', time: '2023-02-23~2023-03-14', type: 'success'},
-    {title: '商机-成本核算及报价', state: '已闭环', time: '2023-02-23~2023-03-14'},
-    {title: '合同-服务范围洽谈', state: '进行中', time: '2023-02-23~2023-03-14', type: 'primary'},
-    {title: '产品-研发', state: '未开始', time: ''},
-    {title: '产品-配置', state: '未开始', time: ''},
-    {title: '产品-测试', state: '未开始', time: ''},
-    {title: '产品-交付', state: '未开始', time: ''},
-    {title: '实施-系统培训', state: '未开始', time: ''},
-    {title: '实施-现场服务', state: '未开始', time: ''},
-    {title: '实施-合同回款', state: '未开始', time: ''},
-    {title: '劳务合同', state: '未开始', time: ''},
-    {title: '交竣工验收', state: '未开始', time: ''},
+    { title: '商机-沟通演示', state: '已闭环', time: '2023-02-23~2023-03-14', type: 'success' },
+    { title: '商机-成本核算及报价', state: '已闭环', time: '2023-02-23~2023-03-14' },
+    { title: '合同-服务范围洽谈', state: '进行中', time: '2023-02-23~2023-03-14', type: 'primary' },
+    { title: '产品-研发', state: '未开始', time: '' },
+    { title: '产品-配置', state: '未开始', time: '' },
+    { title: '产品-测试', state: '未开始', time: '' },
+    { title: '产品-交付', state: '未开始', time: '' },
+    { title: '实施-系统培训', state: '未开始', time: '' },
+    { title: '实施-现场服务', state: '未开始', time: '' },
+    { title: '实施-合同回款', state: '未开始', time: '' },
+    { title: '劳务合同', state: '未开始', time: '' },
+    { title: '交竣工验收', state: '未开始', time: '' },
 ])
 
 //返回
 const goBackClick = () => {
     router.back()
 }
-const saveLoading=ref(false)
+const saveLoading = ref(false)
 //提交保存
-const doubleClick =async () => {
-    saveLoading.value=true
-    formModel.value.projectProcessList=timeLineData.value
+const doubleClick = async () => {
+    saveLoading.value = true
+    formModel.value.projectProcessList = timeLineData.value
     const res = await formValidate(formRef.value)
-    if(res){
-        if (dataId.value.length>0) {
-            formModel.value.id=dataId.value
+    if (res) {
+        if (dataId.value.length > 0) {
+            formModel.value.id = dataId.value
             updateProjectInfo()
-        }else{
+        } else {
             addProjectInfo()
         }
     } else {
-        saveLoading.value=false;
+        saveLoading.value = false
     }
 }
 //新增项目
-const addProjectInfo=async()=>{
-    const {error, code, data,msg} = await projectApi.addProjectInfo( formModel.value)
-    saveLoading.value=false;
+const addProjectInfo = async ()=>{
+    const { error, code, msg } = await projectApi.addProjectInfo( formModel.value)
+    saveLoading.value = false
     if (!error && code === 200) {
         window.$message.success(msg)
         router.push({
@@ -325,9 +329,9 @@ const addProjectInfo=async()=>{
     } 
 }
 //修改
-const updateProjectInfo=async()=>{
-    const {error, code, data,msg} = await projectApi.updateProjectInfo( formModel.value)
-    saveLoading.value=false;
+const updateProjectInfo = async ()=>{
+    const { error, code, msg } = await projectApi.updateProjectInfo( formModel.value)
+    saveLoading.value = false
     if (!error && code === 200) {
        window.$message.success(msg)
        router.push({

+ 28 - 28
src/views/risk/warning.vue

@@ -1,55 +1,55 @@
 <template>
-   <HcCard actionSize="lg" scrollbar>
+    <HcCard action-size="lg" scrollbar>
         <template #header>
             <div class="warn_text">
-                <HcIcon name="alert" class="warn_icon"/>
+                <HcIcon name="alert" class="warn_icon" />
                 <span>15条</span>
             </div>
         </template>
         <HcTable :column="tableColumn" :datas="tableData">
-            <template #name="{row}" >
-                <span style="color: blue;"> {{ row['name'] }}</span>
+            <template #name="{ row }">
+                <span style="color: blue;"> {{ row.name }}</span>
             </template>
-            <template #realprice="{row}" >
-                <span style="color: blue;"> {{ row['realprice'] }}</span>
+            <template #realprice="{ row }">
+                <span style="color: blue;"> {{ row.realprice }}</span>
             </template>
-            <template #overprice="{row}" >
-                <span style="color: red;"> {{ row['overprice'] }}</span>
+            <template #overprice="{ row }">
+                <span style="color: red;"> {{ row.overprice }}</span>
             </template>
         </HcTable>
         <template #action>
-                <HcPages :pages="searchForm" @change="pageChange"></HcPages>
+            <HcPages :pages="searchForm" @change="pageChange" />
         </template>
-   </HcCard>
+    </HcCard>
 </template>
 
 <script setup>
-import {ref, watch} from "vue";
-import {useAppStore} from "~src/store";
+import { ref } from 'vue'
+
 
 const tableColumn = [
-    {key: 'name', name: '项目名称'},
-    {key: 'text', name: '项目进程'},
-    {key: 'color', name: '预算类型'},
-    {key: 'text', name: '任务明细'},
-    {key: 'text', name: '预算工时(天'},
-    {key: 'text', name: '成本预算'},
-    {key: 'realprice', name: '实际支出'},
-    {key: 'overprice', name: '超出预算额'},
+    { key: 'name', name: '项目名称' },
+    { key: 'text', name: '项目进程' },
+    { key: 'color', name: '预算类型' },
+    { key: 'text', name: '任务明细' },
+    { key: 'text', name: '预算工时(天' },
+    { key: 'text', name: '成本预算' },
+    { key: 'realprice', name: '实际支出' },
+    { key: 'overprice', name: '超出预算额' },
 ]
 const tableData = ref([
-    {name: '项目名称', realprice: '文本1', overprice: 'red'},
-    {name: '项目进程', realprice: '文本2', overprice: 'blue'},
-    {name: '预算类型', realprice: '文本3', overprice: '无'},
-    {name: '任务明细', realprice: '文本3', overprice: '无'},
-    {name: '预算工时(天)', realprice: '文本3', overprice: '无'},
-    {name: '预算工时(天)', realprice: '文本3', overprice: '无'},
+    { name: '项目名称', realprice: '文本1', overprice: 'red' },
+    { name: '项目进程', realprice: '文本2', overprice: 'blue' },
+    { name: '预算类型', realprice: '文本3', overprice: '无' },
+    { name: '任务明细', realprice: '文本3', overprice: '无' },
+    { name: '预算工时(天)', realprice: '文本3', overprice: '无' },
+    { name: '预算工时(天)', realprice: '文本3', overprice: '无' },
 ])
 //搜索表单
-const searchForm = ref({current: 1, size: 20, total: 60})
+const searchForm = ref({ current: 1, size: 20, total: 60 })
 
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
 }

+ 81 - 79
src/views/static/actual.vue

@@ -1,123 +1,125 @@
 <template>
-     <el-scrollbar class="hc-main-scrollbar">
+    <el-scrollbar class="hc-main-scrollbar">
         <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">
-                        <HcIcon name="upload-cloud"/>
+                        <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" :label="item.name" :value="item.key"/>
+                        <el-option v-for="item in yearoptions" :key="item.key" :label="item.name" :value="item.key" />
                     </el-select>
                 </div>
             </el-row>
             <el-row :gutter="14" class="mt-4">
-                    <el-col :span="6">
-                        <HcGradientCard color="purple1">
-                            <div class="hc-card-item-sub">
-                                <div class="item-sub-title">总经营收入预算</div>
-                                <div class="item-sub-num">
-                                    <span class="num">120000</span>
-                                    <span class="text">元</span>
-                                </div>
+                <el-col :span="6">
+                    <HcGradientCard color="purple1">
+                        <div class="hc-card-item-sub">
+                            <div class="item-sub-title">
+                                总经营收入预算
                             </div>
-                        </HcGradientCard>
-                    </el-col>
-                    <el-col :span="6">
-                        <HcGradientCard color="blue1">
-                            <div class="hc-card-item-sub">
-                                <div class="item-sub-title">总经营支出预算</div>
-                                <div class="item-sub-num">
-                                    <span class="num">560</span>
-                                    <span class="text">元</span>
-                                </div>
+                            <div class="item-sub-num">
+                                <span class="num">120000</span>
+                                <span class="text">元</span>
                             </div>
-                        </HcGradientCard>
-                    </el-col>
-                    <el-col :span="6">
-                        <HcGradientCard color="red1">
-                            <div class="hc-card-item-sub">
-                                <div class="item-sub-title">总经营实际收入</div>
-                                <div class="item-sub-num">
-                                    <span class="num">90</span>
-                                    <span class="text">元</span>
-                                </div>
+                        </div>
+                    </HcGradientCard>
+                </el-col>
+                <el-col :span="6">
+                    <HcGradientCard color="blue1">
+                        <div class="hc-card-item-sub">
+                            <div class="item-sub-title">
+                                总经营支出预算
                             </div>
-                        </HcGradientCard>
-                    </el-col>
-                    <el-col :span="6">
-                        <HcGradientCard color="purple1">
-                            <div class="hc-card-item-sub">
-                                <div class="item-sub-title">总经营实际支出</div>
-                                <div class="item-sub-num">
-                                    <span class="num">125</span>
-                                    <span class="text">元</span>
-                                </div>
+                            <div class="item-sub-num">
+                                <span class="num">560</span>
+                                <span class="text">元</span>
                             </div>
-                        </HcGradientCard>
-                    </el-col>
+                        </div>
+                    </HcGradientCard>
+                </el-col>
+                <el-col :span="6">
+                    <HcGradientCard color="red1">
+                        <div class="hc-card-item-sub">
+                            <div class="item-sub-title">
+                                总经营实际收入
+                            </div>
+                            <div class="item-sub-num">
+                                <span class="num">90</span>
+                                <span class="text">元</span>
+                            </div>
+                        </div>
+                    </HcGradientCard>
+                </el-col>
+                <el-col :span="6">
+                    <HcGradientCard color="purple1">
+                        <div class="hc-card-item-sub">
+                            <div class="item-sub-title">
+                                总经营实际支出
+                            </div>
+                            <div class="item-sub-num">
+                                <span class="num">125</span>
+                                <span class="text">元</span>
+                            </div>
+                        </div>
+                    </HcGradientCard>
+                </el-col>
             </el-row>
-            
-        
-        
-           
-        
         </div>
-        <HcTabsSimple :cur="tabsKey" :datas="tabsData" @tabClick="tabsClick" class="mt-6 tableui" >
-                    <template #tab-all>
-                        <TabAll/>
-                    </template>
-                    <template #tab-month>
-                        <TabMonth/>
-                    </template>
-                    <template #tab-decost>
-                        <TabDecost/>
-                    </template>
-                    <template #tab-mannager>
-                        <TabManager/>
-                    </template>
-        
-         </HcTabsSimple>
+        <HcTabsSimple :cur="tabsKey" :datas="tabsData" class="mt-6 tableui" @tab-click="tabsClick">
+            <template #tab-all>
+                <TabAll />
+            </template>
+            <template #tab-month>
+                <TabMonth />
+            </template>
+            <template #tab-decost>
+                <TabDecost />
+            </template>
+            <template #tab-mannager>
+                <TabManager />
+            </template>
+        </HcTabsSimple>
     </el-scrollbar>
 </template>
 
  <script setup>
- import {ref, watch} from "vue";
+ import { 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'
 
-const importModalClick=()=>{
+const importModalClick = ()=>{
 
 }
-const checkyear=ref('')
-const yearoptions=ref([
-    {name:'2021年',key:2021,},
-    {name:'2022年',key:2022,},
-    {name:'2023年',key:2023,},
+const checkyear = ref('')
+const yearoptions = ref([
+    { name:'2021年', key:2021 },
+    { name:'2022年', key:2022 },
+    { name:'2023年', key:2023 },
 ])
-const tabsKey=ref('all')
-const tabsData=ref([
-    {icon: 'bar-chart-box', label: '汇总统计', key: 'all'},
-    {icon: 'bar-chart-box', label: '月度统计', key: 'month'},
-    {icon: 'bar-chart-box', label: '部门支出统计', key: 'decost'},
-    {icon: 'bar-chart-box', label: '人工/管理统计支出占比', key: 'mannager'},
+const tabsKey = ref('all')
+const tabsData = ref([
+    { icon: 'bar-chart-box', label: '汇总统计', key: 'all' },
+    { icon: 'bar-chart-box', label: '月度统计', key: 'month' },
+    { icon: 'bar-chart-box', label: '部门支出统计', key: 'decost' },
+    { icon: 'bar-chart-box', label: '人工/管理统计支出占比', key: 'mannager' },
 ])
 const tabsClick = (key) => {
     tabsKey.value = key
 }
 </script>
+
 <style lang="scss" scoped>
 @import "~src/styles/static/actual.scss";
-
 </style>
-<style lang="scss" >
+
+<style lang="scss">
  .tableui.hc-sb-table .el-tabs .el-tabs__content {
  height:auto;  
 }
-
 </style>

+ 107 - 113
src/views/static/components/tab-all.vue

@@ -1,69 +1,65 @@
 <template>
-          <div class="bg-white p-2 table_box" >
-            <el-row :gutter="14" style="justify-content: flex-end;">
-            
-                <div class="w-36 ml-4 mr-2" >
-                    <el-select v-model="costcheck" block clearable placeholder="项目回款明细" size="large">
-                        <el-option v-for="item in costdetail" :label="item.name" :value="item.key"/>
-                    </el-select>
-                </div>
-            </el-row>
-              <el-table :data="tableData" border class="mt-4 "  v-if="costcheck==1"  stripe :header-cell-style="headerStyle" style="height: 87%;">
-                  <el-table-column v-for="item in tableColData"  align="center" 
-                  :prop="item.id"
-                  :label="item.name"
-                  :key="item.id"
-                  :min-width="180"
-                  >
-                      <el-table-column v-for="item1 in item.children" align="center"
-                          :prop="item1.id"
-                          :label="item1.name"
-                          :key="item1.id"
-                          :min-width="180"
-                          >
-                              <el-table-column v-for="item2 in item1.children" align="center"
-                              :prop="item2.id"
-                              :label="item2.name"
-                              :key="item2.id"
-                              :min-width="180"
-                              >
-                          </el-table-column>
-                      </el-table-column>
-                  </el-table-column>
-              </el-table>
+    <div class="bg-white p-2 table_box">
+        <el-row :gutter="14" style="justify-content: flex-end;">
+            <div class="w-36 ml-4 mr-2">
+                <el-select v-model="costcheck" block clearable placeholder="项目回款明细" size="large">
+                    <el-option v-for="item in costdetail" :key="item.key" :label="item.name" :value="item.key" />
+                </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-column
+                v-for="item in tableColData" :key="item.id" 
+                align="center"
+                :prop="item.id"
+                :label="item.name"
+                :min-width="180"
+            >
+                <el-table-column
+                    v-for="item1 in 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"
+                        align="center"
+                        :prop="item2.id"
+                        :label="item2.name"
+                        :min-width="180"
+                    />
+                </el-table-column>
+            </el-table-column>
+        </el-table>
        
        
-            <el-table stripe :data="tableData" border class="mt-4 " v-if="costcheck==2" :header-cell-style="{ background:'rgb(214, 225, 255)', fontSize:'16px',color:'black'}"   style="height: 87%;">
-                <el-table-column 
+        <el-table v-if="costcheck === 2" 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 tableprojectColData"  
+                :key="item.id"
                 :prop="item.id"
                 :label="item.name"
-                :key="item.id"
-                
-                ></el-table-column>
-            </el-table>
-            <el-table stripe :data="tableData" border class="mt-4 " v-if="costcheck!=='2'&&costcheck!=='1'" :header-cell-style="{ background:'rgb(214, 225, 255)', fontSize:'16px',color:'black'}"   style="height: 87%;">
-                <el-table-column 
+            />
+        </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-column 
                 v-for="item in otherColData"  
+                :key="item.id"
                 :prop="item.id"
                 :label="item.name"
-                :key="item.id"
-                
-                ></el-table-column>
-            </el-table>
-         
-        
-                       
-         </div>
+            />
+        </el-table>
+    </div>
 </template>
 
 <script setup>
-import {ref, watch,nextTick} from "vue";
+import { ref, watch } from 'vue'
 
 const props = defineProps({
     cur: {
-        type: [String,Number],
-        default: ''
+        type: [String, Number],
+        default: '',
     },
 })
 
@@ -78,36 +74,36 @@ 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'},
+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' },
     
 
 ])
-const tableColData=ref([
+const tableColData = ref([
         {
           id: 'time',
           name: '时间',
           children:[
       
-          ]
+          ],
         },
         {
           id: 'beginremain',
           name: '期初上账余额',
           children:[
      
-          ]
+          ],
         },
         {
           id: 'beginremain',
@@ -118,37 +114,37 @@ const tableColData=ref([
                 name: '计划回款',
                 children:[
                 
-                ]
+                ],
                 },
                 {
                 id: 'beginremain',
                 name: '项目回款',
                 children:[
                 
-                ]
+                ],
                 },
                 {
                 id: 'beginremain',
                 name: '营业外收入',
                 children:[
                
-                ]
+                ],
                 },
                 {
                 id: 'beginremain',
                 name: '过账资金',
                 children:[
                   
-                ]
+                ],
                 },
                 {
                 id: 'beginremain',
                 name: '项目保证金、押金退回',
                 children:[
                
-                ]
+                ],
                 },
-          ]
+          ],
         },
         {
           id: 'beginremain8',
@@ -157,21 +153,21 @@ const tableColData=ref([
                 {
                 id: 'beginremain',
                 name: '借入',
-                children:[]
+                children:[],
                 },
                 {
                 id: 'beginremain',
                 name: '偿还本金',
-                children:[]
+                children:[],
                 },
                 {
                 id: 'beginremain',
                 name: '偿还利息',
-                children:[]
+                children:[],
                 },
           
               
-          ]
+          ],
         },
         {
           id: 'beginremain',
@@ -181,12 +177,12 @@ const tableColData=ref([
                 {
                 id: 'beginremain',
                 name: '员工借款',
-                children:[ ]
+                children:[ ],
                 },
                 {
                 id: 'beginremain',
                 name: '员工借支还款',
-                children:[]
+                children:[],
                 
                 
                 },
@@ -197,38 +193,38 @@ const tableColData=ref([
                 children:[
                     {
                     id: 'beginremain',
-                    name: '差旅费、招待费'
+                    name: '差旅费、招待费',
                     },
                     {
                     id: 'beginremain',
-                    name: '人员工资、五险一金'
+                    name: '人员工资、五险一金',
                     },
                     {
                     id: 'beginremain',
-                    name: '税金'
+                    name: '税金',
                     },
                     {
                     id: 'beginremain',
-                    name: '外包费'
+                    name: '外包费',
                     },
                     {
                     id: 'beginremain',
-                    name: '商务费'
-                    },   {
+                    name: '商务费',
+                    }, {
                     id: 'beginremain',
-                    name: '办公房租、物业水电'
+                    name: '办公房租、物业水电',
                     },
                     {
                     id: 'beginremain',
-                    name: '综合报销'
+                    name: '综合报销',
                     }, {
                     id: 'beginremain',
-                    name: '费用合计'
+                    name: '费用合计',
                     },
-                ]
+                ],
                 },
                
-          ]
+          ],
         },
      
        
@@ -245,71 +241,70 @@ const tableColData=ref([
         },
 
 ])
-const costdetail=ref([
-    {name:'汇总表',key:'1'},
-    {name:'项目回款明细',key:'2'},
-    {name:'借入',key:'3'},
+const costdetail = ref([
+    { name:'汇总表', key:'1' },
+    { name:'项目回款明细', key:'2' },
+    { name:'借入', key:'3' },
 ])
-const tableprojectColData=ref([
+const tableprojectColData = ref([
         {
           id: 'time',
-          name: '时间'
+          name: '时间',
         },
         {
           id: 'name',
-          name: '项目名称'
+          name: '项目名称',
         },
         {
           id: 'type',
-          name: '项目类型'
+          name: '项目类型',
         },
         {
           id: 'project',
-          name: '产品线'
+          name: '产品线',
         },
         {
           id: 'money',
-          name: '回款金额'
+          name: '回款金额',
         },
 ])
-const otherColData=ref([
+const otherColData = ref([
         {
           id: 'time',
-          name: '日期'
+          name: '日期',
         },
         {
           id: 'name',
-          name: '对方科目'
+          name: '对方科目',
         },
         {
           id: 'type',
-          name: '二级科目'
+          name: '二级科目',
         },
         {
           id: 'project',
-          name: '报销人'
+          name: '报销人',
         },
         {
           id: 'import',
-          name: '摘要'
+          name: '摘要',
         },
         {
           id: 'money',
-          name: '回款金额'
+          name: '回款金额',
         },
 ])
 //合并
 
-const headerStyle=({ row, column, rowIndex, columnIndex })=>{
-    const comStyle = {fontSize:"16px" ,background: "rgb(214, 225, 255)",color:'black'}
-    return comStyle;
+const headerStyle = ()=>{
+    const comStyle = { fontSize:'16px', background: 'rgb(214, 225, 255)', color:'black' }
+    return comStyle
 }
 
-const costcheck=ref('1')
+const costcheck = ref('1')
 </script>
 
 <style scoped lang="scss">
-
 .tableover{
     height: 550px;
      overflow-y: auto;
@@ -318,5 +313,4 @@ const costcheck=ref('1')
      height: calc(100vh - 450px);
      
  }
-
 </style>

+ 64 - 68
src/views/static/components/tab-decost.vue

@@ -1,33 +1,30 @@
 <template>
-    <div class="bg-white p-2 table_box" >
-     
-          <el-table :data="tableData" border class="mt-4"   :header-cell-style="headerStyle" stripe  :row-class-name="tableRowClassName"  style="height: 90%;">
-          <el-table-column v-for="item in tableColData"  align="center"
-          :prop="item.id"
-          :label="item.name"
-          :key="item.name"
-        
-          >
-              <el-table-column v-for="item1 in item.children" align="center"
-                  :prop="item1.id"
-                  :label="item1.name"
-                  :key="item1.name">
-                 
-              </el-table-column>
-          </el-table-column>
-      </el-table>
-
-                 
-   </div>
+    <div class="bg-white p-2 table_box">
+        <el-table :data="tableData" border class="mt-4" :header-cell-style="headerStyle" stripe :row-class-name="tableRowClassName" style="height: 90%;">
+            <el-table-column
+                v-for="item in tableColData" :key="item.name"
+                align="center"
+                :prop="item.id"
+                :label="item.name"
+            >
+                <el-table-column
+                    v-for="item1 in item.children" :key="item1.name"
+                    align="center"
+                    :prop="item1.id"
+                    :label="item1.name"
+                />
+            </el-table-column>
+        </el-table>
+    </div>
 </template>
 
 <script setup>
-import {ref, watch,nextTick} from "vue";
+import { nextTick, ref, watch } from 'vue'
 
 const props = defineProps({
 cur: {
-  type: [String,Number],
-  default: ''
+  type: [String, Number],
+  default: '',
 },
 })
 
@@ -42,32 +39,32 @@ console.log(key)
 })
 
 
-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([
+{ 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 tableColData=ref([
+const tableColData = ref([
   {
     id:'time',
     name: '时间',
     children:[
         { id:'time',
-        name: '时间',}
-    ]
+        name: '时间' },
+    ],
   },
   
  {
@@ -76,14 +73,14 @@ const tableColData=ref([
         children:[
             {
             id: 'precost',
-            name: '预算支出'
+            name: '预算支出',
             },
             {
             id: 'realcost',
-            name: '实际支出'
+            name: '实际支出',
             },
     
-        ]
+        ],
     },
     {
         id: 'technology',
@@ -91,14 +88,14 @@ const tableColData=ref([
         children:[
             {
             id: 'precost',
-            name: '预算支出'
+            name: '预算支出',
             },
             {
             id: 'realcost',
-            name: '实际支出'
+            name: '实际支出',
             },
     
-        ]
+        ],
     },
     {
         id: 'implement',
@@ -106,14 +103,14 @@ const tableColData=ref([
         children:[
             {
             id: 'precost',
-            name: '预算支出'
+            name: '预算支出',
             },
             {
             id: 'realcost',
-            name: '实际支出'
+            name: '实际支出',
             },
     
-        ]
+        ],
     },
     {
         id: 'maintenance',
@@ -121,14 +118,14 @@ const tableColData=ref([
         children:[
             {
             id: 'precost',
-            name: '预算支出'
+            name: '预算支出',
             },
             {
             id: 'realcost',
-            name: '实际支出'
+            name: '实际支出',
             },
     
-        ]
+        ],
     },
     {
         id: 'mannager',
@@ -136,47 +133,46 @@ const tableColData=ref([
         children:[
             {
             id: 'precost',
-            name: '预算支出'
+            name: '预算支出',
             },
             {
             id: 'realcost',
-            name: '实际支出'
+            name: '实际支出',
             },
     
-        ]
+        ],
     },
     
 ])
 //合并
 
-const headerStyle=({ row, column, rowIndex, columnIndex })=>{
-  const comStyle = {fontSize:"16px" ,background: "rgb(214, 225, 255)",color:'black'}
+const headerStyle = ({ column, rowIndex, columnIndex })=>{
+  const comStyle = { fontSize:'16px', background: 'rgb(214, 225, 255)', color:'black' }
       // 1.1 让第0行的第0列跨2行
       if (rowIndex === 0 && columnIndex === 0) {
         nextTick(() => {
           document
             .getElementsByClassName(column.id)[0]
-            .setAttribute("rowSpan", 2);
-          return comStyle;
-        });
+            .setAttribute('rowSpan', 2)
+          return comStyle
+        })
       }
       // 1.2 被覆盖的进行隐藏
-      if (rowIndex === 1 && (columnIndex == 0  )) {
+      if (rowIndex === 1 && (columnIndex === 0 )) {
         return {
-          display: "none",
+          display: 'none',
           ...comStyle,
-        };
+        }
       }
 
-      return comStyle;
+      return comStyle
 }
    //指定行颜色
-const  tableRowClassName=({ row, rowIndex }) =>{
-      if (rowIndex ===12) {
-        return 'warm-row';
+const tableRowClassName = ({ rowIndex }) =>{
+      if (rowIndex === 12) {
+        return 'warm-row'
       }
  }
-const costcheck=ref('1')
 </script>
 
 <style scoped lang="scss">

+ 55 - 60
src/views/static/components/tab-mannager.vue

@@ -1,35 +1,31 @@
 <template>
-    <div class="bg-white p-2 table_box" >
-     
-          <el-table :data="tableData" border class="mt-4"  stripe     :header-cell-style="headerStyle" :row-class-name="tableRowClassName"  style="height: 90%;"
->
-          <el-table-column v-for="item in tableColData"  align="center"
-          :prop="item.id"
-          :label="item.name"
-          :key="item.name"
-        
-          >
-              <el-table-column v-for="item1 in item.children" align="center"
-                  :prop="item1.id"
-                  :label="item1.name"
-                  :key="item1.name">
-                 
-              </el-table-column>
-          </el-table-column>
-      </el-table>
-
-                 
-   </div>
+    <div class="bg-white p-2 table_box">
+        <el-table :data="tableData" border class="mt-4" stripe :header-cell-style="headerStyle" :row-class-name="tableRowClassName" style="height: 90%;">
+            <el-table-column
+                v-for="item in tableColData" :key="item.name"
+                align="center"
+                :prop="item.id"
+                :label="item.name"
+            >
+                <el-table-column
+                    v-for="item1 in item.children" :key="item1.name"
+                    align="center"
+                    :prop="item1.id"
+                    :label="item1.name"
+                />
+            </el-table-column>
+        </el-table>
+    </div>
 </template>
 
 <script setup>
-import {ref, watch,nextTick} from "vue";
+import { nextTick, ref, watch } from 'vue'
 
 
 const props = defineProps({
 cur: {
-  type: [String,Number],
-  default: ''
+  type: [String, Number],
+  default: '',
 },
 })
 
@@ -44,26 +40,26 @@ console.log(key)
 })
 
 
-const tableData=ref([
+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'},
+{ 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 tableColData=ref([
+const tableColData = ref([
   {
     id:'time',
     name: '时间',
@@ -71,9 +67,9 @@ const tableColData=ref([
     {
         id:'time',
         name: '时间',
-        children:[]
+        children:[],
     },
-    ]
+    ],
   },
   
  {
@@ -82,14 +78,14 @@ const tableColData=ref([
         children:[
             {
             id: 'precost',
-            name: '预算支出'
+            name: '预算支出',
             },
             {
             id: 'realcost',
-            name: '实际支出'
+            name: '实际支出',
             },
     
-        ]
+        ],
     },
     {
         id: 'manngercost',
@@ -97,49 +93,48 @@ const tableColData=ref([
         children:[
             {
             id: 'precost',
-            name: '预算支出'
+            name: '预算支出',
             },
             {
             id: 'realcost',
-            name: '实际支出'
+            name: '实际支出',
             },
     
-        ]
+        ],
     },
 
     
 ])
 //合并
 
-const headerStyle=({ row, column, rowIndex, columnIndex })=>{
-  const comStyle = {fontSize:"16px" ,background: "rgb(214, 225, 255)",color:'black'}
+const headerStyle = ({ column, rowIndex, columnIndex })=>{
+  const comStyle = { fontSize:'16px', background: 'rgb(214, 225, 255)', color:'black' }
       // 1.1 让第0行的第0列跨2行
       if (rowIndex === 0 && columnIndex === 0) {
         nextTick(() => {
           document
             .getElementsByClassName(column.id)[0]
-            .setAttribute("rowSpan", 2);
-          return comStyle;
-        });
+            .setAttribute('rowSpan', 2)
+          return comStyle
+        })
       }
       // 1.2 被覆盖的进行隐藏
-      if (rowIndex === 1 && (columnIndex == 0  )) {
+      if (rowIndex === 1 && (columnIndex === 0 )) {
         return {
-          display: "none",
+          display: 'none',
           ...comStyle,
-        };
+        }
       }
 
-      return comStyle;
+      return comStyle
 }
 
    //指定行颜色
-   const  tableRowClassName=({ row, rowIndex }) =>{
-      if (rowIndex ===12) {
-        return 'warm-row';
+   const tableRowClassName = ({ rowIndex }) =>{
+      if (rowIndex === 12) {
+        return 'warm-row'
       }
  }
-
 </script>
 
 <style scoped lang="scss">

+ 61 - 65
src/views/static/components/tab-month.vue

@@ -1,32 +1,30 @@
 <template>
-    <div class="bg-white p-2 table_box" >
-     
-          <el-table :data="tableData" border class="mt-4"  stripe  :header-cell-style="headerStyle"  :row-class-name="tableRowClassName" style="height: 90%;">
-          <el-table-column v-for="item in tableColData"  align="center"
-          :prop="item.id"
-          :label="item.name"
-          :key="item.name"
-          >
-              <el-table-column v-for="item1 in item.children" align="center"
-                  :prop="item1.id"
-                  :label="item1.name"
-                  :key="item1.name">
-                 
-              </el-table-column>
-          </el-table-column>
-      </el-table>
-
-                 
-   </div>
+    <div class="bg-white p-2 table_box">
+        <el-table :data="tableData" border class="mt-4" stripe :header-cell-style="headerStyle" :row-class-name="tableRowClassName" style="height: 90%;">
+            <el-table-column
+                v-for="item in tableColData" :key="item.name"
+                align="center"
+                :prop="item.id"
+                :label="item.name"
+            >
+                <el-table-column
+                    v-for="item1 in item.children" :key="item1.name"
+                    align="center"
+                    :prop="item1.id"
+                    :label="item1.name"
+                />
+            </el-table-column>
+        </el-table>
+    </div>
 </template>
 
 <script setup>
-import {ref, watch,nextTick} from "vue";
+import { nextTick, ref, watch } from 'vue'
 
 const props = defineProps({
 cur: {
-  type: [String,Number],
-  default: ''
+  type: [String, Number],
+  default: '',
 },
 })
 
@@ -41,25 +39,25 @@ console.log(key)
 })
 
 
-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'},
+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' },
 
 
 
 ])
-const tableColData=ref([
+const tableColData = ref([
   {
     id:'time',
     name: '时间',
@@ -67,8 +65,8 @@ const tableColData=ref([
         {
             id:'time',
             name: '时间',
-        }
-    ]
+        },
+    ],
   },
   
  {
@@ -77,14 +75,14 @@ const tableColData=ref([
         children:[
             {
             id: 'beginremain',
-            name: '收入'
+            name: '收入',
             },
             {
             id: 'beginremain',
-            name: '支出'
+            name: '支出',
             },
     
-        ]
+        ],
     },
     {
         id: 'beginremain',
@@ -92,14 +90,14 @@ const tableColData=ref([
         children:[
             {
             id: 'beginremain',
-            name: '收入'
+            name: '收入',
             },
             {
             id: 'beginremain',
-            name: '支出'
+            name: '支出',
             },
     
-        ]
+        ],
     },
     {
         id: 'beginremain',
@@ -107,58 +105,56 @@ const tableColData=ref([
         children:[
             {
             id: 'beginremain',
-            name: '收入'
+            name: '收入',
             },
             {
             id: 'beginremain',
-            name: '支出'
+            name: '支出',
             },
     
-        ]
+        ],
     },
     
 ])
 //合并
 
-const headerStyle=({ row, column, rowIndex, columnIndex })=>{
-  const comStyle = {fontSize:"16px" ,background: "rgb(214, 225, 255)",color:'black'}
+const headerStyle = ({ column, rowIndex, columnIndex })=>{
+  const comStyle = { fontSize:'16px', background: 'rgb(214, 225, 255)', color:'black' }
       // 1.1 让第0行的第0列跨2行
       if (rowIndex === 0 && columnIndex === 0) {
         nextTick(() => {
           document
             .getElementsByClassName(column.id)[0]
-            .setAttribute("rowSpan", 2);
-          return comStyle;
-        });
+            .setAttribute('rowSpan', 2)
+          return comStyle
+        })
       }
       // 1.2 被覆盖的进行隐藏
-      if (rowIndex === 1 && (columnIndex == 0  )) {
+      if (rowIndex === 1 && (columnIndex === 0 )) {
         return {
-          display: "none",
+          display: 'none',
           ...comStyle,
-        };
+        }
       }
-      if(rowIndex===15){
+      if (rowIndex === 15) {
         return {
-          color: "red",
+          color: 'red',
           ...comStyle,
-        };
+        }
       }
 
-      return comStyle;
+      return comStyle
 }
 
    //指定行颜色
- const  tableRowClassName=({ row, rowIndex }) =>{
-      if (rowIndex ===12) {
-        return 'warm-row';
+ const tableRowClassName = ({ rowIndex }) =>{
+      if (rowIndex === 12) {
+        return 'warm-row'
       }
   }
-const costcheck=ref('1')
 </script>
 
 <style  lang="scss">
-
 .warm-row {
   background-color: rgb(154, 154, 154) !important;
 }

+ 67 - 67
src/views/static/plan.vue

@@ -3,30 +3,32 @@
         <template #header>
             <div class="w-36">
                 <el-select v-model="searchForm.deptId" block clearable placeholder="选择部门" size="large" @change="changeDpet">
-                    <el-option v-for="item in department" :label="item.deptName" :value="item.id"/>
+                    <el-option v-for="item in department" :key="item.id" :label="item.deptName" :value="item.id" />
                 </el-select>
             </div>
             <div class="w-40 ml-2">
                 <el-select v-model="searchForm.userId" block clearable placeholder="任务人员" size="large">
-                    <el-option v-for="item in departmentPeople" :label="item.name" :value="item.id"/>
+                    <el-option v-for="item in departmentPeople" :key="item.id" :label="item.name" :value="item.id" />
                 </el-select>
             </div>
             <div class="w-36 ml-4">
-                <el-date-picker class="block" v-model="searchForm.start" type="month" value-format="YYYY-MM" placeholder="开始日期" clearable size="large"/>
+                <el-date-picker v-model="searchForm.start" 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.end" type="month" value-format="YYYY-MM" placeholder="结束日期" clearable size="large"/>
+                <el-date-picker v-model="searchForm.end" class="block" type="month" value-format="YYYY-MM" placeholder="结束日期" clearable size="large" />
             </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>
@@ -34,24 +36,23 @@
 
         <HcCardItem ui="hac-bg-grey">
             <div class="h-72">
-                <BarLabelRotation  :datas="planDatas" :legend="legend" :xdata="sxdata"/>
+                <BarLabelRotation :datas="planDatas" :legend="legend" :xdata="sxdata" />
             </div>
         </HcCardItem>
 
         <div class="hc-main-row">
-            <el-row :gutter="14" class="mt-4" >
+            <el-row :gutter="14" class="mt-4">
                 <el-col :span="12">
                     <HcCardItem ui="hac-bg-grey">
                         <div class="h-96">
-                            <StackedLine isMonth  :ydata="sydata"  :xdata="sxdata"  :legend="slegend"/>
+                            <StackedLine is-month :ydata="sydata" :xdata="sxdata" :legend="slegend" />
                         </div>
                     </HcCardItem>
                 </el-col>
                 <el-col :span="12">
                     <HcCardItem ui="hac-bg-grey">
                         <div class="h-96">
-                           
-                            <WordPopulation isMonth name="任务完成率" :ydata="ydata"  :xdata="xdata" unit="%" />
+                            <WordPopulation is-month name="任务完成率" :ydata="ydata" :xdata="xdata" unit="%" />
                         </div>
                     </HcCardItem>
                 </el-col>
@@ -61,15 +62,15 @@
 </template>
 
  <script setup>
- import {ref, watch,onMounted} from "vue";
- import BarLabelRotation from "~com/echarts/BarLabelRotation.vue";
- import StackedLine from "~com/echarts/StackedLine.vue";
- import WordPopulation from "~com/echarts/WordPopulation.vue";
+ import { onMounted, ref } from 'vue'
+ import BarLabelRotation from '~com/echarts/BarLabelRotation.vue'
+ import StackedLine from '~com/echarts/StackedLine.vue'
+ import WordPopulation from '~com/echarts/WordPopulation.vue'
  import mainApi from '~api/static/plan.js'
- import {getObjValue,getArrValue} from "js-fast-way"
- import { getdepartmentList,getuserList} from "~api/other";
- import {getDiffYear} from "~uti/tools";
- import {useAppStore} from "~src/store";
+ import { getArrValue, getObjValue } from 'js-fast-way'
+ import { getdepartmentList, getuserList } from '~api/other'
+ import { getDiffYear } from '~uti/tools'
+ import { useAppStore } from '~src/store'
  const useAppState = useAppStore()
 
  onMounted(()=>{
@@ -78,8 +79,8 @@
     getImageData()
     planFinishedRatio()
  })
- const searchForm=ref({
-    deptId:'',userId:''
+ const searchForm = ref({
+    deptId:'', userId:'',
  })
 
  //搜索
@@ -87,12 +88,12 @@ const searchClick = () => {
   
     console.log(searchForm.value)
 
-    let start=searchForm.value.start
-    let end=searchForm.value.end
-    let year=getDiffYear(start,end)
-    if(year>=1){
+    let start = searchForm.value.start
+    let end = searchForm.value.end
+    let year = getDiffYear(start, end)
+    if (year >= 1) {
         window.$message.warning('选择间隔日期不能超过一年')
-    }else{
+    } else {
         getImageData()
         planFinishedRatio()
     }
@@ -104,7 +105,7 @@ const searchClick = () => {
 //重置
 const resetClick = () => {
     searchForm.value = {
-        deptId:null,userId:null
+        deptId:null, userId:null,
     }
     getImageData()
     planFinishedRatio()
@@ -112,56 +113,54 @@ const resetClick = () => {
 }
 //计划统计图
 const planDatas = ref([])
-const ydata=ref( [])
-const xdata=ref( [])
-const legend=ref(
+const ydata = ref( [])
+const xdata = ref( [])
+const legend = ref(
     {
-		orient: 'horizontal',
-		data:['任务总量','已完成','未完成'],
-		textStyle:{
-        	fontSize: 14,//字体大小
-            color: 'black'//字体颜色
-        }
-   	},
+        orient: 'horizontal',
+        data:['任务总量', '已完成', '未完成'],
+        textStyle:{
+        fontSize: 14, //字体大小
+        color: 'black', //字体颜色
+        },
+    },
 )
-const sydata=ref( [])
-const sxdata=ref(['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'])
-const slegend=ref( ['风险暂停计划', '正常计划',])
+const sydata = ref( [])
+const sxdata = ref(['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'])
+const slegend = ref( ['风险暂停计划', '正常计划'])
 
 //项目图表数据
 const getImageData = async () => {
-    const {error, code, data} = await mainApi.MonthOfYearPlanOverview2(
-        {        ...searchForm.value}
+    const { error, code, data } = await mainApi.MonthOfYearPlanOverview2(
+        { ...searchForm.value },
     )
     //判断状态
     if (!error && code === 200) {
-       planDatas.value=data['dataList']
-       sydata.value=data['riskPlans']
-       sxdata.value=data['dateList']
+       planDatas.value = data['dataList']
+       sydata.value = data['riskPlans']
+       sxdata.value = data['dateList']
     } else {
-        planDatas.value=[]
-        sydata.value=[]
-        sxdata.value=[]
+        planDatas.value = []
+        sydata.value = []
+        sxdata.value = []
     }
 }
 //任务完成率
 const planFinishedRatio = async () => {
-    const {error, code, data} = await mainApi.planFinishedRatio(
-      {  ...searchForm.value}
+    const { error, code, data } = await mainApi.planFinishedRatio(
+      { ...searchForm.value },
     )
     //判断状态
     if (!error && code === 200) {
-       let image=getObjValue(data)
-        xdata.value=image['ratioList']
-        ydata.value=image['userList']
-    } else {
-     
-    }
+       let image = getObjValue(data)
+        xdata.value = image['ratioList']
+        ydata.value = image['userList']
+    } 
 }
-const department=ref([])
+const department = ref([])
 //获取部门列表
-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)
 
@@ -171,13 +170,13 @@ const getDepartmentDict=async()=>{
     }
 }
 //改变部门
-const changeDpet=(val)=>{
+const changeDpet = (val)=>{
     getDepartmentuserDict(val)
 }
-const departmentPeople=ref([])
+const departmentPeople = ref([])
 //获取部门人员列表
-const getDepartmentuserDict=async(id)=>{
-    const {error, code, data} = await getuserList({deptId:id})
+const getDepartmentuserDict = async (id)=>{
+    const { error, code, data } = await getuserList({ deptId:id })
     if (!error && code === 200) {
         departmentPeople.value = getArrValue(data)
 
@@ -188,8 +187,8 @@ const getDepartmentuserDict=async(id)=>{
 }
 //获取所有员工
 
-const getUserDict=async()=>{
-    const {error, code, data} = await getuserList({tenantId:useAppState.tenantId})
+const getUserDict = async ()=>{
+    const { error, code, data } = await getuserList({ tenantId:useAppState.tenantId })
     if (!error && code === 200) {
         departmentPeople.value = getArrValue(data)
 
@@ -199,6 +198,7 @@ const getUserDict=async()=>{
     }
 }
 </script>
+
 <style lang="scss" scoped>
 @import "~src/styles/home/index.scss";
 .head_box{

+ 96 - 80
src/views/static/project.vue

@@ -4,9 +4,11 @@
             <el-col :span="6">
                 <HcGradientCard color="purple1">
                     <div class="hc-card-item-sub">
-                        <div class="item-sub-title">截至目前总合同额</div>
+                        <div class="item-sub-title">
+                            截至目前总合同额
+                        </div>
                         <div class="item-sub-num">
-                            <span class="num">{{statsAll.allContractMoney}}</span>
+                            <span class="num">{{ statsAll.allContractMoney }}</span>
                             <span class="text">万</span>
                         </div>
                     </div>
@@ -15,9 +17,11 @@
             <el-col :span="6">
                 <HcGradientCard color="blue1">
                     <div class="hc-card-item-sub">
-                        <div class="item-sub-title">截至目前项目总测算成本</div>
+                        <div class="item-sub-title">
+                            截至目前项目总测算成本
+                        </div>
                         <div class="item-sub-num">
-                            <span class="num">{{statsAll.allProjectCost}}</span>
+                            <span class="num">{{ statsAll.allProjectCost }}</span>
                             <span class="text">元</span>
                         </div>
                     </div>
@@ -26,9 +30,11 @@
             <el-col :span="6">
                 <HcGradientCard color="red1">
                     <div class="hc-card-item-sub">
-                        <div class="item-sub-title">截至目前总实际支出成本</div>
+                        <div class="item-sub-title">
+                            截至目前总实际支出成本
+                        </div>
                         <div class="item-sub-num">
-                            <span class="num">{{statsAll.allPracticalDisburse}}</span>
+                            <span class="num">{{ statsAll.allPracticalDisburse }}</span>
                             <span class="text">元</span>
                         </div>
                     </div>
@@ -37,79 +43,89 @@
             <el-col :span="6">
                 <HcGradientCard color="purple1">
                     <div class="hc-card-item-sub">
-                        <div class="item-sub-title">截至目前总回款</div>
+                        <div class="item-sub-title">
+                            截至目前总回款
+                        </div>
                         <div class="item-sub-num">
-                            <span class="num">{{statsAll.allReturned}}</span>
+                            <span class="num">{{ statsAll.allReturned }}</span>
                             <span class="text">元</span>
                         </div>
                     </div>
                 </HcGradientCard>
             </el-col>
         </el-row>
-        <!--列表统计-->
+        <!-- 列表统计 -->
         <HcCardItem class="static-project-card mt-8">
             <template #header>
-                <div class="hc-static-breadcrumb-box" v-if="breadcrumbs.name">
+                <div v-if="breadcrumbs.name" class="hc-static-breadcrumb-box">
                     <el-breadcrumb :separator-icon="ArrowRight">
                         <el-breadcrumb-item
-                            :class="breadcrumbs.name?'hover':''"
+                            :class="breadcrumbs.name ? 'hover' : ''"
                             @click="breadcrumbTitle"
                         >
-                            {{breadcrumbs.title}}
+                            {{ breadcrumbs.title }}
                         </el-breadcrumb-item>
                         <el-breadcrumb-item
-                            :class="breadcrumbs.section?'hover':''"
+                            :class="breadcrumbs.section ? 'hover' : ''"
                             @click="breadcrumbName"
                         >
-                            {{breadcrumbs.name}}
+                            {{ breadcrumbs.name }}
                         </el-breadcrumb-item>
                         <el-breadcrumb-item
-                            :class="breadcrumbs.post?'hover':''"
-                            @click="breadcrumbSection"
                             v-if="breadcrumbs.section"
+                            :class="breadcrumbs.post ? 'hover' : ''"
+                            @click="breadcrumbSection"
                         >
-                            {{breadcrumbs.section}}
+                            {{ breadcrumbs.section }}
+                        </el-breadcrumb-item>
+                        <el-breadcrumb-item v-if="breadcrumbs.post">
+                            {{ breadcrumbs.post }}
                         </el-breadcrumb-item>
-                        <el-breadcrumb-item v-if="breadcrumbs.post">{{breadcrumbs.post}}</el-breadcrumb-item>
                     </el-breadcrumb>
                 </div>
-                <div class="hc-expense-total-title" v-else>列表统计</div>
+                <div v-else class="hc-expense-total-title">
+                    列表统计
+                </div>
             </template>
-            <HcTable ui="no-border" border :isIndex="false" :column="tableColumn" :datas="tableData" v-if="isShowtable === 0">
-                <template #projectName="{row}">
-                    <span class="text-blue text-hover" @click='rowNameClick(row)'>{{ row.projectName }}</span>
+            <HcTable v-if="isShowtable === 0" ui="no-border" border :is-index="false" :column="tableColumn" :datas="tableData">
+                <template #projectName="{ row }">
+                    <span class="text-blue text-hover" @click="rowNameClick(row)">{{ row.projectName }}</span>
                 </template>
             </HcTable>
-            <!--费用分类-->
-            <HcTable ui="no-border" border :isIndex="false" :column="tableColumn1" :datas="tableData1" :span-method="tableSpanMethod1" v-if="isShowtable === 1">
-                <template #detail="{row}">
-                    <span class="text-blue text-hover" @click='rowNameClick1(row)'>查看明细</span>
+            <!-- 费用分类 -->
+            <HcTable v-if="isShowtable === 1" ui="no-border" border :is-index="false" :column="tableColumn1" :datas="tableData1" :span-method="tableSpanMethod1">
+                <template #detail="{ row }">
+                    <span class="text-blue text-hover" @click="rowNameClick1(row)">查看明细</span>
+                </template>
+                <template #total="{ row, index }">
+                    {{ index === 0 ? row.total : '' }}
                 </template>
-                <template #total="{row, index}">{{index === 0 ? row.total : ''}}</template>
             </HcTable>
-            <!--细分环节费用-->
-            <HcTable ui="no-border" border :isIndex="false" :column="tableColumn2" :datas="tableData2" v-if="isShowtable === 2">
-                <template #isParticipate="{row}">
-                    <HcIcon name="checkbox-circle" class="text-green text-xl" v-if="row.isParticipate === 1"/>
-                    <HcIcon name="error-warning" class="text-red text-xl" v-else/>
+            <!-- 细分环节费用 -->
+            <HcTable v-if="isShowtable === 2" ui="no-border" border :is-index="false" :column="tableColumn2" :datas="tableData2">
+                <template #isParticipate="{ row }">
+                    <HcIcon v-if="row.isParticipate === 1" name="checkbox-circle" class="text-green text-xl" />
+                    <HcIcon v-else name="error-warning" class="text-red text-xl" />
                 </template>
-                <template #detail="{row}">
-                    <span class="text-blue text-hover" @click='rowNameClick2(row)'>查看明细</span>
+                <template #detail="{ row }">
+                    <span class="text-blue text-hover" @click="rowNameClick2(row)">查看明细</span>
                 </template>
             </HcTable>
-            <!--费用明细-->
-            <HcTable ui="no-border" border :isIndex="false" :column="tableColumn3" :datas="tableData3" :span-method="tableSpanMethod2" v-if="isShowtable === 3">
-                <template #total="{row, index}">{{index === 0 ? row.total : ''}}</template>
+            <!-- 费用明细 -->
+            <HcTable v-if="isShowtable === 3" ui="no-border" border :is-index="false" :column="tableColumn3" :datas="tableData3" :span-method="tableSpanMethod2">
+                <template #total="{ row, index }">
+                    {{ index === 0 ? row.total : '' }}
+                </template>
             </HcTable>
         </HcCardItem>
     </div>
 </template>
 
 <script setup>
-import {onActivated, ref} from "vue";
-import mainApi from "~api/static/project";
+import { onActivated, ref } from 'vue'
+import mainApi from '~api/static/project'
 import { ArrowRight } from '@element-plus/icons-vue'
-import {getArrValue, getObjValue} from "js-fast-way";
+import { getArrValue, getObjValue } from 'js-fast-way'
 
 //缓存被激活
 onActivated(() => {
@@ -125,7 +141,7 @@ const getDataApi = () => {
 //项目统计总金额成本
 const statsAll = ref({})
 const allProjectStats = async () => {
-    const {error, code, data} = await mainApi.allProjectStats()
+    const { error, code, data } = await mainApi.allProjectStats()
     //判断状态
     if (!error && code === 200) {
         statsAll.value = getObjValue(data)
@@ -135,11 +151,11 @@ const allProjectStats = async () => {
 }
 
 //面包屑导航
-const breadcrumbs = ref({title: '列表统计', name: '', section: '', post: ''})
+const breadcrumbs = ref({ title: '列表统计', name: '', section: '', post: '' })
 
 //项目名被点击
 const breadcrumbTitle = () => {
-    const {name} = breadcrumbs.value
+    const { name } = breadcrumbs.value
     if (name) {
         isShowtable.value = 0
         breadcrumbs.value.name = ''
@@ -149,7 +165,7 @@ const breadcrumbTitle = () => {
 
 //项目名被点击
 const breadcrumbName = () => {
-    const {section} = breadcrumbs.value
+    const { section } = breadcrumbs.value
     if (section) {
         isShowtable.value = 1
         breadcrumbs.value.section = ''
@@ -159,7 +175,7 @@ const breadcrumbName = () => {
 
 //部门
 const breadcrumbSection = () => {
-    const {post} = breadcrumbs.value
+    const { post } = breadcrumbs.value
     if (post) {
         isShowtable.value = 2
         breadcrumbs.value.post = ''
@@ -169,16 +185,16 @@ const breadcrumbSection = () => {
 //基础表格
 const isShowtable = ref(0)
 const tableColumn = [
-    {key: 'projectName', name: '名称', minWidth: 200},
-    {key: 'contractMoney', name: '合同额', align: 'center'},
-    {key: 'budgetCost', name: '测算成本', align: 'center'},
-    {key: 'practicalPayCost', name: '实际已支出成本', align: 'center'},
-    {key: 'returnedMoney', name: '实际已回款', align: 'center'},
-    {key: 'unreturnedMoney', name: '未回款', align: 'center'},
+    { key: 'projectName', name: '名称', minWidth: 200 },
+    { key: 'contractMoney', name: '合同额', align: 'center' },
+    { key: 'budgetCost', name: '测算成本', align: 'center' },
+    { key: 'practicalPayCost', name: '实际已支出成本', align: 'center' },
+    { key: 'returnedMoney', name: '实际已回款', align: 'center' },
+    { key: 'unreturnedMoney', name: '未回款', align: 'center' },
 ]
 const tableData = ref([])
 const getTableData = async () => {
-    const {error, code, data} = await mainApi.ProjectListStats()
+    const { error, code, data } = await mainApi.ProjectListStats()
     //判断状态
     if (!error && code === 200) {
         tableData.value = getArrValue(data)
@@ -187,7 +203,7 @@ const getTableData = async () => {
     }
 }
 
-const rowNameClick = ({projectId, projectName}) => {
+const rowNameClick = ({ projectId, projectName }) => {
     breadcrumbs.value.name = projectName
     isShowtable.value = 1
     getTableData1(projectId)
@@ -195,16 +211,16 @@ const rowNameClick = ({projectId, projectName}) => {
 
 //费用分类
 const tableColumn1 = [
-    {key: 'costTypeValue', name: '费用分类', align: 'center'},
-    {key: 'budgetCost', name: '测算费用(元)', align: 'center'},
-    {key: 'practicalCost', name: '实际费用(元)', align: 'center'},
-    {key: 'detail', name: '费用明细', align: 'center'},
-    {key: 'total', name: '总计', align: 'center'},
+    { key: 'costTypeValue', name: '费用分类', align: 'center' },
+    { key: 'budgetCost', name: '测算费用(元)', align: 'center' },
+    { key: 'practicalCost', name: '实际费用(元)', align: 'center' },
+    { key: 'detail', name: '费用明细', align: 'center' },
+    { key: 'total', name: '总计', align: 'center' },
 ]
 const tableData1 = ref([])
 const getTableData1 = async (projectId) => {
-    const {error, code, data} = await mainApi.ProjectCostTypeStats({
-        id: projectId
+    const { error, code, data } = await mainApi.ProjectCostTypeStats({
+        id: projectId,
     })
     //判断状态
     if (!error && code === 200) {
@@ -216,13 +232,13 @@ const getTableData1 = async (projectId) => {
 
 
 //合并单元格
-const tableSpanMethod1 = ({columnIndex}) => {
-    if (columnIndex === tableColumn1.length -1 && tableData1.value.length > 0) {
-        return {rowspan: tableData1.value.length, colspan: 1}
+const tableSpanMethod1 = ({ columnIndex }) => {
+    if (columnIndex === tableColumn1.length - 1 && tableData1.value.length > 0) {
+        return { rowspan: tableData1.value.length, colspan: 1 }
     }
 }
 
-const rowNameClick1 = ({costTypeValue, costType, projectId}) => {
+const rowNameClick1 = ({ costTypeValue, costType, projectId }) => {
     breadcrumbs.value.section = costTypeValue
     isShowtable.value = 2
     getTableData2(costType, projectId)
@@ -230,18 +246,18 @@ const rowNameClick1 = ({costTypeValue, costType, projectId}) => {
 
 //细分环节费用
 const tableColumn2 = [
-    {key: 'name', name: '项目环节'},
-    {key: 'isParticipate', name: '参与', align: 'center'},
-    {key: 'costDisburse', name: '成本支出(元)', align: 'center'},
-    {key: 'timeCost', name: '时间成本(工作日)', align: 'center'},
-    {key: 'staffTotal', name: '人员投入(人)', align: 'center'},
-    {key: 'detail', name: '明细', align: 'center'},
+    { key: 'name', name: '项目环节' },
+    { key: 'isParticipate', name: '参与', align: 'center' },
+    { key: 'costDisburse', name: '成本支出(元)', align: 'center' },
+    { key: 'timeCost', name: '时间成本(工作日)', align: 'center' },
+    { key: 'staffTotal', name: '人员投入(人)', align: 'center' },
+    { key: 'detail', name: '明细', align: 'center' },
 ]
 const tableData2 = ref([])
-const getTableData2 = async (typeId,projectId) => {
-    const {error, code, data} = await mainApi.projectLinkCost({
+const getTableData2 = async (typeId, projectId) => {
+    const { error, code, data } = await mainApi.projectLinkCost({
         costType: typeId,
-        projectId: projectId
+        projectId: projectId,
     })
     //判断状态
     if (!error && code === 200) {
@@ -251,7 +267,7 @@ const getTableData2 = async (typeId,projectId) => {
     }
 }
 
-const rowNameClick2 = ({name, costDetails}) => {
+const rowNameClick2 = ({ name, costDetails }) => {
     breadcrumbs.value.post = name
     isShowtable.value = 3
     tableData3.value = costDetails
@@ -259,15 +275,15 @@ const rowNameClick2 = ({name, costDetails}) => {
 
 //细分环节费用
 const tableColumn3 = [
-    {key: 'costTypeValue', name: '费用分类'},
-    {key: 'price', name: '费用(元)', align: 'center'},
-    {key: 'total', name: '总计', align: 'center'},
+    { key: 'costTypeValue', name: '费用分类' },
+    { key: 'price', name: '费用(元)', align: 'center' },
+    { key: 'total', name: '总计', align: 'center' },
 ]
 const tableData3 = ref([])
 //合并单元格
-const tableSpanMethod2 = ({columnIndex}) => {
-    if (columnIndex === tableColumn3.length -1 && tableData1.value.length > 0) {
-        return {rowspan: tableData3.value.length, colspan: 1}
+const tableSpanMethod2 = ({ columnIndex }) => {
+    if (columnIndex === tableColumn3.length - 1 && tableData1.value.length > 0) {
+        return { rowspan: tableData3.value.length, colspan: 1 }
     }
 }
 </script>

+ 21 - 20
src/views/system/components/HcTreeData.vue

@@ -1,14 +1,16 @@
 <template>
-    <ElTree ref="ElTreeRef" :class="ui" :data="treeDatas" default-expand-all :indent="0" :props="ElTreeProps"
-        class="hc-tree-node tree-line" highlight-current node-key="id" @node-click="ElTreeClick">
+    <ElTree
+        ref="ElTreeRef" :class="ui" :data="treeDatas" default-expand-all :indent="0" :props="ElTreeProps"
+        class="hc-tree-node tree-line" highlight-current node-key="id" @node-click="ElTreeClick"
+    >
         <template #default="{ node, data }">
             <div class="data-custom-tree-node">
-                <div :class="node.level === 1?'level-name':''" class="label">
+                <div :class="node.level === 1 ? 'level-name' : ''" class="label">
                     <span class="mr-5">{{ node.label }}</span>
-                    <HcIcon class="hc-tree-node-icon-add" name="add-box" @click.stop="addClick(node, data)" v-if="node.level < 3"/>
-                    <HcIcon class="hc-tree-node-icon-edit" name="edit" @click.stop="editClick(node, data)"/>
-                    <HcIcon class="hc-tree-node-icon-del" name="delete-bin" @click.stop="delClick(node, data)" v-if="node.level !== 1"/>
-                    <HcIcon class="hc-tree-node-icon-vip" name="vip-crown-2" @click.stop="authorityClick(node, data)" v-if="node.level !== 1"/>
+                    <HcIcon v-if="node.level < 3" class="hc-tree-node-icon-add" name="add-box" @click.stop="addClick(node, data)" />
+                    <HcIcon class="hc-tree-node-icon-edit" name="edit" @click.stop="editClick(node, data)" />
+                    <HcIcon v-if="node.level !== 1" class="hc-tree-node-icon-del" name="delete-bin" @click.stop="delClick(node, data)" />
+                    <HcIcon v-if="node.level !== 1" class="hc-tree-node-icon-vip" name="vip-crown-2" @click.stop="authorityClick(node, data)" />
                 </div>
             </div>
         </template>
@@ -16,26 +18,28 @@
 </template>
 
 <script setup>
-import {ref, watch} from "vue";
+import { ref, watch } from 'vue'
 //参数
 const props = defineProps({
     ui: {
         type: String,
-        default: ''
+        default: '',
     },
     datas: {
         type: Object,
-        default: () => ({})
+        default: () => ({}),
     },
 })
 
+//事件
+const emit = defineEmits(['menuTap', 'nodeTap'])
 //变量
 const ElTreeRef = ref(null)
 const treeDatas = ref([props.datas])
 const ElTreeProps = ref({
     label: 'label',
     children: 'children',
-    isLeaf: 'isLeaf'
+    isLeaf: 'isLeaf',
 })
 
 //监听
@@ -43,41 +47,38 @@ watch(() => [
     props.datas,
 ], ([data]) => {
     treeDatas.value = [data]
-}, {deep: true})
-
-//事件
-const emit = defineEmits(['menuTap', 'nodeTap'])
+}, { deep: true })
 
 //节点被点击
 const ElTreeClick = async (data, node) => {
-    emit('nodeTap', {node, data})
+    emit('nodeTap', { node, data })
 }
 
 //添加
 const addClick = (node, data)=>{
     emit('menuTap', {
-        key: 'add', node, data
+        key: 'add', node, data,
     })
 }
 
 //编辑
 const editClick = (node, data) => {
     emit('menuTap', {
-        key: 'edit', node, data
+        key: 'edit', node, data,
     })
 }
 
 //删除
 const delClick = (node, data) => {
     emit('menuTap', {
-        key: 'del', node, data
+        key: 'del', node, data,
     })
 }
 
 //权限
 const authorityClick = (node, data) => {
     emit('menuTap', {
-        key: 'auth', node, data
+        key: 'auth', node, data,
     })
 }
 </script>

+ 4 - 4
src/views/system/components/tab-approve.vue

@@ -61,7 +61,7 @@
 </template>
 
 <script setup>
-import { nextTick, onMounted, ref, watch } from 'vue'
+import { onMounted, ref, watch } from 'vue'
 import { getApproveList, getParentList, removeDictionary, submitApproveList, submitDictionary } from '~api/system/parameter.js'
 import { getArrValue } from 'js-fast-way'
 
@@ -132,7 +132,7 @@ const menuChange = (item) => {
 const getApproveListData = async ()=>{
     checkList.value = []
     checkList1.value = []
-    const { error, code, data, msg } = await getApproveList({
+    const { error, code, data } = await getApproveList({
        id:menuKey.value,
     })
     if (!error && code === 200) {
@@ -226,7 +226,7 @@ const contextMenuClick = ({ key, item }) => {
 
 //新增一级科目
 const saveparentClick = async ()=>{
-    const { error, code, data, msg } = await submitDictionary({
+    const { error, code, msg } = await submitDictionary({
         type:tabsType.value,
         dictName:priceform.value?.dictName,
         id:menuKey.value || null,
@@ -320,7 +320,7 @@ const saveApprove = ()=>{
 }
 const submitApprove = async ()=>{
     saveApprovelaoding.value = true
-    const { error, code, data, msg } = await submitApproveList( subObj.value)
+    const { error, code, msg } = await submitApproveList( subObj.value)
     saveApprovelaoding.value = false
     if (!error && code === 200) {
         window.$message.success(msg)

+ 83 - 83
src/views/system/components/tab-cost.vue

@@ -5,24 +5,26 @@
                 <template #header>
                     <span class="mr-2">成本测算分类:</span>
                     <el-button _icon hc-btn size="small" type="primary" @click="openpriceEdit(1)">
-                        <HcIcon name="add"/>
+                        <HcIcon name="add" />
                     </el-button>
                 </template>
                 <div> <span class="mt-2">测算一级科目:</span></div>
                 <div class="hc-layout-left-box menu mt-3">
                     <div class="hc-menu-contents-box">
                         <el-scrollbar>
-                            <HcMenuSimple :datas="menuOptions" :keys="menuKey" :props="menusProps"
-                                          :menus="contextMenu" @menuTap="contextMenuClick"
-                                          @change="menuChange"/>
+                            <HcMenuSimple
+                                :datas="menuOptions" :keys="menuKey" :props="menusProps"
+                                :menus="contextMenu" @menu-tap="contextMenuClick"
+                                @change="menuChange"
+                            />
                         </el-scrollbar>
                     </div>
 
-                    <!--预算分类新增编辑弹窗-->
-                    <HcDialog bgColor="#ffffff" widths="22rem" isToBody :show="priceModal" :title="priceTitle" @close="priceModalClose" @save="saveparentClick">
+                    <!-- 预算分类新增编辑弹窗 -->
+                    <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-input v-model="priceform.dictName"/>
+                                <el-input v-model="priceform.dictName" />
                             </el-form-item>
                         </el-form>
                     </HcDialog>
@@ -30,50 +32,52 @@
             </HcCardItem>
 
             <div class="hc-page-content-box">
-                <HcCardItem ui="hac-card-item" actionSize="lg">
+                <HcCardItem ui="hac-card-item" action-size="lg">
                     <template #header>
                         <span class="mr-2">测算二级科目:</span>
                         <el-button _icon hc-btn size="small" type="primary" @click="openEdit(1)">
-                            <HcIcon name="add"/>
+                            <HcIcon name="add" />
                         </el-button>
                     </template>
-                    <HcTable :column="tableColumn" :datas="tableData"  :isIndex="false" :loading="tableLoaing">
-                        <template #action="{row, index}">
-                            <el-button size="small" type="primary" @click="openEdit(2,row)">编辑</el-button>
-                            <el-button size="small" type="primary" @click="delTask(row)">删除</el-button>
+                    <HcTable :column="tableColumn" :datas="tableData" :is-index="false" :loading="tableLoaing">
+                        <template #action="{ row }">
+                            <el-button size="small" type="primary" @click="openEdit(2, row)">
+                                编辑
+                            </el-button>
+                            <el-button size="small" type="primary" @click="delTask(row)">
+                                删除
+                            </el-button>
                         </template>
                     </HcTable>
 
-                    <!--任务明细弹窗-->
-                    <HcDialog bgColor="#ffffff" widths="24rem" isToBody :show="editTaskModal" :title="taskTitle" @close="testModalClose" @save="savechilidClick">
+                    <!-- 任务明细弹窗 -->
+                    <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-input v-model="formLabelAlign.dictName"/>
+                                <el-input v-model="formLabelAlign.dictName" />
                             </el-form-item>
                         </el-form>
                     </HcDialog>
-
                 </HcCardItem>
             </div>
         </div>
- 
     </HcCard>
 </template>
 
 <script setup>
-import {onMounted, ref, watch} from "vue";
-import {submitDictionary,removeDictionary,getParentList,getChildList} from '~api/system/parameter.js';
-import {getArrValue} from "js-fast-way"
+import { onMounted, ref, watch } from 'vue'
+import { getChildList, getParentList, removeDictionary, submitDictionary } from '~api/system/parameter.js'
+import { getArrValue } from 'js-fast-way'
 
 const props = defineProps({
     cur: {
-        type: [String,Number],
-        default: ''
+        type: [String, Number],
+        default: '',
     },
     type:{
-        type: [String,Number],
-        default: ''
-    }
+        type: [String, Number],
+        default: '',
+    },
 })
 
 const tabsKey = ref(props.cur)
@@ -83,7 +87,7 @@ const tabsType = ref(props.type)
 watch(() => [
     props.cur,
     props.type,
-], ([key,type]) => {
+], ([key, type]) => {
     tabsKey.value = key
     tabsType.value = type
    
@@ -97,47 +101,47 @@ onMounted(() => {
 
 //左侧菜单
 const menuKey = ref('')
-const menuOptions = ref([]);
-const menuItem=ref({})
+const menuOptions = ref([])
+const menuItem = ref({})
 const menuChange = (item) => {
     console.log(item)
     menuKey.value = item?.id
-    menuItem.value=item
+    menuItem.value = item
     getChildListData()
 }
 const menusProps = ref({
     key: 'id',
-    label: 'dictName'
+    label: 'dictName',
 })
 
 //菜单的右键菜单
 const contextMenu = ref([])
 const setContextMenu = () => {
-    let newArr = [];
-    newArr.push({icon: 'draft', label: '编辑分类', key: "edit"})
-    newArr.push({icon: 'delete-bin', label: '删除分类', key: "del"})
+    let newArr = []
+    newArr.push({ icon: 'draft', label: '编辑分类', key: 'edit' })
+    newArr.push({ icon: 'delete-bin', label: '删除分类', key: 'del' })
 
     contextMenu.value = newArr
 }
 
 //菜单的右键菜单被点击
-const contextMenuClick = ({key, item}) => {
-    console.log(item,'item');
+const contextMenuClick = ({ key, item }) => {
+    console.log(item, 'item')
     menuKey.value = item?.id
   
     if (key === 'edit') {
         openpriceEdit(2)
         menuKey.value = item?.id
-        priceform.value.dictName=item.dictName
+        priceform.value.dictName = item.dictName
     } else if (key === 'del') {
         window?.$messageBox?.alert('您确定要删除该预算分类信息吗? 一旦注销数据将彻底清除,请谨慎操作?', '删除提醒', {
             showCancelButton: true,
             confirmButtonText: '确认注销',
             cancelButtonText: '取消',
             type: 'warning',
-            callback: async(action) => {
+            callback: async (action) => {
                 if (action === 'confirm') {
-                        const {error, code, msg} = await removeDictionary({
+                        const { error, code, msg } = await removeDictionary({
                             ids: item?.id,
                         })
                         if (!error && code === 200) {
@@ -147,7 +151,7 @@ const contextMenuClick = ({key, item}) => {
                             window?.$message?.warning(msg)
                         }
                 }
-            }
+            },
         })
     }
 }
@@ -157,8 +161,8 @@ const priceModal = ref(false)
 const openpriceEdit = (type) => {
     if (type === 1) {
         priceTitle.value = '新增分类'
-        priceform.value={}
-        menuKey.value=''
+        priceform.value = {}
+        menuKey.value = ''
     } else {
         priceTitle.value = '编辑分类'
     }
@@ -172,21 +176,21 @@ const priceModalClose = () => {
 }
 
 const taskTitle = ref('')
-const openEdit = (type,row) => {
+const openEdit = (type, row) => {
     
     if (type === 1) {
-        formLabelAlign.value.dictName=''
-        formLabelAlign.value.id=''
+        formLabelAlign.value.dictName = ''
+        formLabelAlign.value.id = ''
         taskTitle.value = '新增'
     } else {
-        formLabelAlign.value.dictName=row.dictName
-        formLabelAlign.value.id=row.id
+        formLabelAlign.value.dictName = row.dictName
+        formLabelAlign.value.id = row.id
         taskTitle.value = '编辑'
     }
-    if(menuKey.value){
+    if (menuKey.value) {
        
         editTaskModal.value = true
-    }else{
+    } else {
         window.$message.warning('请先选择一级科目')
     }
    
@@ -204,9 +208,9 @@ const delTask = (item) => {
             confirmButtonText: '确认注销',
             cancelButtonText: '取消',
             type: 'warning',
-            callback: async(action) => {
+            callback: async (action) => {
                 if (action === 'confirm') {
-                        const {error, code, msg} = await removeDictionary({
+                        const { error, code, msg } = await removeDictionary({
                             ids: item?.id,
                         })
                         if (!error && code === 200) {
@@ -216,18 +220,18 @@ const delTask = (item) => {
                             window?.$message?.warning(msg)
                         }
                 }
-            }
+            },
         })
 }
 
 const tableColumn = [
-    {key: 'dictName', name: '预算二级科目',align:'center'},
+    { key: 'dictName', name: '预算二级科目', align:'center' },
     // {key: 'text', name: '任务内容'},
     // {key: 'color', name: '完成指标'},
-    {key: 'action', name: '操作', width: 200}
+    { key: 'action', name: '操作', width: 200 },
 ]
 const tableData = ref([])
-const tableLoaing=ref(false)
+const tableLoaing = ref(false)
 const formLabelAlign = ref({
     name: '',
     region: '',
@@ -236,72 +240,68 @@ const formLabelAlign = ref({
 
 
 //新增一级科目
-const saveparentClick=async()=>{
-    const { error, code, data,msg } = await submitDictionary({
+const saveparentClick = async ()=>{
+    const { error, code, msg } = await submitDictionary({
         type:tabsType.value,
         dictName:priceform.value?.dictName,
-        id:menuKey.value||null,
+        id:menuKey.value || null,
     })
    
     if (!error && code === 200) {
         window.$message?.success(msg)
-        priceModal.value=false
+        priceModal.value = false
         getParentListData()
-    } 
-    else {
+    } else {
         window.$message?.warning(msg)
     }
 }
 //新增二级级科目
-const savechilidClick=async()=>{
-    const { error, code, data,msg } = await submitDictionary({
+const savechilidClick = async ()=>{
+    const { error, code, msg } = await submitDictionary({
         type:tabsType.value,
         dictName:formLabelAlign.value?.dictName,
-        id:formLabelAlign.value.id||null,
-        parentId:menuKey.value
+        id:formLabelAlign.value.id || null,
+        parentId:menuKey.value,
     })
    
     if (!error && code === 200) {
         window.$message?.success(msg)
-        editTaskModal.value=false
+        editTaskModal.value = false
         getChildListData()
-    } 
-    else {
+    } else {
         window.$message?.warning(msg)
     }
 }
 //获取一级科目
-const getParentListData=async()=>{
-    const { error, code, data,msg } = await getParentList({
+const getParentListData = async ()=>{
+    const { error, code, data, msg } = await getParentList({
         type:tabsType.value,
        
     })
     if (!error && code === 200) {
         menuOptions.value = getArrValue(data['records'])
-        if( menuOptions.value.length>0){
-            menuKey.value= menuOptions.value[0]?.id
-            menuItem.value.id =   menuOptions.value[0]?.id
+        if ( menuOptions.value.length > 0) {
+            menuKey.value = menuOptions.value[0]?.id
+            menuItem.value.id = menuOptions.value[0]?.id
             getChildListData()
         }
-    } 
-    else {
-        menuOptions.value =[]
+    } else {
+        menuOptions.value = []
         window.$message?.warning(msg)
     }
 }
 //获取二级科目
-const getChildListData=async()=>{
-    tableLoaing.value=true
-    const { error, code, data,msg } = await getChildList({
+const getChildListData = async ()=>{
+    tableLoaing.value = true
+    const { error, code, data, msg } = await getChildList({
         parentId: menuItem.value.id,
         type:tabsType.value,
     })
-    tableLoaing.value=false
+    tableLoaing.value = false
     if (!error && code === 200) {
-        tableData.value=getArrValue(data)
+        tableData.value = getArrValue(data)
         // tab.value = getArrValue(data['records'])
-    } 
-    else {
+    } else {
         window.$message?.warning(msg)
     }
 }

+ 42 - 41
src/views/system/components/tab-invoice.vue

@@ -3,40 +3,43 @@
         <template #header>
             <span class="mr-2">发票类型:</span>
             <el-button _icon hc-btn size="small" type="primary" @click="positionEdit(1)">
-                <HcIcon name="add"/>
+                <HcIcon name="add" />
             </el-button>
         </template>
         <HcTable :column="positiontableColumn" :datas="positiontableData" :loading="tableLoaing">
-            <template #action="{row, index}">
-                <el-button size="small" type="primary" @click="positionEdit(2,row)">编辑</el-button>
-                <el-button size="small" type="primary" @click="delTaskposition(row)">删除</el-button>
+            <template #action="{ row }">
+                <el-button size="small" type="primary" @click="positionEdit(2, row)">
+                    编辑
+                </el-button>
+                <el-button size="small" type="primary" @click="delTaskposition(row)">
+                    删除
+                </el-button>
             </template>
         </HcTable>
    
-        <HcDialog bgColor="#ffffff" isToBody widths="24rem" :show="positonModal" :title="positonModalTitle" @close="positonModalClose" @save="savepositionClick">
+        <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-input v-model="formposition.dictName"/>
+                    <el-input v-model="formposition.dictName" />
                 </el-form-item>
-        
             </el-form>
         </HcDialog>
     </HcCard>
 </template>
 
 <script setup>
-import {ref, watch,onMounted} from "vue";
-import {submitDictionary,removeDictionary,getParentList,getChildList} from '~api/system/parameter.js';
-import {getArrValue} from "js-fast-way"
+import { onMounted, ref, watch } from 'vue'
+import { getParentList, removeDictionary, submitDictionary } from '~api/system/parameter.js'
+import { getArrValue } from 'js-fast-way'
 const props = defineProps({
     cur: {
-        type: [String,Number],
-        default: ''
+        type: [String, Number],
+        default: '',
     },
     type:{
-        type: [String,Number],
-        default: ''
-    }
+        type: [String, Number],
+        default: '',
+    },
 })
 
 const tabsKey = ref(props.cur)
@@ -46,7 +49,7 @@ const tabsType = ref(props.type)
 watch(() => [
     props.cur,
     props.type,
-], ([key,type]) => {
+], ([key, type]) => {
     tabsKey.value = key
     tabsType.value = type
 })
@@ -55,19 +58,18 @@ onMounted(() => {
     getParentListData()
    
 })
-const tableLoaing=ref(false)
-const getParentListData=async()=>{
-    tableLoaing.value=true
-    const { error, code, data,msg } = await getParentList({
+const tableLoaing = ref(false)
+const getParentListData = async ()=>{
+    tableLoaing.value = true
+    const { error, code, data, msg } = await getParentList({
         type:tabsType.value,
     })
-    tableLoaing.value=false
+    tableLoaing.value = false
     if (!error && code === 200) {
         positiontableData.value = getArrValue(data['records'])
        
-    } 
-    else {
-        positiontableData.value=[]
+    } else {
+        positiontableData.value = []
         window.$message?.warning(msg)
     }
 }
@@ -76,8 +78,8 @@ const getParentListData=async()=>{
 
 
 const positiontableColumn = [
-    {key: 'dictName', name: '报销类型名称'},
-    {key: 'action', name: '操作', width: 200}
+    { key: 'dictName', name: '报销类型名称' },
+    { key: 'action', name: '操作', width: 200 },
 ]
 
 
@@ -87,16 +89,16 @@ const positiontableData = ref([
 
 const positonModal = ref(false)
 const positonModalTitle = ref('')
-const editItem=ref({})
-const positionEdit = (type,row) => {
+const editItem = ref({})
+const positionEdit = (type, row) => {
     if (type === 1) {
         positonModalTitle.value = '新增报销类型'
-        formposition.value={}
-        editItem.value={}
+        formposition.value = {}
+        editItem.value = {}
     } else {
         positonModalTitle.value = '编辑报销类型'
-        editItem.value=row
-        formposition.value=row
+        editItem.value = row
+        formposition.value = row
     }
     positonModal.value = true
 }
@@ -109,20 +111,19 @@ const positonModalClose = () => {
 const formposition = ref({})
 
 //新增编辑提交
-const savepositionClick=async()=>{
-    const { error, code, data,msg } = await submitDictionary({
+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
+        id:editItem.value.id || null,
       
     })
-    positonModal.value=false
+    positonModal.value = false
     if (!error && code === 200) {
         window.$message?.success(msg)
         getParentListData()
-    } 
-    else {
+    } else {
         window.$message?.warning(msg)
     }
 }
@@ -132,9 +133,9 @@ const delTaskposition = (row) => {
             confirmButtonText: '确认注销',
             cancelButtonText: '取消',
             type: 'warning',
-            callback: async(action) => {
+            callback: async (action) => {
                 if (action === 'confirm') {
-                        const {error, code, msg} = await removeDictionary({
+                        const { error, code, msg } = await removeDictionary({
                             ids: row?.id,
                         })
                         if (!error && code === 200) {
@@ -144,7 +145,7 @@ const delTaskposition = (row) => {
                             window?.$message?.warning(msg)
                         }
                 }
-            }
+            },
     })
 }
 </script>

+ 203 - 224
src/views/system/components/tab-other.vue

@@ -1,69 +1,74 @@
 <!--  -->
 <template>
-   <HcCard>
-    <template #header>
-          <div class="w-48">
-                <el-input v-model="searchForm.dictName" clearable placeholder="请输入字典名称进行查询" size="large"/>
+    <HcCard>
+        <template #header>
+            <div class="w-48">
+                <el-input v-model="searchForm.dictName" clearable placeholder="请输入字典名称进行查询" size="large" />
             </div>
             <div class="w-48 ml-2">
-                <el-input v-model="searchForm.code" clearable placeholder="请输入字典编号进行查询" size="large"/>
+                <el-input v-model="searchForm.code" clearable placeholder="请输入字典编号进行查询" size="large" />
             </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>
-        <div>
-                <el-button type="primary" @click="addClick" size="large">
-                    <HcIcon name="add-circle"/>
+        </template>
+        <template #extra>
+            <div>
+                <el-button type="primary" size="large" @click="addClick">
+                    <HcIcon name="add-circle" />
                     <span>新增</span>
                 </el-button>
-         </div>
-         <div class="ml-2">
-                <el-button type="primary" @click="delModal" size="large" :disabled="tableCheckedKeys.length<1">
-                    <HcIcon name="delete-bin-2"/>
+            </div>
+            <div class="ml-2">
+                <el-button type="primary" size="large" :disabled="tableCheckedKeys.length < 1" @click="delModal">
+                    <HcIcon name="delete-bin-2" />
                     <span>删除</span>
                 </el-button>
-        </div>
-      </template>
-      <HcTable :column="tableColumn" :datas="tableData" isCheck @selection-change="tableSelectionChange" :loading="tableLoaing">
-            <template #action="{row, index}">
-                <el-button size="small" type="primary" @click="eidtModal(row)">编辑</el-button>
-                <el-button size="small" type="primary" @click="delModal(row)">删除</el-button>
-                <el-button size="small" type="primary" @click="configModalclick(row)">字典配置</el-button>
-                
+            </div>
+        </template>
+        <HcTable :column="tableColumn" :datas="tableData" is-check :loading="tableLoaing" @selection-change="tableSelectionChange">
+            <template #action="{ row }">
+                <el-button size="small" type="primary" @click="eidtModal(row)">
+                    编辑
+                </el-button>
+                <el-button size="small" type="primary" @click="delModal(row)">
+                    删除
+                </el-button>
+                <el-button size="small" type="primary" @click="configModalclick(row)">
+                    字典配置
+                </el-button>
             </template>
-      </HcTable>
-      <template #action>
-            <HcPages :pages="searchForm" @change="pageChange"></HcPages>
+        </HcTable>
+        <template #action>
+            <HcPages :pages="searchForm" @change="pageChange" />
         </template>
 
         <!-- 新增编辑一级字典 -->
-        <HcDialog bgColor="#ffffff" isToBody  :show="codeModal" :title="codeModalTitle" @close="codeModalClose"  widths="62rem"  @save="saveparentClick">
+        <HcDialog bg-color="#ffffff" is-to-body :show="codeModal" :title="codeModalTitle" widths="62rem" @close="codeModalClose" @save="saveparentClick">
             <el-form label-position="left" label-width="auto" :model="formcode" :rules="formUserRules" size="large">
                 <el-row :gutter="20">
                     <el-col :span="12">
                         <el-form-item label="字典编号:" prop="code">
-                            <el-input v-model="formcode.code"/>
+                            <el-input v-model="formcode.code" />
                         </el-form-item>
                     </el-col>
                     <el-col :span="12">
-                        <el-form-item label="字典名称:"  prop="dictName">
-                            <el-input v-model="formcode.dictName"/>
+                        <el-form-item label="字典名称:" prop="dictName">
+                            <el-input v-model="formcode.dictName" />
                         </el-form-item>
                     </el-col>
                     <el-col :span="12">
-                        <el-form-item label="字典值:"  prop="dictValue">
-                            <el-input v-model="formcode.dictValue"/>
+                        <el-form-item label="字典值:" prop="dictValue">
+                            <el-input v-model="formcode.dictValue" />
                         </el-form-item>
                     </el-col>
           
@@ -73,58 +78,43 @@
                                 v-model="formcode.sort"
                                 controls-position="right"
                                 size="large"
-                                @change="handleSortChange"
                                 style="width: 100%;"
+                                @change="handleSortChange"
                             />
                         </el-form-item>
                     </el-col>
-                    <!-- <el-col :span="12">
-                        <el-form-item label="封存:" prop="isstorage">
-                            <el-switch
-                                v-model="formcode.isstorage"
-                                size="large"
-                                active-text="是"
-                                inactive-text="否"
-                            />
-                        </el-form-item>
-                    </el-col>
-                    <el-col :span="12">
-                        <el-form-item label="字典备注:">
-                            <el-input v-model="formcode.price"/>
-                        </el-form-item>
-                    </el-col> -->
                 </el-row>
             </el-form>
         </HcDialog>
         <!-- 新增编辑二级 -->
-        <HcDialog bgColor="#ffffff" isToBody  :show="configcodeModal" @close="configcodeModalClose"  widths="62rem" @save="savechilidClick" :title="configcodeModalTitle">
+        <HcDialog bg-color="#ffffff" is-to-body :show="configcodeModal" widths="62rem" :title="configcodeModalTitle" @close="configcodeModalClose" @save="savechilidClick">
             <el-form label-position="left" label-width="auto" :model="configForm" :rules="formUserRules" size="large">
                 <el-row :gutter="20">
                     <el-col :span="12">
                         <el-form-item label="字典编号:" prop="code">
-                            <el-input v-model="configForm.code" disabled/>
+                            <el-input v-model="configForm.code" disabled />
                         </el-form-item>
                     </el-col>
                     <el-col :span="12">
-                        <el-form-item label="字典名称:"  prop="dictName">
-                            <el-input v-model="configForm.dictName"/>
+                        <el-form-item label="字典名称:" prop="dictName">
+                            <el-input v-model="configForm.dictName" />
                         </el-form-item>
                     </el-col>
                     <el-col :span="12">
-                        <el-form-item label="字典值:"  prop="dictValue">
-                            <el-input v-model="configForm.dictValue"/>
+                        <el-form-item label="字典值:" prop="dictValue">
+                            <el-input v-model="configForm.dictValue" />
                         </el-form-item>
                     </el-col>
-                    <el-col :span="12" v-if="isConfigedit">
-                        <el-form-item label="上级字典:"  prop="parentId">
+                    <el-col v-if="isConfigedit" :span="12">
+                        <el-form-item label="上级字典:" prop="parentId">
                             <el-select v-model="configForm.parentId" class="m-2" placeholder="请选择" size="large" style="width: 100%;" disabled>
-                                    <el-option
+                                <el-option
                                     v-for="item in tableData"
                                     :key="item.id"
                                     :label="item.dictName"
                                     :value="item.id"
-                                    />
-                             </el-select>
+                                />
+                            </el-select>
                         </el-form-item>
                     </el-col>
                     <el-col :span="12">
@@ -133,8 +123,8 @@
                                 v-model="configForm.sort"
                                 controls-position="right"
                                 size="large"
-                                @change="handleSortChange"
                                 style="width: 100%;"
+                                @change="handleSortChange"
                             />
                         </el-form-item>
                     </el-col>
@@ -157,76 +147,75 @@
             </el-form>
         </HcDialog>
         <!-- 字典配置 -->
-        <HcDialog bgColor="#ffffff"  isTable isRowFooter :loading="configModalLoading" :show="configModal" title="字典配置" widths="62rem" @close="closeConfigClick">
+        <HcDialog bg-color="#ffffff" is-table is-row-footer :loading="configModalLoading" :show="configModal" title="字典配置" widths="62rem" @close="closeConfigClick">
             <template #header>
                 <div class="w-30">
-                        [{{ configItem?.dictName }}] 字典配置
+                    [{{ configItem?.dictName }}] 字典配置
                 </div>
-               <div class="header-box mt-2">
-                    
+                <div class="header-box mt-2">
                     <div class="w-48 ">
-                            <el-input v-model="configsearchForm.dictName" clearable placeholder="请输入字典名称进行查询" size="large"/>
+                        <el-input v-model="configsearchForm.dictName" clearable placeholder="请输入字典名称进行查询" size="large" />
                     </div>
                     <div class="w-48 ml-2">
-                            <el-input v-model="configsearchForm.code" clearable placeholder="请输入字典编号进行查询" size="large"/>
+                        <el-input v-model="configsearchForm.code" clearable placeholder="请输入字典编号进行查询" size="large" />
                     </div>
                     <div class="ml-4">
-                            <el-button type="primary" @click="configsearchClick" size="large">
-                                <HcIcon name="search-2"/>
-                                <span>搜索</span>
-                            </el-button>
+                        <el-button type="primary" size="large" @click="configsearchClick">
+                            <HcIcon name="search-2" />
+                            <span>搜索</span>
+                        </el-button>
                     </div>
                     <div class="ml-2">
-                            <el-button size="large" @click="configresetClick">
-                                <HcIcon name="close-circle"/>
-                                <span>重置</span>
-                            </el-button>
+                        <el-button size="large" @click="configresetClick">
+                            <HcIcon name="close-circle" />
+                            <span>重置</span>
+                        </el-button>
                     </div>
                     <div class="ml-32">
-                            <el-button type="primary" @click="addchildClick" size="large">
-                                <HcIcon name="add-circle"/>
-                                <span>新增</span>
-                            </el-button>
+                        <el-button type="primary" size="large" @click="addchildClick">
+                            <HcIcon name="add-circle" />
+                            <span>新增</span>
+                        </el-button>
                     </div>
                     <div class="ml-2">
-                            <el-button type="primary" @click="configdelClick" size="large" :loading="configdelbtnloading" :disabled="configtableCheckedKeys.length<1">
-                                <HcIcon name="delete-bin-2"/>
-                                <span>删除</span>
-                            </el-button>
+                        <el-button type="primary" size="large" :loading="configdelbtnloading" :disabled="configtableCheckedKeys.length < 1" @click="configdelClick">
+                            <HcIcon name="delete-bin-2" />
+                            <span>删除</span>
+                        </el-button>
                     </div>
-               </div>
+                </div>
             </template>
       
            
         
-            <HcTable :column="configtableColumn" :datas="configtableData" isCheck @selection-change="configtableSelectionChange" :loading="configTableloaing">
-                <template #action="{row, index}">
-                    <el-button size="small" type="primary" @click="configeidtModal(row)">编辑</el-button>
-                    <el-button size="small" type="primary" @click="configdelClick(row)" :loading="configdelbtnloading">删除</el-button>
-                
-                    
+            <HcTable :column="configtableColumn" :datas="configtableData" is-check :loading="configTableloaing" @selection-change="configtableSelectionChange">
+                <template #action="{ row }">
+                    <el-button size="small" type="primary" @click="configeidtModal(row)">
+                        编辑
+                    </el-button>
+                    <el-button size="small" type="primary" :loading="configdelbtnloading" @click="configdelClick(row)">
+                        删除
+                    </el-button>
                 </template>
             </HcTable>
-       
         </HcDialog>
-   </HcCard>
+    </HcCard>
 </template>
 
 <script setup>
-
-import {onMounted, ref, watch} from "vue";
-import {submitDictionary,removeDictionary,getParentList,getChildList} from '~api/system/parameter.js';
-import {getArrValue,arrToId} from "js-fast-way"
+import { onMounted, ref, watch } from 'vue'
+import { getChildList, getParentList, removeDictionary, submitDictionary } from '~api/system/parameter.js'
+import { arrToId, getArrValue } from 'js-fast-way'
 
 const props = defineProps({
     cur: {
-        type: [String,Number],
-        default: ''
+        type: [String, Number],
+        default: '',
     },
     type:{
-        type: [String,Number],
-        default: ''
-    }
+        type: [String, Number],
+        default: '',
+    },
 })
 
 const tabsKey = ref(props.cur)
@@ -236,7 +225,7 @@ const tabsType = ref(props.type)
 watch(() => [
     props.cur,
     props.type,
-], ([key,type]) => {
+], ([key, type]) => {
     tabsKey.value = key
     tabsType.value = type
    
@@ -250,33 +239,32 @@ onMounted(() => {
 //搜索表单
 const searchForm = ref({
   
-    current: 1, size: 20,total:0
+    current: 1, size: 20, total:0,
 })
 //分页被点击
-const pageChange = ({current, size}) => {
+const pageChange = ({ current, size }) => {
     searchForm.value.current = current
     searchForm.value.size = size
     getTableData()
 }
-const tableLoaing=ref(false)
-const getTableData=async()=>{
-    tableLoaing.value=true
-    const { error, code, data,msg } = await getParentList({
+const tableLoaing = ref(false)
+const getTableData = async ()=>{
+    tableLoaing.value = true
+    const { error, code, data, msg } = await getParentList({
         current:searchForm.value.current,
         size:searchForm.value.size,
         type:tabsType.value,
-        code:searchForm.value?.code||'',
-        dictName:searchForm.value?.dictName||'',
+        code:searchForm.value?.code || '',
+        dictName:searchForm.value?.dictName || '',
        
     })
-    tableLoaing.value=false
+    tableLoaing.value = false
     if (!error && code === 200) {
         tableData.value = getArrValue(data['records'])
-        searchForm.value.total=data['total']
+        searchForm.value.total = data['total']
       
-    } 
-    else {
-        tableData.value =[]
+    } else {
+        tableData.value = []
         window.$message?.warning(msg)
     }
 }
@@ -291,95 +279,87 @@ const resetClick = () => {
     getTableData()
    
 }
-const addClick=()=>{
-    formcode.value={}
-    codeModalTitle.value='新增'
-  codeModal.value=true
+const addClick = ()=>{
+    formcode.value = {}
+    codeModalTitle.value = '新增'
+  codeModal.value = true
 }
 //新增一级科目
-const saveparentClick=async()=>{
-    const { error, code, data,msg } = await submitDictionary({
+const saveparentClick = async ()=>{
+    const { error, code, msg } = await submitDictionary({
         type:tabsType.value,
         dictName:formcode.value?.dictName,
         dictValue:formcode.value?.dictValue,
         code:formcode.value?.code,
-        id:formcode.value?.id||null,
-        sort:formcode.value?.sort||null,
+        id:formcode.value?.id || null,
+        sort:formcode.value?.sort || null,
     })
    
     if (!error && code === 200) {
         window.$message?.success(msg)
-        codeModal.value=false
+        codeModal.value = false
         getTableData()
-    } 
-    else {
+    } else {
         window.$message?.warning(msg)
     }
 }
 //新增二级科目
-const configForm=ref({})
-const savechilidClick=async()=>{
-    const { error, code, data,msg } = await submitDictionary({
+const configForm = ref({})
+const savechilidClick = async ()=>{
+    const { error, code, msg } = await submitDictionary({
         type:configItem.value?.type,
         dictName:configForm.value?.dictName,
         dictValue:configForm.value?.dictValue,
-        id:configForm.value?.id||null,
+        id:configForm.value?.id || null,
         code:configForm.value?.code,
         parentId:configItem.value.id,
-        sort:configForm.value?.sort||null,
+        sort:configForm.value?.sort || null,
     })
-    configcodeModal.value=false
+    configcodeModal.value = false
     if (!error && code === 200) {
         window.$message?.success(msg)
       
         getChildListData()
-    } 
-    else {
+    } else {
         window.$message?.warning(msg)
     }
 }
-const batcheditClick=()=>{
-  
-}
-
-
-
 const tableColumn = [
-    {key: 'code', name: '字典编号'},
-    {key: 'dictName', name: '字典名称'},
-    {key: 'dictValue', name: '字典值'},
+    { key: 'code', name: '字典编号' },
+    { key: 'dictName', name: '字典名称' },
+    { key: 'dictValue', name: '字典值' },
 
-    {key: 'action', name: '操作', width:250}
+    { key: 'action', name: '操作', width:250 },
 
 ]
 const tableData = ref([])
-const tableCheckedKeys = ref([]);
+const tableCheckedKeys = ref([])
 const tableSelectionChange = (rows) => {
     tableCheckedKeys.value = rows
   
 }
-const eidtModal=(row)=>{
-    formcode.value=row
-    codeModal.value=true
-    codeModalTitle.value='编辑'
+const eidtModal = (row)=>{
+    formcode.value = row
+    codeModal.value = true
+    codeModalTitle.value = '编辑'
 }
-const delbtnloading=ref(false)
-const delModal=(item)=>{
-    const rows = tableCheckedKeys.value;
+const delbtnloading = ref(false)
+const delModal = (item)=>{
+    const rows = tableCheckedKeys.value
     
     const ids = arrToId(rows)
-    delbtnloading.value=true
+    delbtnloading.value = true
     window?.$messageBox?.alert('您确定要删除该信息吗? 一旦注销数据将彻底清除,请谨慎操作?', '删除提醒', {
             showCancelButton: true,
             confirmButtonText: '确认注销',
             cancelButtonText: '取消',
             type: 'warning',
-            callback: async(action) => {
+            callback: async (action) => {
                 if (action === 'confirm') {
-                        const {error, code, msg} = await removeDictionary({
-                            ids: ids||item.id,
+                        const { error, code, msg } = await removeDictionary({
+                            ids: ids || item.id,
                         })
-                        delbtnloading.value=false
+                        delbtnloading.value = false
                         if (!error && code === 200) {
                             window?.$message?.success('删除成功')
                             getTableData()
@@ -387,96 +367,95 @@ const delModal=(item)=>{
                             window?.$message?.warning(msg)
                         }
                 }
-            }
+            },
         })
 }
 
-const codeModal=ref(false)
-const configcodeModal=ref(false)
-const codeModalTitle=ref('新增')
-const configcodeModalTitle=ref('新增')
-const codeModalClose=()=>{
+const codeModal = ref(false)
+const configcodeModal = ref(false)
+const codeModalTitle = ref('新增')
+const configcodeModalTitle = ref('新增')
+const codeModalClose = ()=>{
    
-    codeModal.value=false
+    codeModal.value = false
 }
-const configcodeModalClose=()=>{
-    configcodeModal.value=false
+const configcodeModalClose = ()=>{
+    configcodeModal.value = false
 }
-const formcode=ref({})
+const formcode = ref({})
 const formUserRules = {
     code: {
         required: true,
-        trigger: "blur",
-        message: "请输入字典编号"
+        trigger: 'blur',
+        message: '请输入字典编号',
     },
     dictName: {
         required: true,
-        trigger: "blur",
-        message: "请输入字典名称"
+        trigger: 'blur',
+        message: '请输入字典名称',
     },
     dictValue:{
         required: true,
-        trigger: "blur",
-        message: "请输入字典值"
+        trigger: 'blur',
+        message: '请输入字典值',
     },
     sort: {
         required: true,
-        trigger: "blur",
-        message: "请输入字典排序"
+        trigger: 'blur',
+        message: '请输入字典排序',
     },
  
 }
-const handleSortChange=(value)=>{
+const handleSortChange = (value)=>{
     console.log(value)
 }
 //字典配置
-const isConfigedit=ref(false)
-const configModalLoading=ref(false)
-const configModal=ref(false)
-const configItem=ref({})
-const configModalclick=(row)=>{
-    configItem.value=row
+const isConfigedit = ref(false)
+const configModalLoading = ref(false)
+const configModal = ref(false)
+const configItem = ref({})
+const configModalclick = (row)=>{
+    configItem.value = row
     getChildListData()
-    configModal.value=true
-    isConfigedit.value=true
+    configModal.value = true
+    isConfigedit.value = true
 }
 //获取二级科目
-const configTableloaing=ref(false)
-const getChildListData=async()=>{
-    configTableloaing.value=true
-    const { error, code, data,msg } = await getChildList({
+const configTableloaing = ref(false)
+const getChildListData = async ()=>{
+    configTableloaing.value = true
+    const { error, code, data, msg } = await getChildList({
         parentId: configItem.value.id,
         type:configItem.value.type,
         dictName:configsearchForm.value?.dictName,
-        code:configsearchForm.value?.code
+        code:configsearchForm.value?.code,
     })
-    configTableloaing.value=false
+    configTableloaing.value = false
     if (!error && code === 200) {
-        configtableData.value=getArrValue(data)
+        configtableData.value = getArrValue(data)
         // tab.value = getArrValue(data['records'])
-    } 
-    else {
-        configtableData.value=[]
+    } else {
+        configtableData.value = []
         window.$message?.warning(msg)
     }
 }
-const closeConfigClick=()=>{
-    configModal.value=false
-    isConfigedit.value=false
+const closeConfigClick = ()=>{
+    configModal.value = false
+    isConfigedit.value = false
 }
 //新增二级字典
-const addchildClick=()=>{
-    configcodeModal.value=true;
-    configForm.value={}
-    configForm.value.parentId=configItem.value.id
-    configForm.value.code=configItem.value.code
-    configcodeModalTitle.value='新增'
+const addchildClick = ()=>{
+    configcodeModal.value = true
+    configForm.value = {}
+    configForm.value.parentId = configItem.value.id
+    configForm.value.code = configItem.value.code
+    configcodeModalTitle.value = '新增'
 
 }
 //搜索表单
 const configsearchForm = ref({
     projectType: null, user: null, project: null,
-    current: 1, size: 20, total: 0
+    current: 1, size: 20, total: 0,
 })
 
 //搜索
@@ -491,15 +470,15 @@ const configresetClick = () => {
 }
 
 const configtableColumn = [
-    {key: 'code', name: '字典编号'},
-    {key: 'dictName', name: '字典名称'},
-    {key: 'dictValue', name: '字典值'},
-    {key: 'action', name: '操作', width:250}
+    { key: 'code', name: '字典编号' },
+    { key: 'dictName', name: '字典名称' },
+    { key: 'dictValue', name: '字典值' },
+    { key: 'action', name: '操作', width:250 },
 
 ]
 
 const configtableData = ref([])
-const configtableCheckedKeys = ref([]);
+const configtableCheckedKeys = ref([])
 const configtableSelectionChange = (rows) => {
     configtableCheckedKeys.value = rows
     if (configtableCheckedKeys.value.length > 1) {
@@ -507,27 +486,27 @@ const configtableSelectionChange = (rows) => {
     }
 }
 
-const configeidtModal=(row)=>{
-    configForm.value=row;
-    configcodeModalTitle.value='编辑'
-    configcodeModal.value=true
+const configeidtModal = (row)=>{
+    configForm.value = row
+    configcodeModalTitle.value = '编辑'
+    configcodeModal.value = true
 }
-const configdelbtnloading=ref(false)
-const configdelClick=(item)=>{
-    const rows = configtableCheckedKeys.value;
+const configdelbtnloading = ref(false)
+const configdelClick = (item)=>{
+    const rows = configtableCheckedKeys.value
     const ids = arrToId(rows)
-    configdelbtnloading.value=true
+    configdelbtnloading.value = true
     window?.$messageBox?.alert('您确定要删除该信息吗? 一旦注销数据将彻底清除,请谨慎操作?', '删除提醒', {
             showCancelButton: true,
             confirmButtonText: '确认注销',
             cancelButtonText: '取消',
             type: 'warning',
-            callback: async(action) => {
+            callback: async (action) => {
                 if (action === 'confirm') {
-                        const {error, code, msg} = await removeDictionary({
-                            ids: ids||item.id,
+                        const { error, code, msg } = await removeDictionary({
+                            ids: ids || item.id,
                         })
-                        configdelbtnloading.value=false
+                        configdelbtnloading.value = false
                         if (!error && code === 200) {
                             window?.$message?.success('删除成功')
                             getChildListData()
@@ -535,11 +514,11 @@ const configdelClick=(item)=>{
                             window?.$message?.warning(msg)
                         }
                 }
-            }
+            },
         })
 }
-
 </script>
+
 <style lang='scss' scoped>
 .header-box{
     display: flex;

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

@@ -5,30 +5,32 @@
                 <template #header>
                     <span class="mr-2">财务预算分类:</span>
                     <el-button _icon hc-btn size="small" type="primary" @click="openpriceEdit(1)">
-                        <HcIcon name="add"/>
+                        <HcIcon name="add" />
                     </el-button>
                 </template>
                 <div> <span class="mt-2">预算一级科目:</span></div>
                 <div class="hc-layout-left-box menu mt-3">
                     <div class="hc-menu-contents-box">
                         <el-scrollbar>
-                            <HcMenuSimple :datas="menuOptions" :keys="menuKey" :props="menusProps"
-                                          :menus="contextMenu" @menuTap="contextMenuClick"
-                                          @change="menuChange"/>
+                            <HcMenuSimple
+                                :datas="menuOptions" :keys="menuKey" :props="menusProps"
+                                :menus="contextMenu" @menu-tap="contextMenuClick"
+                                @change="menuChange"
+                            />
                         </el-scrollbar>
                     </div>
 
-                    <!--预算分类新增编辑弹窗-->
-                    <HcDialog bgColor="#ffffff" widths="22rem" isToBody :show="priceModal" :title="priceTitle" @close="priceModalClose" @save="saveparentClick">
-                        <el-form :model="priceform" label-position="top" label-width="auto" size="large" :rules="priceformRules" ref="priceformref">
+                    <!-- 预算分类新增编辑弹窗 -->
+                    <HcDialog bg-color="#ffffff" widths="22rem" is-to-body :show="priceModal" :title="priceTitle" @close="priceModalClose" @save="saveparentClick">
+                        <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-input v-model="priceform.dictName" />
                             </el-form-item>
                             <el-form-item label="预算一级科目值:" prop="dictValue">
-                                <el-input v-model="priceform.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-input v-model="priceform.sort" oninput="value=value.replace(/[^\d]/g,'')" />
                             </el-form-item>
                         </el-form>
                     </HcDialog>
@@ -36,56 +38,58 @@
             </HcCardItem>
 
             <div class="hc-page-content-box">
-                <HcCardItem ui="hac-card-item" actionSize="lg">
+                <HcCardItem ui="hac-card-item" action-size="lg">
                     <template #header>
                         <span class="mr-2">预算二级科目:</span>
                         <el-button _icon hc-btn size="small" type="primary" @click="openEdit(1)">
-                            <HcIcon name="add"/>
+                            <HcIcon name="add" />
                         </el-button>
                     </template>
-                    <HcTable :column="tableColumn" :datas="tableData"  :isIndex="false" :loading="tableLoaing">
-                        <template #action="{row, index}">
-                            <el-button size="small" type="primary" @click="openEdit(2,row)">编辑</el-button>
-                            <el-button size="small" type="primary" @click="delTask(row)">删除</el-button>
+                    <HcTable :column="tableColumn" :datas="tableData" :is-index="false" :loading="tableLoaing">
+                        <template #action="{ row }">
+                            <el-button size="small" type="primary" @click="openEdit(2, row)">
+                                编辑
+                            </el-button>
+                            <el-button size="small" type="primary" @click="delTask(row)">
+                                删除
+                            </el-button>
                         </template>
                     </HcTable>
 
-                    <!--任务明细弹窗-->
-                    <HcDialog bgColor="#ffffff" widths="24rem" isToBody :show="editTaskModal" :title="taskTitle" @close="testModalClose" @save="savechilidClick">
-                        <el-form label-position="top" label-width="auto" :model="formLabelAlign" size="large" :rules="secondformRules" ref="secondformref">
+                    <!-- 任务明细弹窗 -->
+                    <HcDialog bg-color="#ffffff" widths="24rem" is-to-body :show="editTaskModal" :title="taskTitle" @close="testModalClose" @save="savechilidClick">
+                        <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-input v-model="formLabelAlign.dictName" />
                             </el-form-item>
                             <el-form-item label="预算二级科目值:" prop="dictValue">
-                                <el-input v-model="formLabelAlign.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-input v-model="formLabelAlign.sort" oninput="value=value.replace(/[^\d]/g,'')" />
                             </el-form-item>
                         </el-form>
                     </HcDialog>
-
                 </HcCardItem>
             </div>
         </div>
- 
     </HcCard>
 </template>
 
 <script setup>
-import {onMounted, ref, watch} from "vue";
-import {submitDictionary,removeDictionary,getParentList,getChildList} from '~api/system/parameter.js';
-import {getArrValue,formValidate} from "js-fast-way"
+import { onMounted, ref, watch } from 'vue'
+import { getChildList, getParentList, removeDictionary, submitDictionary } from '~api/system/parameter.js'
+import { formValidate, getArrValue } from 'js-fast-way'
 
 const props = defineProps({
     cur: {
-        type: [String,Number],
-        default: ''
+        type: [String, Number],
+        default: '',
     },
     type:{
-        type: [String,Number],
-        default: ''
-    }
+        type: [String, Number],
+        default: '',
+    },
 })
 
 const tabsKey = ref(props.cur)
@@ -95,7 +99,7 @@ const tabsType = ref(props.type)
 watch(() => [
     props.cur,
     props.type,
-], ([key,type]) => {
+], ([key, type]) => {
     tabsKey.value = key
     tabsType.value = type
    
@@ -109,49 +113,49 @@ onMounted(() => {
 
 //左侧菜单
 const menuKey = ref('')
-const menuOptions = ref([]);
-const menuItem=ref({})
+const menuOptions = ref([])
+const menuItem = ref({})
 const menuChange = (item) => {
     console.log(item)
     menuKey.value = item?.id
-    menuItem.value=item
+    menuItem.value = item
     getChildListData()
 }
 const menusProps = ref({
     key: 'id',
-    label: 'dictName'
+    label: 'dictName',
 })
 
 //菜单的右键菜单
 const contextMenu = ref([])
 const setContextMenu = () => {
-    let newArr = [];
-    newArr.push({icon: 'draft', label: '编辑分类', key: "edit"})
-    newArr.push({icon: 'delete-bin', label: '删除分类', key: "del"})
+    let newArr = []
+    newArr.push({ icon: 'draft', label: '编辑分类', key: 'edit' })
+    newArr.push({ icon: 'delete-bin', label: '删除分类', key: 'del' })
 
     contextMenu.value = newArr
 }
 
 //菜单的右键菜单被点击
-const contextMenuClick = ({key, item}) => {
-    console.log(item,'item');
+const contextMenuClick = ({ key, item }) => {
+    console.log(item, 'item')
     menuKey.value = item?.id
   
     if (key === 'edit') {
         openpriceEdit(2)
         menuKey.value = item?.id
-        priceform.value.dictName=item.dictName
-        priceform.value.dictValue=item.dictValue
-        priceform.value.sort=item.sort
+        priceform.value.dictName = item.dictName
+        priceform.value.dictValue = item.dictValue
+        priceform.value.sort = item.sort
     } else if (key === 'del') {
         window?.$messageBox?.alert('您确定要删除该预算分类信息吗? 一旦注销数据将彻底清除,请谨慎操作?', '删除提醒', {
             showCancelButton: true,
             confirmButtonText: '确认注销',
             cancelButtonText: '取消',
             type: 'warning',
-            callback: async(action) => {
+            callback: async (action) => {
                 if (action === 'confirm') {
-                        const {error, code, msg} = await removeDictionary({
+                        const { error, code, msg } = await removeDictionary({
                             ids: item?.id,
                         })
                         if (!error && code === 200) {
@@ -161,7 +165,7 @@ const contextMenuClick = ({key, item}) => {
                             window?.$message?.warning(msg)
                         }
                 }
-            }
+            },
         })
     }
 }
@@ -171,8 +175,8 @@ const priceModal = ref(false)
 const openpriceEdit = (type) => {
     if (type === 1) {
         priceTitle.value = '新增分类'
-        priceform.value={}
-        menuKey.value=''
+        priceform.value = {}
+        menuKey.value = ''
     } else {
         priceTitle.value = '编辑分类'
     }
@@ -181,25 +185,25 @@ const openpriceEdit = (type) => {
 }
 const priceformRules = {
     dictName: [
-        {required: true, message: '请输入名称', trigger: 'blur'},
+        { required: true, message: '请输入名称', trigger: 'blur' },
     ],
     sort: [
-        {required: false, message: '请输入序号', trigger: 'blur'},
+        { required: false, message: '请输入序号', trigger: 'blur' },
     ],
     dictValue: [
-        {required: true, message: '请输入字典值', trigger: 'blur'},
+        { required: true, message: '请输入字典值', trigger: 'blur' },
     ],
 
 }
-const secondformRules={
+const secondformRules = {
     dictName: [
-        {required: true, message: '请输入名称', trigger: 'blur'},
+        { required: true, message: '请输入名称', trigger: 'blur' },
     ],
     sort: [
-        {required: true, message: '请输入序号', trigger: 'blur'},
+        { required: true, message: '请输入序号', trigger: 'blur' },
     ],
     dictValue: [
-        {required: true, message: '请输入字典值', trigger: 'blur'},
+        { required: true, message: '请输入字典值', trigger: 'blur' },
     ],
 
 }
@@ -209,25 +213,25 @@ const priceModalClose = () => {
 }
 
 const taskTitle = ref('')
-const openEdit = (type,row) => {
+const openEdit = (type, row) => {
     
     if (type === 1) {
-        formLabelAlign.value.dictName=''
-        formLabelAlign.value.id=''
-        formLabelAlign.value.dictValue=''
-        formLabelAlign.value.sort=''
+        formLabelAlign.value.dictName = ''
+        formLabelAlign.value.id = ''
+        formLabelAlign.value.dictValue = ''
+        formLabelAlign.value.sort = ''
         taskTitle.value = '新增'
     } else {
-        formLabelAlign.value.dictName=row.dictName
-        formLabelAlign.value.id=row.id
-        formLabelAlign.value.dictValue=row.dictValue
-        formLabelAlign.value.sort=row.sort
+        formLabelAlign.value.dictName = row.dictName
+        formLabelAlign.value.id = row.id
+        formLabelAlign.value.dictValue = row.dictValue
+        formLabelAlign.value.sort = row.sort
         taskTitle.value = '编辑'
     }
-    if(menuKey.value){
+    if (menuKey.value) {
        
         editTaskModal.value = true
-    }else{
+    } else {
         window.$message.warning('请先选择一级科目')
     }
    
@@ -245,9 +249,9 @@ const delTask = (item) => {
             confirmButtonText: '确认注销',
             cancelButtonText: '取消',
             type: 'warning',
-            callback: async(action) => {
+            callback: async (action) => {
                 if (action === 'confirm') {
-                        const {error, code, msg} = await removeDictionary({
+                        const { error, code, msg } = await removeDictionary({
                             ids: item?.id,
                         })
                         if (!error && code === 200) {
@@ -257,106 +261,102 @@ const delTask = (item) => {
                             window?.$message?.warning(msg)
                         }
                 }
-            }
+            },
         })
 }
 
 const tableColumn = [
-    {key: 'dictName', name: '预算二级科目',align:'center'},
+    { key: 'dictName', name: '预算二级科目', align:'center' },
     // {key: 'text', name: '任务内容'},
     // {key: 'color', name: '完成指标'},
-    {key: 'action', name: '操作', width: 200}
+    { key: 'action', name: '操作', width: 200 },
 ]
 const tableData = ref([])
-const tableLoaing=ref(false)
+const tableLoaing = ref(false)
 const formLabelAlign = ref({
     name: '',
     region: '',
     type: '',
 })
 
-const priceformref=ref(null)
+const priceformref = ref(null)
 //新增一级科目
-const saveparentClick=async()=>{
+const saveparentClick = async ()=>{
     const res = await formValidate(priceformref.value)
-    if(res){
-        console.log(res,'res');
-        const { error, code, data,msg } = await submitDictionary({
+    if (res) {
+        console.log(res, 'res')
+        const { error, code, msg } = await submitDictionary({
             type:tabsType.value,
             dictName:priceform.value?.dictName,
             dictValue:priceform.value?.dictValue,
-            id:menuKey.value||null,
+            id:menuKey.value || null,
             sort:priceform.value?.sort,
         })
     
         if (!error && code === 200) {
             window.$message?.success(msg)
-            priceModal.value=false
+            priceModal.value = false
             getParentListData()
-        } 
-        else {
+        } else {
             window.$message?.warning(msg)
         }
     }
   
 }
-const secondformref=ref(null)
+const secondformref = ref(null)
 //新增二级级科目
-const savechilidClick=async()=>{
+const savechilidClick = async ()=>{
     const res = await formValidate(secondformref.value)
-    if(res){
-        const { error, code, data,msg } = await submitDictionary({
+    if (res) {
+        const { error, code, msg } = await submitDictionary({
             type:tabsType.value,
             dictName:formLabelAlign.value?.dictName,
             dictValue:formLabelAlign.value?.dictValue,
             sort:formLabelAlign.value?.sort,
-            id:formLabelAlign.value.id||null,
-            parentId:menuKey.value
+            id:formLabelAlign.value.id || null,
+            parentId:menuKey.value,
         })
     
         if (!error && code === 200) {
             window.$message?.success(msg)
-            editTaskModal.value=false
+            editTaskModal.value = false
             getChildListData()
-        } 
-        else {
+        } else {
             window.$message?.warning(msg)
         }
     }
 
 }
 //获取一级科目
-const getParentListData=async()=>{
-    const { error, code, data,msg } = await getParentList({
+const getParentListData = async ()=>{
+    const { error, code, data, msg } = await getParentList({
         type:tabsType.value,
        
     })
     if (!error && code === 200) {
         menuOptions.value = getArrValue(data['records'])
-        if( menuOptions.value.length>0){
-            menuKey.value= menuOptions.value[0]?.id
-            menuItem.value.id =   menuOptions.value[0]?.id
+        if ( menuOptions.value.length > 0) {
+            menuKey.value = menuOptions.value[0]?.id
+            menuItem.value.id = menuOptions.value[0]?.id
             getChildListData()
         }
-    } 
-    else {
-        menuOptions.value =[]
+    } else {
+        menuOptions.value = []
         window.$message?.warning(msg)
     }
 }
 //获取二级科目
-const getChildListData=async()=>{
-    tableLoaing.value=true
-    const { error, code, data,msg } = await getChildList({
+const getChildListData = async ()=>{
+    tableLoaing.value = true
+    const { error, code, data, msg } = await getChildList({
         parentId: menuItem.value.id,
         type:1,
     })
-    tableLoaing.value=false
+    tableLoaing.value = false
     if (!error && code === 200) {
-        tableData.value=getArrValue(data)
+        tableData.value = getArrValue(data)
         // tab.value = getArrValue(data['records'])
-    } 
-    else {
+    } else {
         window.$message?.warning(msg)
     }
 }

+ 44 - 42
src/views/system/components/tab-price.vue

@@ -3,23 +3,27 @@
         <template #header>
             <span class="mr-2">岗位单价:</span>
             <el-button _icon hc-btn size="small" type="primary" @click="positionEdit(1)">
-                <HcIcon name="add"/>
+                <HcIcon name="add" />
             </el-button>
         </template>
         <HcTable :column="positiontableColumn" :datas="positiontableData">
-            <template #action="{row, index}">
-                <el-button size="small" type="primary" @click="positionEdit(2,row)">编辑</el-button>
-                <el-button size="small" type="primary" @click="delTaskposition(row)">删除</el-button>
+            <template #action="{ row }">
+                <el-button size="small" type="primary" @click="positionEdit(2, row)">
+                    编辑
+                </el-button>
+                <el-button size="small" type="primary" @click="delTaskposition(row)">
+                    删除
+                </el-button>
             </template>
         </HcTable>
 
-        <HcDialog bgColor="#ffffff" isToBody widths="24rem" :show="positonModal" :title="positonModalTitle" @close="positonModalClose" @save="savepositionClick">
+        <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-input v-model="formposition.dictName"/>
+                    <el-input v-model="formposition.dictName" />
                 </el-form-item>
                 <el-form-item label="日单价:">
-                    <el-input v-model="formposition.dictValue" onkeyup="this.value=this.value.match(/\d+\.?\d{0,2}/)"/>
+                    <el-input v-model="formposition.dictValue" onkeyup="this.value=this.value.match(/\d+\.?\d{0,2}/)" />
                     <!-- <el-input-number v-model="formposition.dictValue" :precision="2" controls-position="right" style="width: 100%;"/> -->
                 </el-form-item>
             </el-form>
@@ -28,18 +32,18 @@
 </template>
 
 <script setup>
-import {ref, watch,onMounted} from "vue";
-import {submitDictionary,removeDictionary,getParentList,getChildList} from '~api/system/parameter.js';
-import {getArrValue} from "js-fast-way"
+import { onMounted, ref, watch } from 'vue'
+import { getParentList, removeDictionary, submitDictionary } from '~api/system/parameter.js'
+import { getArrValue } from 'js-fast-way'
 const props = defineProps({
     cur: {
-        type: [String,Number],
-        default: ''
+        type: [String, Number],
+        default: '',
     },
     type:{
-        type: [String,Number],
-        default: ''
-    }
+        type: [String, Number],
+        default: '',
+    },
 })
 
 const tabsKey = ref(props.cur)
@@ -49,7 +53,7 @@ const tabsType = ref(props.type)
 watch(() => [
     props.cur,
     props.type,
-], ([key,type]) => {
+], ([key, type]) => {
     tabsKey.value = key
     tabsType.value = type
 })
@@ -58,19 +62,18 @@ onMounted(() => {
     getParentListData()
    
 })
-const tableLoaing=ref(false)
-const getParentListData=async()=>{
-    tableLoaing.value=true
-    const { error, code, data,msg } = await getParentList({
+const tableLoaing = ref(false)
+const getParentListData = async ()=>{
+    tableLoaing.value = true
+    const { error, code, data, msg } = await getParentList({
         type:tabsType.value,
     })
-    tableLoaing.value=false
+    tableLoaing.value = false
     if (!error && code === 200) {
         positiontableData.value = getArrValue(data['records'])
        
-    } 
-    else {
-        positiontableData.value=[]
+    } else {
+        positiontableData.value = []
         window.$message?.warning(msg)
     }
 }
@@ -80,9 +83,9 @@ const getParentListData=async()=>{
 
 
 const positiontableColumn = [
-    {key: 'dictName', name: '岗位类型名称'},
-    {key: 'dictValue', name: '日单价'},
-    {key: 'action', name: '操作', width: 200}
+    { key: 'dictName', name: '岗位类型名称' },
+    { key: 'dictValue', name: '日单价' },
+    { key: 'action', name: '操作', width: 200 },
 ]
 
 
@@ -90,16 +93,16 @@ const positiontableData = ref([])
 
 const positonModal = ref(false)
 const positonModalTitle = ref('')
-const editItem=ref({})
-const positionEdit = (type,row) => {
+const editItem = ref({})
+const positionEdit = (type, row) => {
     if (type === 1) {
         positonModalTitle.value = '新增岗位类型'
-        formposition.value={}
-        editItem.value={}
+        formposition.value = {}
+        editItem.value = {}
     } else {
         positonModalTitle.value = '编辑岗位类型'
-        editItem.value=row
-        formposition.value=row
+        editItem.value = row
+        formposition.value = row
     }
     positonModal.value = true
 }
@@ -110,20 +113,19 @@ const positonModalClose = () => {
 
 const formposition = ref({})
 //新增编辑提交
-const savepositionClick=async()=>{
-    const { error, code, data,msg } = await submitDictionary({
+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
+        id:editItem.value.id || null,
       
     })
-    positonModal.value=false
+    positonModal.value = false
     if (!error && code === 200) {
         window.$message?.success(msg)
         getParentListData()
-    } 
-    else {
+    } else {
         window.$message?.warning(msg)
     }
 }
@@ -133,9 +135,9 @@ const delTaskposition = (row) => {
             confirmButtonText: '确认注销',
             cancelButtonText: '取消',
             type: 'warning',
-            callback: async(action) => {
+            callback: async (action) => {
                 if (action === 'confirm') {
-                        const {error, code, msg} = await removeDictionary({
+                        const { error, code, msg } = await removeDictionary({
                             ids: row?.id,
                         })
                         if (!error && code === 200) {
@@ -145,7 +147,7 @@ const delTaskposition = (row) => {
                             window?.$message?.warning(msg)
                         }
                 }
-            }
+            },
     })
 }
 </script>

+ 42 - 41
src/views/system/components/tab-reimbursement.vue

@@ -3,40 +3,43 @@
         <template #header>
             <span class="mr-2">报销类型:</span>
             <el-button _icon hc-btn size="small" type="primary" @click="positionEdit(1)">
-                <HcIcon name="add"/>
+                <HcIcon name="add" />
             </el-button>
         </template>
         <HcTable :column="positiontableColumn" :datas="positiontableData" :loading="tableLoaing">
-            <template #action="{row, index}">
-                <el-button size="small" type="primary" @click="positionEdit(2,row)">编辑</el-button>
-                <el-button size="small" type="primary" @click="delTaskposition(row)">删除</el-button>
+            <template #action="{ row }">
+                <el-button size="small" type="primary" @click="positionEdit(2, row)">
+                    编辑
+                </el-button>
+                <el-button size="small" type="primary" @click="delTaskposition(row)">
+                    删除
+                </el-button>
             </template>
         </HcTable>
    
-        <HcDialog bgColor="#ffffff" isToBody widths="24rem" :show="positonModal" :title="positonModalTitle" @close="positonModalClose" @save="savepositionClick">
+        <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-input v-model="formposition.dictName"/>
+                    <el-input v-model="formposition.dictName" />
                 </el-form-item>
-        
             </el-form>
         </HcDialog>
     </HcCard>
 </template>
 
 <script setup>
-import {ref, watch,onMounted} from "vue";
-import {submitDictionary,removeDictionary,getParentList,getChildList} from '~api/system/parameter.js';
-import {getArrValue} from "js-fast-way"
+import { onMounted, ref, watch } from 'vue'
+import { getParentList, removeDictionary, submitDictionary } from '~api/system/parameter.js'
+import { getArrValue } from 'js-fast-way'
 const props = defineProps({
     cur: {
-        type: [String,Number],
-        default: ''
+        type: [String, Number],
+        default: '',
     },
     type:{
-        type: [String,Number],
-        default: ''
-    }
+        type: [String, Number],
+        default: '',
+    },
 })
 
 const tabsKey = ref(props.cur)
@@ -46,7 +49,7 @@ const tabsType = ref(props.type)
 watch(() => [
     props.cur,
     props.type,
-], ([key,type]) => {
+], ([key, type]) => {
     tabsKey.value = key
     tabsType.value = type
 })
@@ -55,19 +58,18 @@ onMounted(() => {
     getParentListData()
    
 })
-const tableLoaing=ref(false)
-const getParentListData=async()=>{
-    tableLoaing.value=true
-    const { error, code, data,msg } = await getParentList({
+const tableLoaing = ref(false)
+const getParentListData = async ()=>{
+    tableLoaing.value = true
+    const { error, code, data, msg } = await getParentList({
         type:tabsType.value,
     })
-    tableLoaing.value=false
+    tableLoaing.value = false
     if (!error && code === 200) {
         positiontableData.value = getArrValue(data['records'])
        
-    } 
-    else {
-        positiontableData.value=[]
+    } else {
+        positiontableData.value = []
         window.$message?.warning(msg)
     }
 }
@@ -76,8 +78,8 @@ const getParentListData=async()=>{
 
 
 const positiontableColumn = [
-    {key: 'dictName', name: '报销类型名称'},
-    {key: 'action', name: '操作', width: 200}
+    { key: 'dictName', name: '报销类型名称' },
+    { key: 'action', name: '操作', width: 200 },
 ]
 
 
@@ -87,16 +89,16 @@ const positiontableData = ref([
 
 const positonModal = ref(false)
 const positonModalTitle = ref('')
-const editItem=ref({})
-const positionEdit = (type,row) => {
+const editItem = ref({})
+const positionEdit = (type, row) => {
     if (type === 1) {
         positonModalTitle.value = '新增报销类型'
-        formposition.value={}
-        editItem.value={}
+        formposition.value = {}
+        editItem.value = {}
     } else {
         positonModalTitle.value = '编辑报销类型'
-        editItem.value=row
-        formposition.value=row
+        editItem.value = row
+        formposition.value = row
     }
     positonModal.value = true
 }
@@ -109,20 +111,19 @@ const positonModalClose = () => {
 const formposition = ref({})
 
 //新增编辑提交
-const savepositionClick=async()=>{
-    const { error, code, data,msg } = await submitDictionary({
+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
+        id:editItem.value.id || null,
       
     })
-    positonModal.value=false
+    positonModal.value = false
     if (!error && code === 200) {
         window.$message?.success(msg)
         getParentListData()
-    } 
-    else {
+    } else {
         window.$message?.warning(msg)
     }
 }
@@ -132,9 +133,9 @@ const delTaskposition = (row) => {
             confirmButtonText: '确认注销',
             cancelButtonText: '取消',
             type: 'warning',
-            callback: async(action) => {
+            callback: async (action) => {
                 if (action === 'confirm') {
-                        const {error, code, msg} = await removeDictionary({
+                        const { error, code, msg } = await removeDictionary({
                             ids: row?.id,
                         })
                         if (!error && code === 200) {
@@ -144,7 +145,7 @@ const delTaskposition = (row) => {
                             window?.$message?.warning(msg)
                         }
                 }
-            }
+            },
     })
 }
 </script>

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

@@ -3,56 +3,58 @@
         <template #header>
             <span class="mr-2">任务分类:</span>
             <el-button _icon hc-btn size="small" type="primary" @click="openTypeEdit(1)">
-                <HcIcon name="add"/>
+                <HcIcon name="add" />
             </el-button>
         </template>
         <HcTable :column="tasktableColumn" :datas="tasktableData" :loading="tableLoaing">
-            <template #dictValue="{row}">
-                        <div >{{row?.dictValue===1?'固定任务':'临时任务'}}</div>
+            <template #dictValue="{ row }">
+                <div>{{ row?.dictValue === 1 ? '固定任务' : '临时任务' }}</div>
             </template>
-            <template #action="{row, index}">
-                <el-button size="small" type="primary" @click="openTypeEdit(2,row)">编辑</el-button>
-                <el-button size="small" type="primary" @click="delTasktype(row)">删除</el-button>
+            <template #action="{ row }">
+                <el-button size="small" type="primary" @click="openTypeEdit(2, row)">
+                    编辑
+                </el-button>
+                <el-button size="small" type="primary" @click="delTasktype(row)">
+                    删除
+                </el-button>
             </template>
         </HcTable>
      
 
-        <!--任务类型弹窗-->
-        <HcDialog bgColor="#ffffff" isToBody widths="24rem" :show="tasktypeModal" :title="taskTypeTitle" @close="taskTypeModalClose" @save="saveparentClick">
+        <!-- 任务类型弹窗 -->
+        <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-input v-model="formtaskType.dictName"/>
+                    <el-input v-model="formtaskType.dictName" />
                 </el-form-item>
                 <el-form-item label="类型">
                     <el-select v-model="formtaskType.dictValue" class="block" placeholder="请选择">
-                        <el-option v-for="item in typeoptions"  :label="item.name" :value="item.value"/>
+                        <el-option v-for="item in typeoptions" :key="item.value" :label="item.name" :value="item.value" />
                     </el-select>
                 </el-form-item>
             </el-form>
         </HcDialog>
-
     </HcCard>
 </template>
 
 <script setup>
-import {onMounted, ref, watch} from "vue";
-import {submitDictionary,removeDictionary,getParentList,getChildList} from '~api/system/parameter.js';
-import {getArrValue} from "js-fast-way"
-onMounted(() => {
-    getParentListData()
-   
-})
+import { onMounted, ref, watch } from 'vue'
+import { getParentList, removeDictionary, submitDictionary } from '~api/system/parameter.js'
+import { getArrValue } from 'js-fast-way'
 const props = defineProps({
     cur: {
-        type: [String,Number],
-        default: ''
+        type: [String, Number],
+        default: '',
     },
     type:{
-        type: [String,Number],
-        default: ''
-    }
+        type: [String, Number],
+        default: '',
+    },
+})
+onMounted(() => {
+    getParentListData()
+   
 })
-
 const tabsKey = ref(props.cur)
 const tabsType = ref(props.type)
 
@@ -60,7 +62,7 @@ const tabsType = ref(props.type)
 watch(() => [
     props.cur,
     props.type,
-], ([key,type]) => {
+], ([key, type]) => {
     tabsKey.value = key
     tabsType.value = type
     console.log(key)
@@ -68,59 +70,57 @@ watch(() => [
 
 
 const tasktableColumn = [
-    {key: 'dictName', name: '任务类型名称'},
-    {key: 'dictValue', name: '类型'},
-    {key: 'action', name: '操作', width: 200}
+    { key: 'dictName', name: '任务类型名称' },
+    { key: 'dictValue', name: '类型' },
+    { key: 'action', name: '操作', width: 200 },
 ]
 const tasktableData = ref([])
 
 const taskTypeTitle = ref('')
 const tasktypeModal = ref(false)
-const editItem=ref({})
-const openTypeEdit = (type,row) => {
+const editItem = ref({})
+const openTypeEdit = (type, row) => {
     if (type === 1) {
         taskTypeTitle.value = '新增任务'
-        formtaskType.value={}
-        editItem.value={}
+        formtaskType.value = {}
+        editItem.value = {}
     } else {
         taskTypeTitle.value = '编辑任务'
-        editItem.value=row
-        formtaskType.value=row
+        editItem.value = row
+        formtaskType.value = row
     }
     tasktypeModal.value = true
 }
 
 //新增一级科目
-const saveparentClick=async()=>{
-    const { error, code, data,msg } = await submitDictionary({
+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
+        id:editItem.value.id || null,
       
     })
-    tasktypeModal.value=false
+    tasktypeModal.value = false
     if (!error && code === 200) {
         window.$message?.success(msg)
         getParentListData()
-    } 
-    else {
+    } else {
         window.$message?.warning(msg)
     }
 }
-const tableLoaing=ref(false)
-const getParentListData=async()=>{
-    tableLoaing.value=true
-    const { error, code, data,msg } = await getParentList({
+const tableLoaing = ref(false)
+const getParentListData = async ()=>{
+    tableLoaing.value = true
+    const { error, code, data, msg } = await getParentList({
         type:tabsType.value,
     })
-    tableLoaing.value=false
+    tableLoaing.value = false
     if (!error && code === 200) {
         tasktableData.value = getArrValue(data['records'])
        
-    } 
-    else {
-        tasktableData.value=[]
+    } else {
+        tasktableData.value = []
         window.$message?.warning(msg)
     }
 }
@@ -146,9 +146,9 @@ const delTasktype = (item) => {
             confirmButtonText: '确认注销',
             cancelButtonText: '取消',
             type: 'warning',
-            callback: async(action) => {
+            callback: async (action) => {
                 if (action === 'confirm') {
-                        const {error, code, msg} = await removeDictionary({
+                        const { error, code, msg } = await removeDictionary({
                             ids: item?.id,
                         })
                         if (!error && code === 200) {
@@ -158,7 +158,7 @@ const delTasktype = (item) => {
                             window?.$message?.warning(msg)
                         }
                 }
-            }
+            },
         })
 }
 </script>

+ 66 - 54
src/views/system/menu.vue

@@ -2,66 +2,74 @@
     <HcCard>
         <template #header>
             <div class="w-64">
-                <el-input v-model="searchForm.name" size="large" placeholder="请输入菜单名称搜索" clearable/>
+                <el-input v-model="searchForm.name" size="large" placeholder="请输入菜单名称搜索" clearable />
             </div>
             <div class="ml-3">
-                <el-button type="primary" @click="getTableData" size="large">
-                    <HcIcon name="search-2"/>
+                <el-button type="primary" size="large" @click="getTableData">
+                    <HcIcon name="search-2" />
                     <span>搜索</span>
                 </el-button>
             </div>
         </template>
         <template #extra>
-            <el-button type="primary" @click="addMenu" size="large" v-auth-btn="['system_menu_add_btn']">
-                <HcIcon name="add"/>
+            <el-button v-auth-btn="['system_menu_add_btn']" type="primary" size="large" @click="addMenu">
+                <HcIcon name="add" />
                 <span>新增</span>
             </el-button>
-            <el-button type="danger" @click="deleteClick" size="large" :disabled="!tableCheckedKeys" v-auth-btn="['system_menu_del_btn']">
-                <HcIcon name="delete-bin-2"/>
+            <el-button v-auth-btn="['system_menu_del_btn']" type="danger" size="large" :disabled="!tableCheckedKeys" @click="deleteClick">
+                <HcIcon name="delete-bin-2" />
                 <span>删除</span>
             </el-button>
         </template>
-        <HcTable ui="no-border" border hasChildren="hasChildren1" :isIndex="false" isCheck
-                 :column="tableColumn" :datas="tableData" @selection-change="tableSelectionChange"
+        <HcTable
+            ui="no-border" border has-children="hasChildren1" :is-index="false" is-check
+            :column="tableColumn" :datas="tableData" @selection-change="tableSelectionChange"
         >
-            <template #name="{row}">
-                <i :class="[`ri-${row?.source}`]" class="hc-icon-i table-menu-icon" v-if="row.source"/>
-                <span>{{row.name}}</span>
+            <template #name="{ row }">
+                <i v-if="row.source" :class="[`ri-${row?.source}`]" class="hc-icon-i table-menu-icon" />
+                <span>{{ row.name }}</span>
             </template>
-            <template #category="{row}">
+            <template #category="{ row }">
                 <span v-if="row.category === 1">菜单</span>
                 <span v-if="row.category === 2">按钮</span>
             </template>
-            <template #action="{row, index}">
-                <el-button size="small" type="primary" @click="eidtMenu(row)" v-auth-btn="['system_menu_edit_btn']">编辑</el-button>
-                <el-button size="small" type="success" @click="addChildren(row)" v-auth-btn="['system_menu_add_children_btn']">新增子项</el-button>
-                <el-button size="small" type="warning" @click="copyChildren(row)" v-auth-btn="['system_menu_copy_btn']">复制</el-button>
+            <template #action="{ row }">
+                <el-button v-auth-btn="['system_menu_edit_btn']" size="small" type="primary" @click="eidtMenu(row)">
+                    编辑
+                </el-button>
+                <el-button v-auth-btn="['system_menu_add_children_btn']" size="small" type="success" @click="addChildren(row)">
+                    新增子项
+                </el-button>
+                <el-button v-auth-btn="['system_menu_copy_btn']" size="small" type="warning" @click="copyChildren(row)">
+                    复制
+                </el-button>
             </template>
         </HcTable>
 
-        <!--菜单新增编辑-->
-        <HcDialog bgColor="#ffffff" isToBody widths="60rem" :title="isCopy?'复制菜单数据':formModel.id?'编辑菜单':'修改菜单'"
-                  :show="menuDataModal" @save="menuDataModalSave" @close="menuDataModalClose"
+        <!-- 菜单新增编辑 -->
+        <HcDialog
+            bg-color="#ffffff" is-to-body widths="60rem" :title="isCopy ? '复制菜单数据' : formModel.id ? '编辑菜单' : '修改菜单'"
+            :show="menuDataModal" @save="menuDataModalSave" @close="menuDataModalClose"
         >
             <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="left" label-width="auto" size="large">
                 <el-row :gutter="20">
                     <el-col :span="12">
                         <el-form-item label="菜单名称:" prop="name">
-                            <el-input v-model="formModel.name" placeholder="六字以内的名称"/>
+                            <el-input v-model="formModel.name" placeholder="六字以内的名称" />
                         </el-form-item>
                         <el-form-item label="路由地址:" prop="path">
-                            <el-input v-model="formModel.path" placeholder="url上显示的地址"/>
+                            <el-input v-model="formModel.path" placeholder="url上显示的地址" />
                         </el-form-item>
                         <el-form-item label="菜单编号:" prop="code">
-                            <el-input v-model="formModel.code" placeholder="路由中的跳转name"/>
+                            <el-input v-model="formModel.code" placeholder="路由中的跳转name" />
                         </el-form-item>
                         <el-form-item label="菜单备注:">
-                            <el-input v-model="formModel.remark"/>
+                            <el-input v-model="formModel.remark" />
                         </el-form-item>
                     </el-col>
                     <el-col :span="12">
                         <el-form-item label="上级菜单:">
-                            <el-cascader v-model="formModel.parentId" :options="tableData" :props="topMenuoptions" clearable/>
+                            <el-cascader v-model="formModel.parentId" :options="tableData" :props="topMenuoptions" clearable />
                         </el-form-item>
                         <el-form-item label="菜单图标:">
                             <el-input v-model="formModel.source" placeholder="图标库为 ">
@@ -71,12 +79,16 @@
                             </el-input>
                         </el-form-item>
                         <el-form-item label="菜单排序:">
-                            <el-input-number v-model="formModel.sort" :min="1" :max="10" controls-position="right"/>
+                            <el-input-number v-model="formModel.sort" :min="1" :max="10" controls-position="right" />
                         </el-form-item>
                         <el-form-item label="菜单类型:">
                             <el-radio-group v-model="formModel.category">
-                                <el-radio :label="1">菜单</el-radio>
-                                <el-radio :label="2" class="ml-6">按钮</el-radio>
+                                <el-radio :label="1">
+                                    菜单
+                                </el-radio>
+                                <el-radio :label="2" class="ml-6">
+                                    按钮
+                                </el-radio>
                             </el-radio-group>
                         </el-form-item>
                     </el-col>
@@ -87,11 +99,11 @@
 </template>
 
 <script setup>
-import {onActivated, ref} from "vue";
-import mainApi from "~api/system/menu";
-import {arrToId, formValidate, getArrValue} from "js-fast-way";
-import config from "~src/config/index";
-import {delMessage} from "~uti/tools";
+import { onActivated, ref } from 'vue'
+import mainApi from '~api/system/menu'
+import { arrToId, formValidate, getArrValue } from 'js-fast-way'
+import config from '~src/config/index'
+import { delMessage } from '~uti/tools'
 
 //页面被激活时
 onActivated(() => {
@@ -99,19 +111,19 @@ onActivated(() => {
 })
 
 //菜单数据
-const searchForm = ref({name: '', parentId: ''})
+const searchForm = ref({ name: '', parentId: '' })
 const tableColumn = [
-    {key: 'name', name: '菜单名称', minWidth: 260},
-    {key: 'code', name: '菜单编号', width: 240},
-    {key: 'path', name: '路由地址', minWidth: 220},
-    {key: 'category', name: '菜单类型', width: 90, align: 'center'},
-    {key: 'sort', name: '排序', width: 80, align: 'center' },
-    {key: 'remark', name: '菜单备注', minWidth: 200},
-    {key: 'action', name: '操作', width: 240, fixed: 'right', align: 'center'}
+    { key: 'name', name: '菜单名称', minWidth: 260 },
+    { key: 'code', name: '菜单编号', width: 240 },
+    { key: 'path', name: '路由地址', minWidth: 220 },
+    { key: 'category', name: '菜单类型', width: 90, align: 'center' },
+    { key: 'sort', name: '排序', width: 80, align: 'center' },
+    { key: 'remark', name: '菜单备注', minWidth: 200 },
+    { key: 'action', name: '操作', width: 240, fixed: 'right', align: 'center' },
 ]
 const tableData = ref([])
 const getTableData = async () => {
-    const {error, code, data} = await mainApi.lazyList(searchForm.value)
+    const { error, code, data } = await mainApi.lazyList(searchForm.value)
     if (!error && code === 200) {
         tableData.value = getArrValue(data)
     } else {
@@ -120,7 +132,7 @@ const getTableData = async () => {
 }
 
 //多选
-const tableCheckedKeys = ref('');
+const tableCheckedKeys = ref('')
 const tableSelectionChange = (rows) => {
     tableCheckedKeys.value = arrToId(rows)
 }
@@ -137,7 +149,7 @@ const deleteClick = () => {
 }
 //删除请求
 const deleteApi = async (ids) => {
-    const {error, code, msg} = await mainApi.remove(ids)
+    const { error, code, msg } = await mainApi.remove(ids)
     if (!error && code === 200) {
         window.$message.success('删除成功')
         getTableData().then()
@@ -149,11 +161,11 @@ const deleteApi = async (ids) => {
 //菜单数据弹窗
 const menuDataModal = ref(false)
 const formRef = ref(null)
-const formModel = ref({category: 1})
+const formModel = ref({ category: 1 })
 const formRules = {
-    name: {required: true, trigger: 'blur', message: "请输入菜单名称"},
-    path: {required: true, trigger: 'blur', message: "请输入路由地址"},
-    code: {required: true, trigger: 'blur', message: "请输入菜单编号"}
+    name: { required: true, trigger: 'blur', message: '请输入菜单名称' },
+    path: { required: true, trigger: 'blur', message: '请输入路由地址' },
+    code: { required: true, trigger: 'blur', message: '请输入菜单编号' },
 }
 const topMenuoptions = {
     checkStrictly: true,
@@ -170,7 +182,7 @@ const addMenu = () => {
         isLayout: 1,
         category: 1,
         parentId: 0,
-        sort: 1
+        sort: 1,
     }
     isCopy.value = false
     menuDataModal.value = true
@@ -180,7 +192,7 @@ const addMenu = () => {
 const eidtMenu = (row) => {
     formModel.value = {
         ...row,
-        children: null
+        children: null,
     }
     isCopy.value = false
     menuDataModal.value = true
@@ -194,7 +206,7 @@ const addChildren = (row) => {
         isLayout: 1,
         category: 1,
         parentId: row.id,
-        sort: 1
+        sort: 1,
     }
     isCopy.value = false
     menuDataModal.value = true
@@ -206,7 +218,7 @@ const copyChildren = (row) => {
     formModel.value = {
         ...row,
         children: null,
-        id: ''
+        id: '',
     }
     isCopy.value = true
     menuDataModal.value = true
@@ -217,9 +229,9 @@ const menuDataModalSave = async () => {
     const isForm = await formValidate(formRef.value)
     if (isForm) {
         const form = formModel.value
-        const {error, code, msg} = await mainApi.submit({
+        const { error, code, msg } = await mainApi.submit({
             ...form,
-            alias: form.code
+            alias: form.code,
         })
         if (!error && code === 200) {
             window.$message.success('保存成功')

+ 25 - 27
src/views/system/parameter.vue

@@ -1,55 +1,55 @@
 <template>
-    <HcTabsSimple :cur="tabsKey" :datas="tabsData" @tabClick="tabsClick">
+    <HcTabsSimple :cur="tabsKey" :datas="tabsData" @tab-click="tabsClick">
         <template #tab-pricetype>
-            <HcTabPriceType :cur="tabsKey" :type="1" v-if="tabsKey==='pricetype'"/>
+            <HcTabPriceType v-if="tabsKey === 'pricetype'" :cur="tabsKey" :type="1" />
         </template>
         <template #tab-tasktype>
-            <HcTabTaskType :cur="tabsKey" :type="2" v-if="tabsKey==='tasktype'"/>
+            <HcTabTaskType v-if="tabsKey === 'tasktype'" :cur="tabsKey" :type="2" />
         </template>
         <template #tab-price>
-            <HcTabPrice :cur="tabsKey" :type="3" v-if="tabsKey==='price'"/>
+            <HcTabPrice v-if="tabsKey === 'price'" :cur="tabsKey" :type="3" />
         </template>
         <template #tab-reimbursement>
-            <HcTabReimbursement :cur="tabsKey" :type="4" v-if="tabsKey==='reimbursement'"/>
+            <HcTabReimbursement v-if="tabsKey === 'reimbursement'" :cur="tabsKey" :type="4" />
         </template>
         <template #tab-cost>
-            <HcTabCost :cur="tabsKey" :type="5" v-if="tabsKey==='cost'"/>
+            <HcTabCost v-if="tabsKey === 'cost'" :cur="tabsKey" :type="5" />
         </template>
         <template #tab-approve>
-            <HcTabApprove :cur="tabsKey" :type="6" v-if="tabsKey==='approve'"/>
+            <HcTabApprove v-if="tabsKey === 'approve'" :cur="tabsKey" :type="6" />
         </template>
         <template #tab-invoice>
-            <HcTabInvoice :cur="tabsKey" :type="7" v-if="tabsKey==='invoice'"/>
+            <HcTabInvoice v-if="tabsKey === 'invoice'" :cur="tabsKey" :type="7" />
         </template>
         <template #tab-other>
-            <HcTabOther :cur="tabsKey" :type="11" v-if="tabsKey==='other'"/>
+            <HcTabOther v-if="tabsKey === 'other'" :cur="tabsKey" :type="11" />
         </template>
     </HcTabsSimple>
 </template>
 
 <script setup>
-import {ref, watch, onMounted} from "vue";
-import HcTabPriceType from "./components/tab-price-type.vue";
-import HcTabTaskType from "./components/tab-task-type.vue";
-import HcTabPrice from "./components/tab-price.vue";
-import HcTabReimbursement from "./components/tab-reimbursement.vue";
-import HcTabCost from "./components/tab-cost.vue";
-import HcTabApprove from "./components/tab-approve.vue";
-import HcTabInvoice from "./components/tab-invoice.vue";
+import { onMounted, ref } from 'vue'
+import HcTabPriceType from './components/tab-price-type.vue'
+import HcTabTaskType from './components/tab-task-type.vue'
+import HcTabPrice from './components/tab-price.vue'
+import HcTabReimbursement from './components/tab-reimbursement.vue'
+import HcTabCost from './components/tab-cost.vue'
+import HcTabApprove from './components/tab-approve.vue'
+import HcTabInvoice from './components/tab-invoice.vue'
 import HcTabOther from './components/tab-other.vue'
 
 
 //类型处理
 const tabsKey = ref('pricetype')
 const tabsData = ref([
-    {icon: 'bar-chart-box', label: '财务费用字典', key: 'pricetype'},
-    {icon: 'tools', label: '任务类型字典', key: 'tasktype'},
-    {icon: 'sun-cloudy', label: '岗位类型字典', key: 'price'},
-    {icon: 'sun-cloudy', label: '报销类型字典', key: 'reimbursement'},
-    {icon: 'sun-cloudy', label: '成本测算类型', key: 'cost'},
-    {icon: 'sun-cloudy', label: '审批流程', key: 'approve'},
-    {icon: 'sun-cloudy', label: '发票字典', key: 'invoice'},
-    {icon: 'sun-cloudy', label: '其他', key: 'other'},
+    { icon: 'bar-chart-box', label: '财务费用字典', key: 'pricetype' },
+    { icon: 'tools', label: '任务类型字典', key: 'tasktype' },
+    { icon: 'sun-cloudy', label: '岗位类型字典', key: 'price' },
+    { icon: 'sun-cloudy', label: '报销类型字典', key: 'reimbursement' },
+    { icon: 'sun-cloudy', label: '成本测算类型', key: 'cost' },
+    { icon: 'sun-cloudy', label: '审批流程', key: 'approve' },
+    { icon: 'sun-cloudy', label: '发票字典', key: 'invoice' },
+    { icon: 'sun-cloudy', label: '其他', key: 'other' },
 
 ])
 //渲染完成
@@ -59,8 +59,6 @@ onMounted(() => {
 const tabsClick = (key) => {
     tabsKey.value = key
 }
-
-
 </script>
 
 <style lang="scss" scoped>

+ 98 - 157
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" :key="item.id" :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 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 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 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" :key="item.id" :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-option v-for="item in postData" :label="item.deptName" :value="item.id" />
+                        <el-select v-model="formModel.postId" placeholder="选择岗位" style="width: 100%;" clearable :getdata="getpostData(formModel.deptId)">
+                            <el-option v-for="item in postData" :key="item.id" :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 sectionData" :label="item.deptName" :value="item.id"/>
+                        <el-select v-model="isLeaderIds" placeholder="是否为部门负责人" style="width: 100%;" multiple clearable>
+                            <el-option v-for="item in sectionData" :key="item.id" :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 { arrToId, formValidate, getArrValue, isIdCard, isPhone } from 'js-fast-way'
+
+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)
@@ -178,10 +185,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()
@@ -193,20 +200,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
@@ -219,7 +226,7 @@ const getTableData = async()=>{
     }
 }
 
-const tableCheckedKeys = ref([]);
+const tableCheckedKeys = ref([])
 const tableSelectionChange = (rows) => {
     tableCheckedKeys.value = rows
 }
@@ -230,39 +237,26 @@ const formModal = ref(false)
 //用户信息表单
 const formRef = ref(null)
 const formRef1 = ref(null)
-const formRef3=ref(null)
+const formRef3 = ref(null)
 
 //循环表单的ref
-const formRefs = ref([])
-const setFormItemRefs = (el, index) => {
-    if (el) {
-        let indexs = arrIndex(formRefs.value, 'index', index)
-        if (indexs !== -1) {
-            formRefs.value[index].ref = el
-        } else {
-            formRefs.value.push({index: index, ref: el});
-        }
-    }
-}
+
+
 //获取表单的ref
-const getFormRef = async (index) => {
-    const indexs = arrIndex(formRefs.value, 'index', index)
-    return formRefs.value[indexs].ref
-}
 
 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'}],
+    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'}],
+    oneMoney: [{ required: true, message: '请输入日单价', trigger: 'blur' }],
+    status: [{ required: true, message: '请选择启用状态', trigger: 'change' }],
     phone: {
         required: true,
         validator: (rule, value, callback) => {
@@ -274,18 +268,18 @@ 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
@@ -295,7 +289,7 @@ const addUserClick = () => {
 //编辑用户信息
 const rowEidtClick = (row) => {
     // const deptList = getArrValue(row.deptList)
-    isLeaderIds.value=[]
+    isLeaderIds.value = []
     //设置表单数据
     const form = {
         id: row.id,
@@ -325,10 +319,10 @@ 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
@@ -338,7 +332,7 @@ const rowEidtClick = (row) => {
 //部门下拉数据
 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 {
@@ -348,10 +342,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 {
@@ -360,59 +354,6 @@ const getpostData=async(id)=>{
     }
 }
 
-const initPostData = async (id, index) => {
-    if (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;
-        const deptList = formModel.value.deptList
-        deptList.forEach((item, indexs) => {
-            if (item.deptId === id) {
-                //如果当前相同部门项的负责人存在,就全局存在
-                if (item.isLeader === 1) {
-                    isLeader = 1
-                }
-                //设置其它相同部门项的负责人
-                if (indexs !== index) {
-                    item.isLeader = isLeader
-                    item.isLeaderDisabled = true
-                }
-            }
-        })
-        //设置当前项的负责人
-        deptList[index].isLeader = isLeader
-        deptList[index].isLeaderDisabled = false
-    }
-}
-
-//是否为部门负责人
-const isLeaderChange = (id, index) => {
-    const deptList = formModel.value.deptList
-    const deptId = deptList[index].deptId
-    deptList.forEach((item) => {
-        if (item.deptId === deptId) {
-            item.isLeader = id
-        }
-    })
-}
-
-//新增组织
-const addOrganizationClick = () => {
-    formModel.value.deptList.push({isLeader: 0})
-    postData.value.push({})
-}
-
-//删除组织
-const delOrganizationClick = (index) => {
-    formModel.value.deptList.splice(index, 1)
-    postData.value.splice(index, 1)
-}
 
 
 //保存
@@ -420,15 +361,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('请输入确认密码')
@@ -461,7 +402,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,
     })
@@ -477,7 +418,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/components/logs-content.vue

@@ -41,7 +41,7 @@
             </div>
             <div class="content">
                 <HcTable :is-index="false" :column="tableColumn" :datas="tableData">
-                    <template #action="{ row, index }">
+                    <template #action="{ row }">
                         <!-- <el-button size="small" type="primary" @click="statusClick(row)">{{row.statusName === '未完成' ? '变更已完成': '已完成' }}</el-button> -->
                         <el-button size="small" type="primary" :disabled="row.status === 1 || row.status === 2" @click="statusClick(row)">
                             变更已完成
@@ -67,7 +67,7 @@
 </template>
 
 <script setup>
-import { onActivated, onMounted, ref, watch } from 'vue'
+import { onMounted, ref, watch } from 'vue'
 import logsApi from '~api/task/logs'
 import { deepClone, getArrValue } from 'js-fast-way'
 import avatarPng from '~src/assets/images/avatar.png'

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

@@ -3,12 +3,12 @@
         <template #header>
             <div class="w-36">
                 <el-select v-model="searchForm.orgDept" block clearable placeholder="选择部门" size="large" @change="changeDpet">
-                    <el-option v-for="item in department" :label="item.deptName" :value="item.id" />
+                    <el-option v-for="item in department" :key="item.id" :label="item.deptName" :value="item.id" />
                 </el-select>
             </div>
             <div class="w-36 ml-2">
                 <el-select v-model="searchForm.userId" block clearable placeholder="选择人员" size="large">
-                    <el-option v-for="item in departmentPeople" :label="item.name" :value="item.id" />
+                    <el-option v-for="item in departmentPeople" :key="item.id" :label="item.name" :value="item.id" />
                 </el-select>
             </div>
             <div class="w-36 ml-4">
@@ -58,11 +58,11 @@
         <div class="hac-logs-main-body">
             <div class="hac-logs-user-list-body">
                 <HcCardItem scrollbar>
-                    <div v-for="(item, key) in userList" class="hac-user-list-item">
+                    <div v-for="(item, key) in userList" :key="key" class="hac-user-list-item">
                         <div class="label">
                             {{ key }}
                         </div>
-                        <template v-for="items in item">
+                        <template v-for="items in item" :key="items.id"> 
                             <div class="user-item" :class="userItemId.id === items.id ? 'cur' : ''" @click="userItemClick(items)">
                                 <img class="avatar" :src="items?.headPicture || avatarPng" alt="">
                                 <div class="name">
@@ -214,7 +214,7 @@ const getLogDetail = async () => {
         //判断状态
         if (!error && code === 200) {
             logDetail.value = getObjValue(data)
-            const { real_name, avatar } = userInfo.value
+            const { real_name } = userInfo.value
             let logTitle = logDetail.value['logTitle']
             console.log(logTitle, 'logTitle')
             let index = logTitle.lastIndexOf('的')

+ 6 - 7
src/views/task/plan/components/TaskTable.vue

@@ -3,7 +3,7 @@
         <template #header>
             <div class="w-36">
                 <el-select v-model="searchForm.deptId" block clearable placeholder="选择部门" size="large">
-                    <el-option v-for="item in department" :label="item.deptName" :value="item.id" />
+                    <el-option v-for="item in department" :key="item.id" :label="item.deptName" :value="item.id" />
                 </el-select>
             </div>
             <div class="w-36 ml-2">
@@ -85,7 +85,7 @@
                                 </el-form-item>
                                 <el-form-item label="转移对象:" prop="type" size="large">
                                     <el-select v-model="formModel.transferObject" class="block" filterable allow-create default-first-option :reserve-keyword="false">
-                                        <el-option v-for="item in userList" :label="item.name" :value="item.id" />
+                                        <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="转移原因:" prop="textContent">
@@ -101,9 +101,8 @@
 </template>
 
 <script setup>
-import { nextTick, onActivated, onMounted, ref, watch } from 'vue'
-import { useRouter } from 'vue-router'
-import { arrToId, formValidate, getArrValue, getObjValue } from 'js-fast-way'
+import { onActivated, ref, watch } from 'vue'
+import { arrToId, formValidate, getArrValue } from 'js-fast-way'
 import planApi from '~api/task/plan.js'
 import { getdepartmentList, getuserList } from '~api/other'
 import { useAppStore } from '~src/store'
@@ -117,7 +116,7 @@ const props = defineProps({
 
 const useAppState = useAppStore()
 
-const router = useRouter()
+
 onActivated(()=>{
     getTableData()
     getDepartmentDict()
@@ -295,7 +294,7 @@ const saveChangeStateClick = async () => {
     formModel.value.taskIds = ids
     if (res) {
         changeStateLoading.value = true
-        const { error, code, data, msg } = await planApi.submit( formModel.value)
+        const { error, code, msg } = await planApi.submit( formModel.value)
         changeStateLoading.value = false
         if (!error && code === 200) {
             window.$message.success(msg)

+ 7 - 8
src/views/task/plan/index.vue

@@ -1,27 +1,26 @@
 <template>
-    <HcTabsSimple :cur="tabsKey" :datas="tabsData" @tabClick="tabsClick">
+    <HcTabsSimple :cur="tabsKey" :datas="tabsData" @tab-click="tabsClick">
         <template #tab-1>
-            <TaskTable :tableKey="tabsKey"/>
+            <TaskTable :table-key="tabsKey" />
         </template>
         <template #tab-2>
-            <TaskTable :tableKey="tabsKey"/>
+            <TaskTable :table-key="tabsKey" />
         </template>
     </HcTabsSimple>
 </template>
 
 <script setup>
-import {ref, watch} from "vue";
-import TaskTable from "./components/TaskTable.vue";
+import { ref } from 'vue'
+import TaskTable from './components/TaskTable.vue'
 
 //选项卡
 const tabsKey = ref(1)
 const tabsData = ref([
-    {icon: 'user', label: '我的计划任务', key: 1},
-    {icon: 'todo', label: '查看全部计划任务', key: 2},
+    { icon: 'user', label: '我的计划任务', key: 1 },
+    { icon: 'todo', label: '查看全部计划任务', key: 2 },
 ])
 
 const tabsClick = (key) => {
     tabsKey.value = key
 }
-
 </script>

+ 27 - 22
src/views/user/config.vue

@@ -1,25 +1,30 @@
 <template>
-    <HcCard actionSize="lg" scrollbar>
-        <div class="text-lg font-medium mb-4">主题模式<span class="text-sm text-slate-400 font-light ml-4">深色模式还未适配,暂不推荐使用深色模式</span>
+    <HcCard action-size="lg" scrollbar>
+        <div class="text-lg font-medium mb-4">
+            主题模式<span class="text-sm text-slate-400 font-light ml-4">深色模式还未适配,暂不推荐使用深色模式</span>
         </div>
         <div class="hc-theme-box mb-8">
             <el-radio-group v-model="UserTheme" @change="ThemeTabsUpdate">
-                <template v-for="item in ThemeDatas">
+                <template v-for="item in ThemeDatas" :key="">
                     <div :class="UserTheme === item?.key ? 'active' : ''" class="item">
                         <div :class="item?.key" class="demo">
                             <img :src="ImgTheme" alt="">
                         </div>
                         <div class="action" @click="ThemeConfigClick(item)">
-                            <el-radio :label="item?.key" class="size-xl" size="large">{{ item?.name }}</el-radio>
+                            <el-radio :label="item?.key" class="size-xl" size="large">
+                                {{ item?.name }}
+                            </el-radio>
                         </div>
                     </div>
                 </template>
             </el-radio-group>
         </div>
 
-        <div class="text-lg font-medium mb-4">主题色</div>
+        <div class="text-lg font-medium mb-4">
+            主题色
+        </div>
         <div class="hc-theme-box color-box mb-4">
-            <template v-for="(item,index) in ColorConfigData">
+            <template v-for="(item, index) in ColorConfigData">
                 <div v-if="index < 5" :class="UserColorNmae === item.name ? 'active' : ''" class="item">
                     <div :class="`bg-${item.name}`" class="demo">
                         <img :src="ImgColor" alt="">
@@ -33,7 +38,7 @@
             </template>
         </div>
         <div class="hc-theme-box color-box mb-8">
-            <template v-for="(item,index) in ColorConfigData">
+            <template v-for="(item, index) in ColorConfigData">
                 <div v-if="index >= 5" :class="UserColorNmae === item.name ? 'active' : ''" class="item">
                     <div :class="`bg-${item.name}`" class="demo">
                         <img :src="ImgColor" alt="">
@@ -51,7 +56,7 @@
             <el-popover :width="180" placement="top" trigger="hover">
                 <template #reference>
                     <el-button :loading="saveLoading" hc-btn type="primary" @click="SaveConfigClick">
-                        <HcIcon name="save"/>
+                        <HcIcon name="save" />
                         <span>保存配置</span>
                     </el-button>
                 </template>
@@ -60,7 +65,7 @@
             <el-popover :width="180" placement="top-start" trigger="hover">
                 <template #reference>
                     <el-button hc-btn @click="CancelClick">
-                        <HcIcon name="arrow-go-back"/>
+                        <HcIcon name="arrow-go-back" />
                         <span>取消</span>
                     </el-button>
                 </template>
@@ -71,15 +76,15 @@
 </template>
 
 <script setup>
-import {ref, nextTick} from "vue";
-import {useRouter} from 'vue-router'
-import {useAppStore} from "~src/store";
-import colorData from '~src/config/color';
-import {userConfigSave} from "~api/other";
-import ImgTheme from "~src/assets/images/theme.png";
-import ImgColor from "~src/assets/images/color.png";
-import {setElementMainColor} from "js-fast-way"
-import {useOsTheme} from 'hc-vue3-ui'
+import { nextTick, ref } from 'vue'
+import { useRouter } from 'vue-router'
+import { useAppStore } from '~src/store'
+import colorData from '~src/config/color'
+import { userConfigSave } from '~api/other'
+import ImgTheme from '~src/assets/images/theme.png'
+import ImgColor from '~src/assets/images/color.png'
+import { setElementMainColor } from 'js-fast-way'
+import { useOsTheme } from 'hc-vue3-ui'
 
 //初始变量
 const router = useRouter()
@@ -106,9 +111,9 @@ const ColorConfigClick = (item) => {
 
 //更改主题设置
 const ThemeDatas = ref([
-    {key: 'auto', name: '跟随系统'},
-    {key: 'light', name: '浅色模式'},
-    {key: 'dark', name: '深色模式'}
+    { key: 'auto', name: '跟随系统' },
+    { key: 'light', name: '浅色模式' },
+    { key: 'dark', name: '深色模式' },
 ])
 const ThemeConfigClick = (item) => {
     ThemeTabsUpdate(item?.key)
@@ -135,7 +140,7 @@ const saveLoading = ref(false)
 const SaveConfigClick = async () => {
     //发起请求
     saveLoading.value = true
-    const {error, code} = await userConfigSave({
+    const { error, code } = await userConfigSave({
         theme: UserTheme.value,
         color: UserColorNmae.value,
     })

+ 109 - 94
src/views/user/index.vue

@@ -1,136 +1,153 @@
 <template>
-    <HcCard actionSize="lg" scrollbar>
+    <HcCard action-size="lg" scrollbar>
         <HcCardItem ui="hac-card-item mt-4" style="height:160px">
             <div class="user-avatar-box">
-                <div class="user-avatar" v-loading="avatarLoading">
-                    <img :src="userInfo['avatar'] || avatarPng" alt=""/>
+                <div v-loading="avatarLoading" class="user-avatar">
+                    <img :src="userInfo.avatar || avatarPng" alt="">
                     <div class="user-avatar-upload">
-                        <el-upload class="upload-dom" :action="action" :accept="accept" :headers="getTokenHeader()"
-                                   :data="upData" :show-file-list="false" :on-success="uploadFinish"
-                                   :on-error="uploadError" :before-upload="beforeUpload">
-                            <HcIcon name="camera" fill/>
+                        <el-upload
+                            class="upload-dom" :action="action" :accept="accept" :headers="getTokenHeader()"
+                            :data="upData" :show-file-list="false" :on-success="uploadFinish"
+                            :on-error="uploadError" :before-upload="beforeUpload"
+                        >
+                            <HcIcon name="camera" fill />
                         </el-upload>
                     </div>
                 </div>
-                <div class="user-name truncate">{{ userInfo['real_name'] || '游客' }}
-                    <div class="el-upload__tip" style="margin-top: 27px;">支持.jpg 、png格式</div>
+                <div class="user-name truncate">
+                    {{ userInfo.real_name || '游客' }}
+                    <div class="el-upload__tip" style="margin-top: 27px;">
+                        支持.jpg 、png格式
+                    </div>
                 </div>
             </div>
             <div class="btn_box">
-                <el-button type="primary" size="large" @click="updatePassword" v-if="!updatePasswordshow">
+                <el-button v-if="!updatePasswordshow" type="primary" size="large" @click="updatePassword">
                     <span>修改密码</span>
                 </el-button>
-                <el-button type="primary" size="large" @click="submit" :loading="saveUserLoading">
+                <el-button type="primary" size="large" :loading="saveUserLoading" @click="submit">
                     <span>保存</span>
                 </el-button>
             </div>
         </HcCardItem>
-        <HcCardItem ui="hac-card-item mt-4" :class="updatePasswordshow  ? 'half-height' : 'all-height'">
+        <HcCardItem ui="hac-card-item mt-4" :class="updatePasswordshow ? 'half-height' : 'all-height'">
             <template #header>
-                <div class="hac-card-title">基础信息</div>
+                <div class="hac-card-title">
+                    基础信息
+                </div>
             </template>
             <div>
-                <el-form ref="formUserRef" :model="formUserModel" :rules="formUserRules" size="large"
-                         label-width="auto">
+                <el-form
+                    ref="formUserRef" :model="formUserModel" :rules="formUserRules" size="large"
+                    label-width="auto"
+                >
                     <el-row :gutter="20">
                         <el-col :span="12">
                             <el-form-item label="用户姓名:" prop="real_name">
-                                <el-input v-model="formUserModel.real_name"/>
+                                <el-input v-model="formUserModel.real_name" />
                             </el-form-item>
                         </el-col>
                         <el-col :span="12">
                             <el-form-item label="身份证号:">
-                                <el-input v-model="formUserModel.idNumber" placeholder=""/>
+                                <el-input v-model="formUserModel.idNumber" placeholder="" />
                             </el-form-item>
                         </el-col>
                         <el-col :span="12">
                             <el-form-item label="手机号码:" prop="phone">
-                                <el-input v-model="formUserModel.phone" placeholder="请输入绑定手机"/>
+                                <el-input v-model="formUserModel.phone" placeholder="请输入绑定手机" />
                             </el-form-item>
                         </el-col>
                         <el-col :span="12">
                             <el-form-item label="登录账号:" prop="account">
-                                <el-input v-model="formUserModel.account" placeholder="" disabled/>
+                                <el-input v-model="formUserModel.account" placeholder="" disabled />
                             </el-form-item>
                         </el-col>
                         <el-col :span="12">
                             <el-form-item label="所属部门:" prop="deptId">
-                                <el-select v-model="formUserModel.dept_id" class=" block" placeholder=""
-                                           size="large" disabled>
-                                           <el-option v-for="item in sectionData" :label="item.deptName" :value="item.id"/>
+                                <el-select
+                                    v-model="formUserModel.dept_id" class=" block" placeholder=""
+                                    size="large" disabled
+                                >
+                                    <el-option v-for="item in sectionData" :key="item.id" :label="item.deptName" :value="item.id" />
                                 </el-select>
                             </el-form-item>
                         </el-col>
                         <el-col :span="12">
-                            <el-form-item label="所属岗位:"  prop="postId"  :getPostId="initPostData(formUserModel.deptId)">
-                                <el-select v-model="formUserModel.post_id" class=" block" placeholder=""
-                                           size="large" disabled>
-                                           <el-option v-for="item in postData" :label="item.deptName" :value="item.id"/>
+                            <el-form-item label="所属岗位:" prop="postId" :get-post-id="initPostData(formUserModel.deptId)">
+                                <el-select
+                                    v-model="formUserModel.post_id" class=" block" placeholder=""
+                                    size="large" disabled
+                                >
+                                    <el-option v-for="item in postData" :key="item.id" :label="item.deptName" :value="item.id" />
                                 </el-select>
                             </el-form-item>
                         </el-col>
-                   
-
-
                     </el-row>
                 </el-form>
             </div>
         </HcCardItem>
 
-        <HcCardItem ui="hac-card-item mt-4" style="height:38%" v-if="updatePasswordshow">
+        <HcCardItem v-if="updatePasswordshow" ui="hac-card-item mt-4" style="height:38%">
             <template #header>
-                <div class="hac-card-title">修改密码</div>
+                <div class="hac-card-title">
+                    修改密码
+                </div>
             </template>
             <div>
-                <el-form ref="formUserPassRef" :model="formUserPassModel" :rules="formUserPassRules"
-                         label-position="left" label-width="auto"
-                         size="large">
+                <el-form
+                    ref="formUserPassRef" :model="formUserPassModel" :rules="formUserPassRules"
+                    label-position="left" label-width="auto"
+                    size="large"
+                >
                     <el-form-item label="原密码:" prop="oldPassword">
-                        <el-input v-model="formUserPassModel.oldPassword" placeholder="请输入原密码"
-                                  autocomplete="new-password"
-                                  show-password type="password"/>
+                        <el-input
+                            v-model="formUserPassModel.oldPassword" placeholder="请输入原密码"
+                            autocomplete="new-password"
+                            show-password type="password"
+                        />
                     </el-form-item>
 
-                    <el-form-item label="新的密码:" :prop="formUserModel.user_id?'':'password'">
-                        <el-input v-model="formUserPassModel.newPassword" placeholder="请输入新的密码"
-                                  autocomplete="new-password"
-                                  show-password type="password"/>
+                    <el-form-item label="新的密码:" :prop="formUserModel.user_id ? '' : 'password'">
+                        <el-input
+                            v-model="formUserPassModel.newPassword" placeholder="请输入新的密码"
+                            autocomplete="new-password"
+                            show-password type="password"
+                        />
                     </el-form-item>
                     <el-form-item label="确认新密码:" prop="newPassword1">
-                        <el-input v-model="formUserPassModel.newPassword1" placeholder="请输入确认新密码"
-                                  autocomplete="new-password"
-                                  show-password type="password"/>
+                        <el-input
+                            v-model="formUserPassModel.newPassword1" placeholder="请输入确认新密码"
+                            autocomplete="new-password"
+                            show-password type="password"
+                        />
                     </el-form-item>
                 </el-form>
-         
-
             </div>
         </HcCardItem>
     </HcCard>
-
 </template>
 
 <script setup>
-import {ref, watch,onMounted} from "vue";
-import {useAppStore} from "~src/store";
-import avatarPng from '~src/assets/images/avatar.png';
-import {getTokenHeader} from '~src/api/request/header';
+import { onMounted, ref } from 'vue'
+import { useAppStore } from '~src/store'
+import avatarPng from '~src/assets/images/avatar.png'
+import { getTokenHeader } from '~src/api/request/header'
 import userApi from '~src/api/modules/userInfo/index.js'
-import {arrIndex, formValidate, getArrValue, isPhone} from "js-fast-way"
-import md5 from 'js-md5';
-import organizationApi from '~api/system/organization';
+import { formValidate, getArrValue, isPhone } from 'js-fast-way'
+import md5 from 'js-md5'
+import organizationApi from '~api/system/organization'
 
 const useAppState = useAppStore()
 
 //全局变量信息
-const userInfo = ref(useAppState.getUserInfo);
-const basicFormEdit = ref(false)
+const userInfo = ref(useAppState.getUserInfo)
+
 onMounted(()=>{
     getSectionData()
 })
 //上传组件参数
-const action = '/api/blade-resource/oss/endpoint/put-file';
-const accept = 'image/png,image/jpg,image/jpeg';
+const action = '/api/blade-resource/oss/endpoint/put-file'
+const accept = 'image/png,image/jpg,image/jpeg'
 const upData = ref({})
 
 //上传前
@@ -142,10 +159,10 @@ const beforeUpload = () => {
 
 //上传完成
 const uploadFinish = async (res) => {
-    const link = res?.data?.link ?? '';
-    const user_id = userInfo.value?.user_id ?? '';
+    const link = res?.data?.link ?? ''
+    const user_id = userInfo.value?.user_id ?? ''
     if (link) {
-        const {error, code} = await userApi.updateUserInfo({avatar: link, id: user_id})
+        const { error, code } = await userApi.updateUserInfo({ avatar: link, id: user_id })
         if (!error && code === 200) {
             avatarLoading.value = false
             userInfo.value.avatar = link
@@ -180,61 +197,61 @@ const formUserRules = {
                 callback()
             }
         },
-        trigger: "blur"
+        trigger: 'blur',
     },
     real_name:{
         required: true,
-        trigger: "blur",
-        trigger: "请输入姓名",
+        trigger: 'blur',
+        message: '请输入姓名',
     },
     account:{
         required: true,
-        trigger: "blur",
-        message: "请输入账号"
+        trigger: 'blur',
+        message: '请输入账号',
     },
     deptId:{
         required: false,
-        trigger: "blur",
-        message: "请选择部门"
+        trigger: 'blur',
+        message: '请选择部门',
     },
     postId:{
         required: false,
-        trigger: "blur",
-        message: "请选择岗位"
+        trigger: 'blur',
+        message: '请选择岗位',
     },
 }
 const formUserPassRules = {
     oldPassword: {
         required: true,
-        trigger: "blur",
-        message: "请输入原始密码"
+        trigger: 'blur',
+        message: '请输入原始密码',
     },
     newPassword: {
         required: true,
         validator(rule, value, callback) {
-            const pass = formUserPassModel.value.newPassword1;
+            const pass = formUserPassModel.value.newPassword1
             if (!value) {
-                callback(new Error("请输入新的密码"))
+                callback(new Error('请输入新的密码'))
             } else if (pass && value !== pass) {
-                callback(new Error("新的密码和确认新密码不一致"))
+                callback(new Error('新的密码和确认新密码不一致'))
             }
             callback()
         },
-        trigger: "blur"
+        trigger: 'blur',
     },
     newPassword1: {
         required: true,
         validator(rule, value, callback) {
-            const pass = formUserPassModel.value.newPassword;
+            const pass = formUserPassModel.value.newPassword
             if (!value) {
-                callback(new Error("请输入确认新密码"))
+                callback(new Error('请输入确认新密码'))
             } else if (pass && value !== pass) {
-                callback(new Error("新的密码和确认新密码不一致"))
+                callback(new Error('新的密码和确认新密码不一致'))
             }
             callback()
         },
-        trigger: "blur"
-    }
+        trigger: 'blur',
+    },
 }
 const updatePasswordshow = ref(false)
 const updatePassword = () => {
@@ -252,13 +269,13 @@ const submit = () => {
 const saveUserLoading = ref(false)
 //保存用户信息
 const saveUserInfoData = async () => {
-    const {phone, user_id, idNumber} = formUserModel.value
+    const { phone, user_id, idNumber } = formUserModel.value
     if (phone && isPhone(phone)) {
         saveUserLoading.value = true
-        const {error, code} = await userApi.updateUserInfo({
+        const { error, code } = await userApi.updateUserInfo({
             phone: phone,
             id: user_id,
-            idNumber
+            idNumber,
         })
         if (!error && code === 200) {
             saveUserLoading.value = false
@@ -271,18 +288,18 @@ const saveUserInfoData = async () => {
     }
 }
 
-const formUserPassModel = ref({oldPassword: '', newPassword: '', newPassword1: ''})
+const formUserPassModel = ref({ oldPassword: '', newPassword: '', newPassword1: '' })
 //更新密码
 const saveUpdatePassword = async () => {
     const res = await formValidate(formUserPassRef.value)
     if (res) {
-        const form = formUserPassModel.value;
+        const form = formUserPassModel.value
         saveUserLoading.value = true
-        const {error, code} = await userApi.updatePassword({
+        const { error, code } = await userApi.updatePassword({
             oldPassword: md5(form?.oldPassword),
             newPassword: md5(form?.newPassword),
             newPassword1: md5(form?.newPassword1),
-            plaintextPassword: form?.newPassword
+            plaintextPassword: form?.newPassword,
         })
         if (!error && code === 200) {
             saveUserLoading.value = false
@@ -290,7 +307,7 @@ const saveUpdatePassword = async () => {
             formUserPassModel.value = {
                 oldPassword: '',
                 newPassword: '',
-                newPassword1: ''
+                newPassword1: '',
             }
         } else {
             saveUserLoading.value = false
@@ -300,22 +317,20 @@ const saveUpdatePassword = async () => {
 //部门下拉数据
 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 {
         sectionData.value = []
     }
 }
-const posotionoptions = ref([
-    {label: '总经理', value: '1'}
-])
+
 //获取岗位数据
 const postData = ref([])
 const initPostData = 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 {