Browse Source

Merge branch 'debug'

hbchen 2 years ago
parent
commit
648d54f99b

+ 1 - 1
.env.production

@@ -1,4 +1,4 @@
 # 接口地址
-VITE_APP_API_URL="https://hr.hzinsights.com/api"
+VITE_APP_API_URL="https://fms.hzinsights.com/api"
 # crm系统地址
 VITE_CRM_SYSTEM_URL="https://admin.hzinsights.com/login"

+ 2 - 2
.gitignore

@@ -11,8 +11,8 @@ package-lock.json
 
 node_modules
 dist
-hrms_web
-hrms_web.zip
+hongze_fsms_web
+hongze_fsms_web.zip
 dist-ssr
 *.local
 

+ 1 - 0
README.md

@@ -62,6 +62,7 @@
       + 使用css修改颜色:需要将需要修改颜色的标签的fill属性的值设为'currentColor' ,方可通过css修改颜色。
       + 两种方式可以混用。
     3. **import ids from 'virtual:svg-icons-names'** 可以获取所有图标的symbolId,即为svgIcon的name属性,返回值为一个数组。
+### 提示:开发之前可以瞅一眼 组件封装和工具函数的文件夹 看是否有你需要的东西,能省点事就省点事嘛.
 
 
 

+ 8 - 1
src/api/systemMana.js

@@ -140,7 +140,14 @@ export function addRoleApi(data) {
       data
   })
 }
-
+// 编辑角色
+export function editRoleApi(data) {
+  return request({
+      url:'/system/role/edit',
+      method:'post',
+      data
+  })
+}
 // 获取角色绑定菜单
 export function getRolePermission(data) {
   return request({

+ 1 - 0
src/components/SvgIcon/index.vue

@@ -1,3 +1,4 @@
+<!-- svg图标组件 -->
 <script setup>
 import { computed } from 'vue'
 const props = defineProps({

+ 1 - 0
src/components/mPage.vue

@@ -1,3 +1,4 @@
+<!-- 分液器 -->
 <script setup>
   const props=defineProps({
     page_no:{

+ 49 - 0
src/components/scrollable-select/index.vue

@@ -0,0 +1,49 @@
+<!-- 远程搜索 下拉框分页 -->
+<script setup>
+  const props=defineProps({
+    // 搜索方法
+    searchMethod:{
+      type:Function,
+      required:true
+    },
+    // 加载更多方法
+    loadMoreMethod:{
+      type:Function,
+      required:true
+    },
+    // 是否需要loading
+    useLoading:{
+      type:Boolean,
+      default:false
+    },
+    // 是否正在loading
+    isLoading:{
+      type:Boolean,
+      default:false
+    }
+  })
+  const emits=defineEmits(['change'])
+
+  // -------method
+  const selectMethod=(value)=>{
+    emits('change',value)
+  }
+  // console.log(props);
+</script>
+<template>
+  <el-select v-optionsLoadMore="loadMoreMethod" filterable remote :remote-method="searchMethod"
+  :placeholder="props.placeholder" :teleported="false" @change="selectMethod">
+    <slot name="default"></slot>
+    <div v-loading="props.isLoading" class="load-item" v-if="props.useLoading"></div>
+  </el-select>
+</template>
+  
+<style lang="scss" scoped>
+  .load-item{
+    height: 40px;
+    width:100%;
+    position: absolute;
+    bottom: 0;
+    pointer-events: none;
+  }
+</style>

+ 1 - 0
src/directives/modules/buttonPermisson.js

@@ -1,3 +1,4 @@
+// 权限指令
 import store from "@/store"
 
 export const permission={

+ 1 - 0
src/directives/modules/select-scroll.js

@@ -1,3 +1,4 @@
+// el-select标签 滚动指令
 import {debounce} from 'lodash/function'
 
 export const optionsLoadMore={

+ 2 - 0
src/layout/headerBar/index.vue

@@ -20,6 +20,8 @@
   const logout = ()=>{
     localStorage.removeItem('fsms_token')
     localStorage.removeItem('userInfo')
+    // 财务列表页面所保存的表格选中项
+    sessionStorage.removeItem('financialListColumn')
     location.reload()
   }
   const gotoCrmSystem=()=>{

+ 0 - 1
src/router/index.js

@@ -43,7 +43,6 @@ export const routes=[
 
 const router = createRouter({
   history:createWebHistory(),
-  // history:createWebHashHistory(),
   routes
 })
 

+ 37 - 0
src/utils/common-methods.js

@@ -0,0 +1,37 @@
+
+// 根据字节流下载文件
+/**
+ * @param {Blob} data 流数据
+ * @param {String} type 下载的文件类型
+ * @param {String} fileName 下载的文件名
+ */
+export function downloadByFlow(data,type,fileName) {
+  let fileTypeMime ='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
+  switch (type) { // 获取后缀对应的 mimeType
+    case 'png': fileTypeMime = 'image/png'; break;
+    case 'doc': fileTypeMime = 'application/msword'; break;
+    case 'docx': fileTypeMime = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; break;
+    case 'jpg': case 'jpeg': fileTypeMime = 'image/jpeg'; break;
+    case 'gif': fileTypeMime = 'image/gif'; break;
+    case 'svg': fileTypeMime = 'image/svg+xml'; break;
+    case 'tif': case 'tiff': fileTypeMime = 'image/tiff'; break;
+    case 'txt': fileTypeMime = 'text/plain'; break;
+    case 'ppt': fileTypeMime = 'application/vnd.ms-powerpoint'; break;
+    case 'pptx': fileTypeMime = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'; break;
+    case 'xls': fileTypeMime = 'application/vnd.ms-excel'; break;
+    case 'xlsx': fileTypeMime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; break;
+    case 'zip': fileTypeMime = 'application/zip'; break;
+    case '7z': fileTypeMime = 'application/x-7z-compressed'; break;
+  }
+  let blob = window.URL.createObjectURL(new Blob([data], {
+    'type': fileTypeMime
+  }))
+  let link = document.createElement('a')
+  link.style.display = 'none'
+  link.href = blob
+  link.setAttribute('download', fileName.indexOf('.')?fileName:`${fileName}.${type}`)
+  document.body.appendChild(link)
+  link.click()
+  document.body.removeChild(link) //下载完成移除元素
+  window.URL.revokeObjectURL(blob) //释放掉 blob 对象
+}

+ 1 - 1
src/utils/request.js

@@ -23,7 +23,7 @@ request.interceptors.request.use(
 request.interceptors.response.use(
   res=>{
     if(res.request.responseType==='blob' || res.request.responseType==='Blob'){
-       // 二进制
+       // 字节
        if(res.status === 200){
         return res.data
        }

+ 0 - 9
src/utils/validators.js

@@ -2,12 +2,3 @@
 * 表单自定义验证规则
 */
 
-// 邮箱格式
-export const emailValid=(rule,value,callback)=>{
-  let reg = /^[a-zA-Z0-9]+([-_.][A-Za-z\d]+)*@([a-zA-Z\d]+[-.])+[A-Za-z\d]{2,5}$/
-  if(value.match(reg)){
-    callback()
-  }else{
-    callback(new Error('邮箱格式错误,请重试。'))
-  }
-}

+ 9 - 12
src/views/financialManagement/components/serviceVarietyDia.vue

@@ -69,9 +69,6 @@ import html2canvas from "html2canvas";
     // 选中的Id
     chart_permission_ids:''
   })
-
-  const goodsArr=["能化专栏《化里化外》","黑色专栏《知白守黑》","有色专栏《有声有色》","《股债日评》"]
-  const monthReport=["宏观经济","草根调研"]
   const emits=defineEmits(['update:visible','selectFinish'])
 
   watch(()=>props.service,(newValue)=>{
@@ -217,11 +214,12 @@ const formatRightClickCon=(rindex, cindex)=>{
     arr[2].show = false;
   }
 
-  //删除行 不能少于两行 并且商品复盘、周报、双周报、数据点评、月报必须有一个存在
+  //删除行 不能少于两行
   if (params.tableData.length <= 2) {
     arr[3].show = false;
   }
 
+  // 商品复盘、周报、双周报、数据点评、月报必须有一个存在
   let temarr=[]
   params.tableData.forEach(item=>{
     item.forEach(item2=>{
@@ -344,7 +342,7 @@ const varietyAllChecked=(e)=>{
   });
   e.check_list = e.checked ? arr : [];
   e.indeterminate = false;
-  // 需求更改,合同类型为补充协议时不默认勾选宏观经济
+  // 宏观经济默认勾选
   if(e.classify_name==='宏观经济'){
     e.check_list.push(1)
   }
@@ -390,7 +388,6 @@ const varietiesSelect=()=>{
       }
     })
   }
-  
 
   rowIndexarr.forEach(index=>{
     params.tableData[index].forEach((item) => {
@@ -442,11 +439,11 @@ const validateData=()=>{
       if(item2.Value==='数据点评'||
         item2.Value==='FICC周报'||
         item2.Value==='商品双周报+线上电话会讨论会<br/>(由弘则的研究员主持线上讨论)'){
-          item.forEach(item3=>{
-            if (item3.HeadName === "品种") {
-              arr3.push(...item3.ValueId);
-            }
-          })
+        item.forEach(item3=>{
+          if (item3.HeadName === "品种") {
+            arr3.push(...item3.ValueId);
+          }
+        })
       }
     })
   })
@@ -565,7 +562,7 @@ const serviceClose=()=>{
     </div>
     <!-- 新增列填写表头弹窗 -->
     <el-dialog v-model="params.showInputHead" width="560px" top="20vh" title="添加列">
-      <el-form :model="params.form" ref="headTitleForm" label-width="100px" @submit.native.prevent>
+      <el-form :model="params.form" ref="headTitleForm" label-width="100px">
         <el-form-item label="表格名称" prop="title" :rules="{ required: true, message: '请填写名称', trigger: 'blur' }">
           <el-input v-model="params.form.title"></el-input>
         </el-form-item>

+ 246 - 189
src/views/financialManagement/contractProgress.vue

@@ -2,18 +2,28 @@
 <script setup>
   import serviceVarietyDia from './components/serviceVarietyDia.vue'
   import {useRouter,useRoute} from 'vue-router'
+  import {useStore} from 'vuex'
   import {ElMessage} from 'element-plus'
   import {getSellerList,getContractSearchList} from '@/api/crm'
   import {getServiceList,registerAdd,registerDetail,registerEdit,registerInvoice,registerPayment} from '@/api/financialMana'
+  import scrollableSelect from '@/components/scrollable-select/index.vue'
 
   const router = useRouter()
   const route = useRoute()
+  const store=useStore()
 
   const contractInfoForm=ref(null)
   // 开票记录表单
   const invoiceFormRef=ref(null)
   // 到款记录表单
   const placementFormRef=ref(null)
+
+  const contractSourceArray=['非CRM合同导入','CRM合同导入']
+  const contractStatusArray=[{id:1,label:"已审批"},{id:2,label:"单章寄回"},{id:3,label:"已签回"}]
+  const contractTypeArray=[{id:1,label:"新签"},{id:2,label:"续约"}]
+  const operationType=[{op_type:1,label:"合规登记"},{op_type:2,label:"开票登记"},{op_type:3,label:"到款登记"},
+  {op_type:4,label:"修改合同状态"},{op_type:5,label:"删除合同登记"},{op_type:6,label:"合规编辑"}]
+
   // 合同信息
   const contractInfo=reactive({
     /*
@@ -21,6 +31,13 @@
       查看-view 合规登记-compliance 开票登记-invoice 到款登记-placement
     */ 
     operationtype:"compliance",
+    // 权限对象,判断是否有 合规登记、开票登记、到款登记权限
+    permissionItem:{
+      compliance:false, //合规
+      invoice:false, // 开票
+      placement:false // 到款
+    },
+    // 合规登记表单
     form:{
       product_id:1,
       contract_register_id:'',
@@ -38,21 +55,9 @@
       sign_date:'',
       agreed_pay_time:'',
       services:[],
+      register_status:'',
       remark:""
     },
-    moneyData:{
-      haveInvoiceMoney:'',
-      waitInvoiceMoney:'',
-      allInvoiceMoney:'',
-      // 到款金额
-      havePlacementMoney:'',
-      waitPlacementMoney:'',
-      allPlacementMoney:''
-    },
-    // 有效期
-    contractValidityDate:[],
-    //销售列表
-    sellerList:[],
     rules:{
       contract_source:{required:true,message:'合同来源不能为空',trigger:'change'},
       contract_code:{required:true,message:'合同编号不能为空',trigger:'blur'},
@@ -76,6 +81,20 @@
       agreed_pay_time:{required:true,message:'约定付款时间不能为空',trigger:'blur'}
 
     },
+    moneyData:{
+      // 开票金额
+      haveInvoiceMoney:'',
+      waitInvoiceMoney:'',
+      allInvoiceMoney:'',
+      // 到款金额
+      havePlacementMoney:'',
+      waitPlacementMoney:'',
+      allPlacementMoney:''
+    },
+    // 有效期
+    contractValidityDate:[],
+    //销售列表
+    sellerList:[],
     // 合同编号----------------------列表
     contractNoArray:[],
     // 请求列表参数
@@ -126,35 +145,66 @@
     ],
     rowErrorShow:''
   })
-
+  // 查看套餐报价单 图片
   const previewImage=ref('')
+  // 查看套餐报价单 标题
   const previewImageTitle=ref('')
+// -----------------------------监听
+  // 已开票金额
   watch(()=> contractInfo.moneyData.haveInvoiceMoney ,(newValue)=>{
     contractInfo.moneyData.waitInvoiceMoney = contractInfo.moneyData.allInvoiceMoney-newValue
     contractInfo.moneyData.waitInvoiceMoney=Math.round(contractInfo.moneyData.waitInvoiceMoney*100)/100
   })
+  // 已到款金额
   watch(()=> contractInfo.moneyData.havePlacementMoney ,(newValue)=>{
     contractInfo.moneyData.waitPlacementMoney = contractInfo.moneyData.allPlacementMoney-newValue
     contractInfo.moneyData.waitPlacementMoney=Math.round(contractInfo.moneyData.waitPlacementMoney*100)/100
   })
-  const contractSourceArray=['非CRM合同导入','CRM合同导入']
-  const contractStatusArray=[{id:1,label:"已审批"},{id:2,label:"单章寄回"},{id:3,label:"已签回"}]
-  const contractTypeArray=[{id:1,label:"新签"},{id:2,label:"续约"}]
-  const operationType=[{op_type:1,label:"合规登记"},{op_type:2,label:"开票登记"},{op_type:3,label:"到款登记"},
-  {op_type:4,label:"修改合同状态"},{op_type:5,label:"删除合同登记"}]
   // -----------------------method
+  // 权限验证
+  const permissionValidation=()=>{
+    /*
+      由于可以通过修改地址栏的type更改操作类型和权限,
+      为了防止用户修改地址栏进行权限之外的操作。
+    */
+    let flag=0 // 拥有的权限个数
+    let permissionButtons=store.getters.permissionButtons
+    for (let i = 0,len=permissionButtons.length; i < len || flag==3; i++) {
+      const element = permissionButtons[i];
+      if(element.button_code=='financial:list:complianceAdd' || element.button_code=='financial:list:complianceEdit'){
+        contractInfo.permissionItem.compliance=true
+        flag++
+      }else if(element.button_code=='financial:list:invoice'){
+        contractInfo.permissionItem.invoice=true
+        flag++
+      }else if(element.button_code=='financial:list:placement'){
+        contractInfo.permissionItem.placement=true
+        flag++
+      }
+    }
+    if(contractInfo.operationtype!='view'){
+      if(contractInfo.permissionItem[contractInfo.operationtype]===false){
+        // 没有权限
+        let messageHint=ElMessage.warning('暂无权限')
+        setTimeout(()=>{
+          messageHint.close()
+          router.back()
+        },1000)
+        return false
+      }
+    }
+    return true
+  }
   //获取销售列表
   const getSellerListFun=()=>{
     getSellerList().then(res=>{
       contractInfo.sellerList=res.data || []
-      // console.log(contractInfo.sellerList);
     })
   }
   // 获取服务列表
   const getServiceListFun=()=>{
     getServiceList().then(res=>{
       contractInfo.serviceArray=res.data || []
-      // console.log(contractInfo.serviceArray);
     })
   }
 
@@ -187,6 +237,7 @@
     }
     contractInfo.contractValidityDate=[]
     setTimeout(()=>{
+      // 去除错误信息
       contractInfoForm.value && contractInfoForm.value.clearValidate()
     },0)
   }
@@ -245,7 +296,11 @@
     contractInfo.form.seller_name=selectItem.seller_name
     contractInfo.form.seller_id=selectItem.seller_id
     contractInfo.form.contract_type=selectItem.contract_type_key
-    contractInfoForm.value && contractInfoForm.value.validateField()
+    contractInfoForm.value && 
+    contractInfoForm.value.validateField([
+      'contract_code','company_name','contract_type','seller_id',
+      'start_date','contract_amount','contract_type'
+    ])
   }
   // 销售选中
   const selectSeller=(value)=>{
@@ -272,108 +327,78 @@
   }
   // 表格删除行
   const deleteRow=(type,index)=>{
+    let tempArr=[]
     if(type=='invoice'){
-      if(invoiceForm.invoiceData[index].amount=='' && invoiceForm.invoiceData[index].invoice_date==''){
-        // 没有内容 直接删除
-        invoiceForm.invoiceData.splice(index,1)
-      }else{
-        ElMessageBox.confirm('删除后不可恢复,是否删除该条开票记录?',
-        '提示',    
-        {
-          confirmButtonText: '确定',
-          cancelButtonText: '取消',
-          type: 'warning',
-        }).then(res=>{
-          // 有金额才进行删除后的运算
-          if(invoiceForm.invoiceData[index].amount!=''){
-            invoiceForm.invoiceData.splice(index,1)
-            let money=0
-            invoiceForm.invoiceData.map(item =>{
-              money+=parseFloat(item.amount) || 0
-              // console.log(money);
-            })
-            // 保留两位小数、防止计算时精度丢失
-            money=Math.round(money*100)/100
+      tempArr=invoiceForm.invoiceData
+    }else{
+      tempArr=placementForm.placementData
+    }
+    if(tempArr[index].amount=='' && tempArr[index].invoice_date==''){
+      // 没有内容 直接删除
+      tempArr.splice(index,1)
+    }else{
+      ElMessageBox.confirm('删除后不可恢复,是否删除该条开票记录?',
+      '提示',    
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      }).then(res=>{
+        // 有金额才进行删除后的运算
+        if(tempArr[index].amount!=''){
+          tempArr.splice(index,1)
+          let money=0
+          tempArr.map(item =>{
+            money+=parseFloat(item.amount) || 0
+            // console.log(money);
+          })
+          // 保留两位小数、防止计算时精度丢失
+          money=Math.round(money*100)/100
+          if(type=='invoice'){
             contractInfo.moneyData.haveInvoiceMoney=money
           }else{
-            invoiceForm.invoiceData.splice(index,1)
-          }
-        }).catch(()=>{})
-      }
-    }else{
-      if(placementForm.placementData[index].amount=='' && placementForm.placementData[index].invoice_date==''){
-        // 没有内容 直接删除
-        placementForm.placementData.splice(index,1)
-      }else{
-        ElMessageBox.confirm('删除后不可恢复,是否删除该条到款记录?',
-        '提示',    
-        {
-          confirmButtonText: '确定',
-          cancelButtonText: '取消',
-          type: 'warning',
-        }).then(res=>{
-          // 有金额才进行删除后的运算
-          if(placementForm.placementData[index].amount!=''){
-            placementForm.placementData.splice(index,1)
-            let money=0
-            placementForm.placementData.map(item =>{
-              money+=parseFloat(item.amount) || 0
-              // console.log(money);
-            })
-            // 保留两位小数、防止计算时精度丢失
-            money=Math.round(money*100)/100
             contractInfo.moneyData.havePlacementMoney=money
-          }else{
-            placementForm.placementData.splice(index,1)
           }
-        }).catch(()=>{})
-      }
+        }else{
+          tempArr.splice(index,1)
+        }
+      }).catch(()=>{})
     }
   }
   // 金额改变
   const moneyChange=(type,value,index)=>{ 
     // console.log(value);
     let numerValue=parseFloat(value)
+    let tempArr=[]
     if(type=='invoice'){
-      if(!numerValue&&numerValue!=0&&value){
-        invoiceForm.invoiceData[index].amount=''
-        ElMessage.error('请输入数字')
-        return
-      }
-      // 如果输入不是 以.结尾&&只有一个.的话,就赋值为转为成数字后的值
-      if(!(value.endsWith('.') && value.indexOf('.')==(value.length-1))&&numerValue){
-        invoiceForm.invoiceData[index].amount=numerValue
-      }
-      // console.log(numerValue);
+      tempArr=invoiceForm.invoiceData
+    }else{
+      tempArr=placementForm.placementData
+    }
 
-      let money=0
-      invoiceForm.invoiceData.map(item =>{
-        money+=parseFloat(item.amount) || 0
-      })
-      // 保留两位小数、防止计算时精度丢失
-      money=Math.round(money*100)/100
+    if(!numerValue&&numerValue!=0&&value){
+      tempArr[index].amount=''
+      ElMessage.error('请输入数字')
+      return
+    }
+    // 如果输入不是 以.结尾&&只有一个. 或者 不是零结尾的话,就赋值为转为成数字后的值
+    // 考虑到类似12.02的情况
+    if(!((value.endsWith('.') && value.indexOf('.')==(value.length-1)) || 
+    (value.endsWith('0') && value.indexOf('.')==(value.length-2)))&&numerValue){
+      tempArr[index].amount=numerValue
+    }
+    let money=0
+    tempArr.map(item =>{
+      money+=Math.round(item.amount*100)/100 || 0
+    })
+    // 保留两位小数、防止计算时精度丢失
+    money=Math.round(money*100)/100
+    
+    if(type=='invoice'){
       contractInfo.moneyData.haveInvoiceMoney=money
-
     }else{
-      if(!numerValue&&numerValue!=0&&value){
-        placementForm.placementData[index].amount=''
-        ElMessage.error('请输入数字')
-        return
-      }
-      // 如果输入不是 以.结尾&&只有一个.的话,就赋值为转为成数字后的值
-      if(!(value.endsWith('.') && value.indexOf('.')==(value.length-1))&&numerValue){
-        placementForm.placementData[index].amount=numerValue
-      }
-
-      let money=0
-      placementForm.placementData.map(item =>{
-        money+=parseFloat(item.amount) || 0
-      })
-      // 保留两位小数、防止计算时精度丢失
-      money=Math.round(money*100)/100
       contractInfo.moneyData.havePlacementMoney=money
     }
-    
   }
   // 金额格式化,保留两位小数
   const moneyFormatter=(money)=>{
@@ -389,6 +414,7 @@
   }
   // 合规登记-提交
   const complianceSubmit=()=>{
+    console.log(contractInfo.checkedService);
     contractInfoForm.value.validate(valid=>{
       if(valid){
         if(contractInfo.checkedService.length==0){
@@ -484,6 +510,7 @@
         // 转化
         placementForm.placementData.forEach(element => {
           element.amount = parseFloat(element.amount)
+          element.invoice_date = element.invoice_date+'-01'
         });
         let param={
           contract_register_id:contractInfo.form.contract_register_id,
@@ -517,12 +544,15 @@
   }
 
 // ----------------------created
-  getSellerListFun()
-  getServiceListFun()
-
   contractInfo.form.contract_register_id = parseInt(route.query.complianceId) || ''
-  // id没有,认为是合规登记
+  // complianceId没有,认为是合规登记
   contractInfo.operationtype=contractInfo.form.contract_register_id?(route.query.type || 'compliance'):'compliance'
+  if(permissionValidation()){
+    // 权限通过
+    getSellerListFun()
+    getServiceListFun()
+  }
+
   if(contractInfo.form.contract_register_id){
     //请求详情接口
     registerDetail({contract_register_id:contractInfo.form.contract_register_id}).then(res=>{
@@ -541,15 +571,16 @@
         sign_date:res.data.sign_date,
         agreed_pay_time:res.data.agreed_pay_time,
         remark:res.data.remark,
+        register_status:res.data.register_status,
         contract_source:res.data.contract_source,
         services:res.data.service_list
       }
       contractInfo.contractValidityDate=[res.data.start_date,res.data.end_date]
-      contractInfo.checkedService=res.data.service_list.map(item => item.service_template_id)
-      contractInfo.checkedService.map(serviceId=>{
+      contractInfo.checkedService=res.data.service_list.map(item => {
+        let serviceId=item.service_template_id
         // 大套餐或者小套餐
-        if(serviceId==1 || serviceId==2)
-        serciveChange(true,serviceId,false)
+        if(serviceId==1 || serviceId==2) serciveChange(true,serviceId,false)
+        return serviceId
       })
       // 开票
       contractInfo.moneyData.allInvoiceMoney = contractInfo.moneyData.allPlacementMoney=res.data.contract_amount
@@ -565,6 +596,7 @@
           })
         })
       }
+      // 到款
       if(res.data.payment_list.length>0){
         placementForm.placementData=[]
         res.data.payment_list.map(item=>{
@@ -592,22 +624,20 @@
             }
             return rowArr;
           });
-        let paramsTemp={
-          tableHeadData:temarr[0],
-          tableData:temarr.slice(1),
-          service_template_id:samllService.service_template_id,
-          Value:samllService.value,
-          chart_permission_ids:samllService.chart_permission_ids
-        }
-          paramsTemp.tableHeadData = temarr[0];
-          paramsTemp.tableData = temarr.slice(1);
+          let paramsTemp={
+            tableHeadData:temarr[0],
+            tableData:temarr.slice(1),
+            service_template_id:samllService.service_template_id,
+            Value:samllService.value,
+            chart_permission_ids:samllService.chart_permission_ids
+          }
         if(contractInfo.serviceArray.length==0){
           let timer=setInterval(()=>{
             if(contractInfo.serviceArray.length>0){
               contractInfo.currentSmallService=paramsTemp
               clearInterval(timer)
             }
-          },200)
+          },100)
         }else{
           contractInfo.currentSmallService=paramsTemp
         }
@@ -638,11 +668,10 @@
                   <el-form-item label="合同编号" prop="contract_code" id="selectContract">
                     <el-input v-model="contractInfo.form.contract_code" placeholder="请输入合同编号"
                     v-if="(contractInfo.form.contract_source==0)"/>
-                    <el-select :teleported="false" v-optionsLoadMore="loadContractNoMore" v-model="contractInfo.form.contract_code" placeholder="请搜索合同编号" v-else
-                    filterable remote :remote-method="contractNoSearch" :loading="false" @change="selectContractNo">
+                    <scrollableSelect :loadMoreMethod="loadContractNoMore" v-model="contractInfo.form.contract_code" placeholder="请搜索合同编号" v-else
+                    :searchMethod="contractNoSearch" @change="selectContractNo" useLoading :isLoading="contractInfo.contractNoLoading">
                       <el-option :label="item.contract_code" :value="item.contract_code" v-for="item in contractInfo.contractNoArray" :key="item.contract_id"></el-option>
-                      <div style="height: 40px;width:100%;position: absolute;bottom: 0;pointer-events: none;" v-loading="contractInfo.contractNoLoading"></div>
-                    </el-select>
+                    </scrollableSelect>
                   </el-form-item>
                   <el-form-item label="客户名称" prop="company_name">
                     <el-input v-model="contractInfo.form.company_name"
@@ -663,7 +692,7 @@
                   prop="start_date">
                     <el-date-picker type="daterange" 
                     v-model="contractInfo.contractValidityDate" @change="contractValidityDateChane"
-                    start-placeholder="合同有效期-开始" range-separator="至" end-placeholder="合同有效期-结束" value-format="YYYY-MM-DD"
+                    start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYY-MM-DD"
                     :clearable="false">
                     </el-date-picker>
                   </el-form-item>
@@ -695,11 +724,13 @@
               <div class="info-row-title">套餐信息</div>
               <el-checkbox-group :disabled="contractInfo.operationtype!='compliance'"
               v-model="contractInfo.checkedService" class="info-service-box">
+                <!-- 大套餐 -->
                 <el-checkbox :label="contractInfo.serviceArray[0]?.service_template_id" @change="(e) => serciveChange(e,1)" 
                   :class="{'viewService':canServiceShow(contractInfo.serviceArray[0]?.service_template_id)}"
                 :disabled="contractInfo.serviceType==2" style="margin-right: 0;" @click="viewService(contractInfo.serviceArray[0]?.service_template_id)">
                   {{contractInfo.serviceArray[0]?.title}}
                 </el-checkbox>
+                <!-- 小套餐 -->
                 <div class="service-small">
                   <el-checkbox :label="contractInfo.serviceArray[1]?.service_template_id" @change="(e) => serciveChange(e,2)" 
                     :class="{'viewService':canServiceShow(contractInfo.serviceArray[1]?.service_template_id)}"
@@ -709,11 +740,13 @@
                   <span v-if="(contractInfo.serviceVarietyShow&&contractInfo.operationtype=='compliance')" 
                   @click="contractInfo.varietyDiaShow=true">选择品种</span>
                 </div>
+                <!-- 市场策略 -->
                 <el-checkbox :label="contractInfo.serviceArray[2]?.service_template_id" style="margin-right: 0;" 
                 @click="viewService(contractInfo.serviceArray[2]?.service_template_id)"
                  :class="{'viewService':canServiceShow(contractInfo.serviceArray[2]?.service_template_id)}">
                  {{contractInfo.serviceArray[2]?.title}}
                 </el-checkbox>
+                <!-- 财富管理 -->
                 <el-checkbox :label="contractInfo.serviceArray[3]?.service_template_id">
                   {{contractInfo.serviceArray[3]?.title}}
                 </el-checkbox>
@@ -736,7 +769,7 @@
           </div>
           <!-- 开票登记 -->
           <div class="info-box" v-if="contractInfo.operationtype!='compliance'" style="margin-top:20px ;" id="info-invoice-box">
-            <div class="info-box-head">开票登记(待开票)</div>
+            <div class="info-box-head">开票登记{{contractInfo.moneyData.waitInvoiceMoney==0?'':'(待开票)'}}</div>
             <div class="info-row" >
               <div class="info-row-title">开票信息</div>
               <div class="info-row-invoice-payment">
@@ -790,7 +823,7 @@
           </div>
           <!-- 到款登记 -->
           <div class="info-box" v-if="contractInfo.operationtype!='compliance'" style="margin-top:20px ;" id="info-invoice-box">
-            <div class="info-box-head">到款登记(待到款)</div>
+            <div class="info-box-head">到款登记{{contractInfo.moneyData.waitPlacementMoney==0?'':'(待到款)'}}</div>
             <div class="info-row" >
               <div class="info-row-title">到款信息</div>
               <div class="info-row-invoice-payment">
@@ -825,8 +858,8 @@
                       <template #default="{row,$index}">
                         <el-form-item :prop="`placementData.${$index}.invoice_date`" :show-message="false"
                         :rules="{required:true,message:()=>{ ElMessage.error('请选择到款日期')},trigger:'change'}">             
-                          <el-date-picker v-model="row.invoice_date" style="width: 124px;"
-                          placeholder="请选择月份" value-format="YYYY-MM-DD" format="YYYY-MM"></el-date-picker>
+                          <el-date-picker v-model="row.invoice_date" type="month" style="width: 124px;" :clearable="false"
+                          placeholder="请选择月份" value-format="YYYY-MM" format="YYYY-MM"></el-date-picker>
                         </el-form-item>
                       </template>
                     </el-table-column>
@@ -847,25 +880,29 @@
             </div>
           </div>
         </div>
-        <div class="contract-progress-aside">
-          <p class="progress-aside-title">登记流程</p>
+        <div class="contract-progress-aside"></div>
+      </div>
+      <!-- 登记流程 -->
+      <div class="contract-progress-detail">
+        <p class="progress-aside-title">登记流程</p>
+        <el-scrollbar style="height: calc(100% - 110px);">
           <div class="progress-box">
-            <el-timeline>
-              <el-timeline-item color="var(--themeColor)" v-for="item in contractInfo.progressList" 
-              :key="item.name" size="large" placement="top" hide-timestamp>
-                <template #dot>
-                  <div class="customize-circle-outside">
-                    <div class="customize-circle-inside"></div>
-                  </div>
-                </template>
-                <div class="progress-item-title">{{operationType[item.op_type-1]?.label}}</div>
-                <div class="progress-item-info">{{item.admin_name}}</div>
-                <div class="progress-item-info">{{item.create_time}}</div>
-                <div class="progress-item-info" v-show="item.remark">备注:{{item.remark}}</div>
-              </el-timeline-item>
-            </el-timeline>
+              <el-timeline>
+                <el-timeline-item color="var(--themeColor)" v-for="item in contractInfo.progressList" 
+                :key="item.name" size="large" placement="top" hide-timestamp>
+                  <template #dot>
+                    <div class="customize-circle-outside">
+                      <div class="customize-circle-inside"></div>
+                    </div>
+                  </template>
+                  <div class="progress-item-title">{{operationType[item.op_type-1]?.label}}</div>
+                  <div class="progress-item-info">{{item.admin_name}}</div>
+                  <div class="progress-item-info">{{item.create_time}}</div>
+                  <div class="progress-item-info" v-show="item.remark">备注:{{item.remark}}</div>
+                </el-timeline-item>
+              </el-timeline>
           </div>
-        </div>
+        </el-scrollbar>
       </div>
       <!-- 小套餐选择品种弹窗 -->
       <service-variety-dia v-model:visible="contractInfo.varietyDiaShow" @selectFinish="getVarieties" 
@@ -976,51 +1013,71 @@
         }
       }
       .contract-progress-aside{
-        background-color: white;
-        flex: 1;
+        // background-color: white;
+        width: 26vw;
         min-width: 300px;
-        .progress-aside-title{
-          font-size: 18px;
-          font-weight: bold;
-          margin: 30px;
-        }
-        .progress-box{
-          padding:0 20px 20px 70px;
-          .customize-circle-outside{
-            display: flex;
-            justify-content: center;
-            align-items: center;
-            background-color: rgba($color: $themeColor, $alpha: 0.4);
-            width: 14px;
-            left: -2px;
-            top: -4px;
-            height: 14px;
+      }
+    }
+    .contract-progress-detail{
+      background-color: white;
+      width: 26vw;
+      position: fixed;
+      right: 30px;
+      top: 90px;
+      min-width: 300px;
+      border: 1px solid #E8E8E8;
+      height: calc(100vh - 120px);
+      z-index: 2;
+      .progress-aside-title{
+        font-size: 18px;
+        font-weight: bold;
+        margin: 30px 30px 20px;
+      }
+      .progress-box{
+        margin-top: 10px;
+        padding:0 20px 20px 70px;
+        .customize-circle-outside{
+          display: flex;
+          justify-content: center;
+          align-items: center;
+          background-color: rgba($color: $themeColor, $alpha: 0.4);
+          width: 14px;
+          left: -2px;
+          top: -4px;
+          height: 14px;
+          border-radius: 50%;
+          position: absolute;
+          .customize-circle-inside{
+            background-color:$themeColor;
+            width: 6px;
+            height: 6px;
             border-radius: 50%;
-            position: absolute;
-            .customize-circle-inside{
-              background-color:$themeColor;
-              width: 6px;
-              height: 6px;
-              border-radius: 50%;
-            }
           }
-          .progress-item-title{
-            font-weight: bold;
-            font-size: 16px;
-            color: #333;
-            margin-bottom: 8px;
-          }
-          .progress-item-info{
-            font-size: 14px;
-            color:#666;
-            margin-bottom: 8px;
-            &:last-child{
-              margin-bottom: 0;
-            }
+        }
+        .progress-item-title{
+          font-weight: bold;
+          font-size: 16px;
+          color: #333;
+          margin-bottom: 8px;
+        }
+        .progress-item-info{
+          font-size: 14px;
+          color:#666;
+          margin-bottom: 8px;
+          &:last-child{
+            margin-bottom: 0;
           }
         }
       }
     }
+    @media screen and (max-width:1023px) {
+      .contract-progress-aside{
+        display: none;
+      }
+      .contract-progress-detail{
+        position: sticky;
+      }
+    } 
     .contract-operation{
       text-align: center;
       padding: 100px 30px 30px;

+ 21 - 43
src/views/financialManagement/financialList.vue

@@ -3,10 +3,14 @@ import { Search } from '@element-plus/icons-vue'
 import {useRouter,useRoute} from 'vue-router'
 import {getServiceList,getRegisterList,updateRegisterStatus,
   registerDelete,registerListExport} from '@/api/financialMana'
+import {downloadByFlow} from '@/utils/common-methods'
 
 const router = useRouter()
 const route = useRoute()
-  const changeStatusForm=ref(null)
+const changeStatusForm=ref(null)
+const contractTypeArray=[{id:1,label:"新签"},{id:2,label:"续约"}]
+const contractStatusArray=[{id:1,label:"已审批"},{id:2,label:"单章寄回"},{id:3,label:"已签回"}]
+const statusArray=[{id:1,label:"进行中"},{id:2,label:"已完成"}]
 
   const financial=reactive({
     searchParams:{
@@ -19,7 +23,8 @@ const route = useRoute()
       page_size:10,
       current:1,
     },
-    // updateTime:'',
+    // 创建时间数组
+    createtime:[],
     tableData:[],
     serviceTypeArray:[],
     total:100,
@@ -45,12 +50,9 @@ const route = useRoute()
     },
     currentStatusRow:{}
   })
-  const contractTypeArray=[{id:1,label:"新签"},{id:2,label:"续约"}]
-  const contractStatusArray=[{id:1,label:"已审批"},{id:2,label:"单章寄回"},{id:3,label:"已签回"}]
-  const statusArray=[{id:1,label:"进行中"},{id:2,label:"已完成"}]
 
   // 监听
-  watch(()=>financial.updateTime,(newVal)=>{
+  watch(()=>financial.createtime,(newVal)=>{
     if(!newVal){
       financial.searchParams.start_date=''
       financial.searchParams.end_date=''
@@ -68,7 +70,7 @@ const route = useRoute()
       financial.serviceTypeArray=res.data || []
     })
   }
-
+  // 请求财务列表
   const financialList=()=>{
     // console.log(financial.searchParams);
     getRegisterList(financial.searchParams).then(res=>{
@@ -96,45 +98,19 @@ const route = useRoute()
   // 确认筛选操作
   const checkedConfirm=()=>{
     financial.tabelColumnShowArr = financial.tabelColumnCheckedArr
+    // 保存 选中的表格列,在退出登录的时候清除掉
+    sessionStorage.setItem('financialListColumn',financial.tabelColumnShowArr)
     financial.showColumnCheck=false
   }
 
   // 合规、开票、到账登记
-  const registration=(type,id)=>{
-    // console.log(type,id);
-  
+  const registration=(type,id)=>{  
     router.push({path:'/financial/list/contractProgress',query:{type,complianceId:id}})
   }
   // 导出数据
   const exportData=()=>{
     registerListExport(financial.searchParams).then(res=>{
-    // switch (mime) { // 获取后缀对应的 mime
-    //   case 'png': fileTypeMime = 'image/png'; break;
-    //   case 'doc': fileTypeMime = 'application/msword'; break;
-    //   case 'docx': fileTypeMime = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; break;
-    //   case 'jpg': case 'jpeg': fileTypeMime = 'image/jpeg'; break;
-    //   case 'gif': fileTypeMime = 'image/gif'; break;
-    //   case 'svg': fileTypeMime = 'image/svg+xml'; break;
-    //   case 'tif': case 'tiff': fileTypeMime = 'image/tiff'; break;
-    //   case 'txt': fileTypeMime = 'text/plain'; break;
-    //   case 'ppt': fileTypeMime = 'application/vnd.ms-powerpoint'; break;
-    //   case 'pptx': fileTypeMime = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'; break;
-    //   case 'xls': fileTypeMime = 'application/vnd.ms-excel'; break;
-    //   case 'xlsx': fileTypeMime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; break;
-    //   case 'zip': fileTypeMime = 'application/zip'; break;
-    //   case '7z': fileTypeMime = 'application/x-7z-compressed'; break;
-    // }
-    let blob = window.URL.createObjectURL(new Blob([res], {
-      'type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
-    }))
-    let link = document.createElement('a')
-    link.style.display = 'none'
-    link.href = blob
-    link.setAttribute('download', `财务列表.xlsx`)
-    document.body.appendChild(link)
-    link.click()
-    document.body.removeChild(link) //下载完成移除元素
-    window.URL.revokeObjectURL(blob) //释放掉 blob 对象
+      downloadByFlow(res,'xlsx','财务列表')
     })
   }
   // 显示开票详情
@@ -191,6 +167,8 @@ const route = useRoute()
   //  ---------------------created
   getServiceListFun()
   financialList()
+  // 获取sessionStorage里面储存的表格选中列项
+  financial.tabelColumnShowArr=sessionStorage.getItem('financialListColumn')?sessionStorage.getItem('financialListColumn').split(','):[]
 </script>
 
 <template>
@@ -202,8 +180,8 @@ const route = useRoute()
           <div class="financial-search-zone">
             <el-input v-model="financial.searchParams.keyword" placeholder="合同编号/客户姓名/销售" :prefix-icon="Search"
             style="width: 286px;margin-bottom: 8px;" @input="searchFinancial" clearable />
-            <el-date-picker v-model="financial.updateTime" start-placeholder="合同创建日期"
-            end-placeholder="合同创建日期" style="margin-right: 30px;max-width: 286px;margin-bottom: 8px;"
+            <el-date-picker v-model="financial.createtime" start-placeholder="登记日期-开始"
+            end-placeholder="登记日期-结束" style="margin-right: 30px;max-width: 286px;margin-bottom: 8px;"
             value-format="YYYY-MM-DD" type="daterange"></el-date-picker>
             <el-select v-model="financial.searchParams.service_type" placeholder="请选择套餐类型" clearable
             @change="searchFinancial" style="width: 286px;margin-bottom: 8px;">
@@ -256,8 +234,6 @@ const route = useRoute()
                   {{contractStatusArray[row.contract_status-1].label}}
                 </template>
               </el-table-column>
-              <!-- <el-table-column label="合同状态更新时间" align="center" width="170" prop="contractStatusTime"
-              v-if="financial.tabelColumnShowArr.includes('contractStatusTime')"></el-table-column> -->
               <el-table-column label="已开票金额" align="center" prop="invoiced_amount" width="100">
                 <template #default="{row}">
                   <span style="color: var(--themeColor);cursor: pointer;" @click="invoiceDetail(row)">{{row.invoiced_amount}}</span>
@@ -275,6 +251,8 @@ const route = useRoute()
                   {{statusArray[row.register_status-1].label}}
                 </template>
               </el-table-column>
+              <el-table-column label="登记时间" v-if="financial.tabelColumnShowArr.includes('create_time')"
+               align="center" prop="create_time" width="165"></el-table-column>
               <el-table-column label="操作"  fixed="right" width="120">
                 <template #header>
                   <div class="table-column-select">
@@ -290,7 +268,7 @@ const route = useRoute()
                         <el-checkbox label="contractDate">合同有效期</el-checkbox>
                         <el-checkbox label="agreed_pay_time">约定付款时间</el-checkbox>
                         <el-checkbox label="sign_date">签订日</el-checkbox>
-                        <!-- <el-checkbox label="contractStatusTime">合同状态更新时间</el-checkbox> -->
+                        <el-checkbox label="create_time">登记时间</el-checkbox>
                         <el-checkbox label="remark">备注</el-checkbox>
                       </el-checkbox-group>
                       <el-button style="float: right;" @click="checkedConfirm">确认</el-button>
@@ -376,7 +354,7 @@ const route = useRoute()
   
 <style lang="scss" scoped>
   .financial-list-container{
-    height: 100%;
+    min-height: 100%;
     .financial-search-zone{
       display: flex;
       align-items: center;

+ 1 - 1
src/views/systemManagement/departmentM.vue

@@ -219,7 +219,7 @@ import {getDepartmentList,addDepartment,editDepartment,deleteDepartment} from '@
   
 <style lang="scss" scoped>
   .system-department-container{
-    height: 100%;
+    min-height: 100%;
     .department-container{
       overflow: hidden;
       .department-container-header{

+ 1 - 1
src/views/systemManagement/menuM.vue

@@ -391,7 +391,7 @@ const IconsAll=Object.keys(ElementPlusIconsVue).map(key=> key)
   
 <style lang="scss" scoped>
   .system-menu-container{
-    height: 100%;
+    min-height: 100%;
     .menu-container{
       overflow: hidden;
       .menu-container-header{

+ 30 - 9
src/views/systemManagement/roleM.vue

@@ -1,7 +1,7 @@
 <script setup>
 import { Search } from '@element-plus/icons-vue'
 import { ElMessage,ElMessageBox } from 'element-plus';
-import {getRoleList,addRoleApi,deleteRoleApi} from '@/api/systemMana'
+import {getRoleList,addRoleApi,deleteRoleApi,editRoleApi} from '@/api/systemMana'
 import {useRouter,useRoute} from 'vue-router'
 
 const router = useRouter()
@@ -15,9 +15,11 @@ const route = useRoute()
     tableData:[],
     total:0,
     showDialog:false,
+    dialogTitle:'',
     // ---------添加弹窗
     addForm:{
-      role_name:''
+      role_name:'',
+      role_id:''
     }
   })
   const addRoleForm = ref()
@@ -32,6 +34,15 @@ const route = useRoute()
       }
     })
   }
+
+  //新增/编辑角色 弹窗
+  const openEditRoleDia=(roleName,roleId)=>{
+    if(roleId) role.dialogTitle='编辑角色'
+    else role.dialogTitle='添加角色'
+    role.addForm.role_name=roleName
+    role.addForm.role_id=roleId
+    role.showDialog=true
+  }
   // 切换每页的数量
   const changePageSize=(pageSize)=>{
     role.searchParams.page_size = pageSize
@@ -60,13 +71,19 @@ const route = useRoute()
   const submitForm=()=>{
     addRoleForm.value.validate((vaild)=>{
       if(vaild){
-        addRoleApi(role.addForm).then(res=>{
-          if(res.code==200){
+        if(role.addForm.role_id){
+          editRoleApi(role.addForm).then(res=>{
+            ElMessage.success('编辑角色成功')
+            role.showDialog=false
+            refreshList()
+          })
+        }else{
+          addRoleApi(role.addForm).then(res=>{
             ElMessage.success('添加角色成功')
             role.showDialog=false
             refreshList()
-          }
-        })
+          })
+        }
       }
     })
   }
@@ -110,7 +127,7 @@ const route = useRoute()
         <div class="role-container">
           <div class="role-container-header">
             <div class="role-container-header-buttons">
-              <el-button type="primary" @click="role.showDialog=true" class="header-optios-buttons" v-permission="'system:role:add'">
+              <el-button type="primary" @click="openEditRoleDia('')" class="header-optios-buttons" v-permission="'system:role:add'">
                 添加角色
               </el-button>
               <el-button type="primary" @click="premission('set')" class="header-optios-buttons" v-permission="'system:role:setPermission'"
@@ -137,6 +154,10 @@ const route = useRoute()
                       v-permission="'system:role:viewPermission'">
                       查看权限
                     </span>
+                    <span class="table-option-buttons" @click="openEditRoleDia(scope.row.role_name,scope.row.role_id)" 
+                      v-permission="'system:role:viewPermission'">
+                      编辑
+                    </span>
                     <span class="table-option-buttons" style="color:#C54322;" 
                     @click="deleteRole(scope.row)" v-permission="'system:role:delete'">
                       删除
@@ -158,7 +179,7 @@ const route = useRoute()
           </div>
         </div>
         <!-- 添加角色弹窗 -->
-        <el-dialog v-model="role.showDialog" title="添加角色" width="400px" :close-on-click-modal="false"
+        <el-dialog v-model="role.showDialog" :title="role.dialogTitle" width="400px" :close-on-click-modal="false"
         @closed="closeDia">
           <el-form ref="addRoleForm" :model="role.addForm">
             <el-form-item prop="role_name" label="角色名称" :rules="[{required:true,message:'角色名称不能为空',trigger:'blur'}]">
@@ -178,7 +199,7 @@ const route = useRoute()
   
 <style lang="scss" scoped>
   .system-role-container{
-    height: 100%;
+    min-height: 100%;
     .role-container{
       overflow: hidden;
       .role-container-header{

+ 1 - 1
src/views/systemManagement/rolePermission.vue

@@ -390,7 +390,7 @@ const router = useRouter()
   
 <style lang="scss" scoped>
   .role-permisson-contaner{
-    height: 100%;
+    min-height: 100%;
     .role-permisson-box{
       height: calc(100% - 70px);
       padding: 20px;

+ 1 - 1
src/views/systemManagement/userM.vue

@@ -469,7 +469,7 @@ const userStatus=[{value:1,label:'启用'},{value:0,label:'禁用'}]
   
 <style lang="scss" scoped>
   .system-user-container{
-    height: 100%;
+    min-height: 100%;
     display: flex;
     .user-container-left{
       padding:20px;

+ 1 - 1
vite.config.js

@@ -88,7 +88,7 @@ export default defineConfig({
     host:true
   },
   build:{
-    outDir: 'fsms_web',
+    outDir: 'hongze_fsms_web',
     minify:'terser',
     terserOptions:{
       compress:{