YangJian0701 1 gadu atpakaļ
vecāks
revīzija
da52d41554

+ 7 - 6
.env

@@ -1,8 +1,9 @@
-VITE_BZD_ERP_APP_TITLE = 'ERP宝智达'
-
+# VITE_BZD_ERP_APP_TITLE = 'ERP宝智达'
 # VITE_BZD_ERP_APP_API = 'https://erp.baozhida.cn'
-VITE_BZD_ERP_APP_API = 'https://erp.baozhida.cn'
-
-VITE_BZD_ERPOSS_APP_API = 'https://erposs.baozhida.cn'
+# VITE_BZD_ERPOSS_APP_API = 'https://erposs.baozhida.cn'
 
-VITE_DROP_CONSOLE = true    
+VITE_DROP_CONSOLE = true    #去除打印 debugger
+NODE_ENV = 'development'
+VITE_APP_TITLE = 'ERP宝智达'
+VITE_APP_BASE_API = '/api'
+VITE_SERVE = 'https://erp.baozhida.cn'

+ 12 - 0
.env.development

@@ -0,0 +1,12 @@
+# VITE_BZD_ERP_APP_TITLE = 'ERP宝智达'
+
+# VITE_BZD_ERP_APP_API = 'https://erptest.baozhida.cn'
+
+# VITE_BZD_ERPOSS_APP_API = 'https://erposs.baozhida.cn'
+
+
+VITE_DROP_CONSOLE = true #去除打印 debugger
+NODE_ENV = 'development'
+VITE_APP_TITLE = 'ERP宝智达'
+VITE_APP_BASE_API = '/api'
+VITE_SERVE = 'https://erptest.baozhida.cn'

+ 11 - 3
.env.production

@@ -1,7 +1,15 @@
-VITE_BZD_ERP_APP_TITLE = 'ERP宝智达'
+# VITE_BZD_ERP_APP_TITLE = 'ERP宝智达'
+
+# VITE_BZD_ERP_APP_API = 'https://erp.baozhida.cn'
+
 
-VITE_BZD_ERP_APP_API = 'https://erp.baozhida.cn'
 
+
+VITE_DROP_CONSOLE = true #去除打印 debugger
+
+NODE_ENV = 'production'
+VITE_BZD_ERP_APP_TITLE = 'ERP宝智达'
+VITE_APP_BASE_API = '/api'
+VITE_SERVE = 'https://erp.baozhida.cn'
 VITE_BZD_ERPOSS_APP_API = 'https://erposs.baozhida.cn'
 
-VITE_DROP_CONSOLE = true

BIN
ERP.rar


+ 5 - 0
components.d.ts

@@ -12,6 +12,8 @@ declare module '@vue/runtime-core' {
     404: typeof import('./src/components/ErrorMessage/404.vue')['default']
     Dialog: typeof import('./src/components/dialog/Dialog.vue')['default']
     Drawer: typeof import('./src/components/Drawer/index.vue')['default']
+    EchartBar: typeof import('./src/components/echart/echart-bar.vue')['default']
+    EchartLine: typeof import('./src/components/echart/echart-line.vue')['default']
     ElAside: typeof import('element-plus/es')['ElAside']
     ElAvatar: typeof import('element-plus/es')['ElAvatar']
     ElBadge: typeof import('element-plus/es')['ElBadge']
@@ -50,7 +52,9 @@ declare module '@vue/runtime-core' {
     ElRow: typeof import('element-plus/es')['ElRow']
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
     ElSelect: typeof import('element-plus/es')['ElSelect']
+    ElStatistic: typeof import('element-plus/es')['ElStatistic']
     ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
+    ElSwitch: typeof import('element-plus/es')['ElSwitch']
     ElTable: typeof import('element-plus/es')['ElTable']
     ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
     ElTabPane: typeof import('element-plus/es')['ElTabPane']
@@ -64,6 +68,7 @@ declare module '@vue/runtime-core' {
     Pagination: typeof import('./src/components/TableBase/components/Pagination.vue')['default']
     RouterLink: typeof import('vue-router')['RouterLink']
     RouterView: typeof import('vue-router')['RouterView']
+    Statistic: typeof import('./src/components/echart/Statistic.vue')['default']
     TableBase: typeof import('./src/components/TableBase/index.vue')['default']
     Upimg: typeof import('./src/components/upImg/upimg.vue')['default']
     Upload: typeof import('./src/components/Upload/index.vue')['default']

+ 1 - 0
package.json

@@ -15,6 +15,7 @@
     "animate.css": "^4.1.1",
     "axios": "^1.3.4",
     "dayjs": "^1.11.7",
+    "echarts": "^5.4.3",
     "el-table-infinite-scroll": "^3.0.1",
     "element-plus": "^2.3.4",
     "js-md5": "^0.7.3",

+ 8 - 0
src/App.vue

@@ -1,6 +1,14 @@
 <script setup lang="ts">
 import { ElConfigProvider } from 'element-plus'
 import zh from 'element-plus/lib/locale/lang/zh-cn'
+
+import { provide } from "vue";
+import * as echarts from 'echarts'
+provide('echarts ',echarts )
+
+
+
+
 </script>
 
 <template>

+ 5 - 5
src/api/Reimburse/index.ts

@@ -1,18 +1,18 @@
 import $http from '../index'
 // 列表 === 我的报销列表
-export const Reimburse_UserList = (params: any) => $http.post('/api/salary/Reimburse/User/List', params)
+export const Reimburse_UserList = (params: any) => $http.post('/salary/Reimburse/User/List', params)
 
 
 
 //报销列表
-export const Reimburse_List = (params: any) => $http.post('/api/salary/Reimburse/List', params)
+export const Reimburse_List = (params: any) => $http.post('/salary/Reimburse/List', params)
 
 //报销详情
-export const Reimburse_Get = (params: any) => $http.post('/api/salary/Reimburse/Get', params)
+export const Reimburse_Get = (params: any) => $http.post('/salary/Reimburse/Get', params)
 
-export const Reimburse_Edit = (params: any) => $http.post('/api/salary/Reimburse/Edit_Remit', params)
+export const Reimburse_Edit = (params: any) => $http.post('/salary/Reimburse/Edit_Remit', params)
 
-export const Reimburse_Audit = (params: any) => $http.post('/api/salary/Reimburse/Edit_Audit', params)
+export const Reimburse_Audit = (params: any) => $http.post('/salary/Reimburse/Edit_Audit', params)
 
 
 

+ 8 - 8
src/api/ReimburseMy/index.ts

@@ -1,27 +1,27 @@
 import $http from '../index'
 // 列表 === 我的报销列表
-export const ReimburseMy_List = (params: any) => $http.post('/api/salary/Reimburse/User_List', params)
+export const ReimburseMy_List = (params: any) => $http.post('/salary/Reimburse/User_List', params)
 
 
 //删除报销
-export const ReimburseMy_Del = (params: any) => $http.post('/api/salary/Reimburse/Del', params)
+export const ReimburseMy_Del = (params: any) => $http.post('/salary/Reimburse/Del', params)
 
 //添加报销
-export const ReimburseMy_Add = (params: any) => $http.post('/api/salary/Reimburse/Add', params)
+export const ReimburseMy_Add = (params: any) => $http.post('/salary/Reimburse/Add', params)
 
 //编辑报销
-export const ReimburseMy_Edit = (params: any) => $http.post('/api/salary/Reimburse/Edit', params)
+export const ReimburseMy_Edit = (params: any) => $http.post('/salary/Reimburse/Edit', params)
 
 //添加报销
-export const ReimburseMy_Get = (params: any) => $http.post('/api/salary/Reimburse/Get', params)
+export const ReimburseMy_Get = (params: any) => $http.post('/salary/Reimburse/Get', params)
 
 //费用类型列表
-export const ReimburseMy_FeeType = (params: any) => $http.post('/api/salary/Reimburse/FeeType/List', params)
+export const ReimburseMy_FeeType = (params: any) => $http.post('/salary/Reimburse/FeeType/List', params)
 
 //费用明细列表
-export const ReimburseMy_FeeDetails = (params: any) => $http.post('/api/salary/Reimburse/FeeDetails/List', params)
+export const ReimburseMy_FeeDetails = (params: any) => $http.post('/salary/Reimburse/FeeDetails/List', params)
 
 //提交审核
-export const ReimburseMy_Submit = (params: any) => $http.post('/api/salary/Reimburse/Submit_Audit', params)
+export const ReimburseMy_Submit = (params: any) => $http.post('/salary/Reimburse/Submit_Audit', params)
 
 

+ 1 - 1
src/api/apiMapList.ts

@@ -1 +1 @@
-export const mapList = ["/api/salary/Reimburse/Add","/api/salary/Reimburse/Edit"]
+export const mapList = ["/salary/Reimburse/Add","/salary/Reimburse/Edit"]

+ 5 - 0
src/api/contractStat/index.ts

@@ -0,0 +1,5 @@
+import $http from '../index'
+
+// 项目列表(财务)
+export const Contract_Stat_Year = (params: any) => $http.post('/storage/Contract/Stat', params)
+

+ 16 - 5
src/api/index.ts

@@ -12,13 +12,16 @@ type LoadingType = {
 let loadingInstance: LoadingType = {}
 const config = {
   // 默认地址请求地址,可在 .env.*** 文件中修改
-  baseURL: process.env.NODE_ENV ? '' : (import.meta.env.VITE_BZD_ERP_APP_API as string),
+  // baseURL: process.env.NODE_ENV ?(import.meta.env.VITE_BZD_ERP_APP_API as string) : '' ,
+
+  baseURL:import.meta.env.VITE_SERVE + import.meta.env.VITE_APP_BASE_API,
+
+
   // 设置超时时间(10s)
   timeout: ResultEnum.TIMEOUT as number,
   // 跨域时候允许携带凭证
-  withCredentials: true,
+  withCredentials: false,
 }
-
 class RequestHttp {
   service: AxiosInstance
   public constructor(config: AxiosRequestConfig) {
@@ -30,6 +33,7 @@ class RequestHttp {
      * 客户端发送请求 -> [请求拦截器] -> 服务器
      * token校验(JWT) : 接受服务器返回的token,存储到vuex/pinia/本地储存当中
      */
+   
     this.service.interceptors.request.use(
       (config: InternalAxiosRequestConfig) => {
         // const globalStore = GlobalStore()
@@ -46,7 +50,15 @@ class RequestHttp {
         // if (globalStore.GET_User_tokey) {
         //   config.headers['User_tokey'] = globalStore.GET_User_tokey
         // }
-        // console.log('请求体',config);
+        const globalStore = GlobalStore()
+        
+        if (config.data==undefined){
+          config.data = {User_tokey:globalStore.GET_User_tokey}
+        }else{
+          if (!Object.keys(config.data).includes('User_tokey')) {
+            config.data.User_tokey = globalStore.GET_User_tokey
+          }
+        }
         // config.data = Qs(config.data)
         mapList.includes(config.url as string)?config.headers['Content-Type'] = ContentType.JSON:config.headers['Content-Type'] = ContentType.URLENCODED
         return config
@@ -62,7 +74,6 @@ class RequestHttp {
       (response: AxiosResponse) => {
         const { data } = response
         const globalStore = GlobalStore()
-
         // * 在请求结束后,并关闭请求 loading
         // loadingInstance.close && loadingInstance.close()
         // 无权限访问 || 登录密码错误(code == 202)

+ 10 - 10
src/api/project/index.ts

@@ -1,22 +1,22 @@
 import $http from '../index'
 
 // 项目列表(财务)
-export const Project_Finance_List = (params: any) => $http.post('/api/project/Project/Finance_List', params)
+export const Project_Finance_List = (params: any) => $http.post('/project/Project/Finance_List', params)
 // 项目列表
-export const Project_List = (params: any) => $http.post('/api/project/Project/List', params)
+export const Project_List = (params: any) => $http.post('/project/Project/List', params)
 // 审批
-export const Project_Approval = (params: any) => $http.post('/api/project/Project/Approval', params)
+export const Project_Approval = (params: any) => $http.post('/project/Project/Approval', params)
 // 我的项目
-export const Project_Project_User_list = (params: any) => $http.post('/api/project/Project/User_list', params)
+export const Project_Project_User_list = (params: any) => $http.post('/project/Project/User_list', params)
 // 详情
-export const Project_Get = (params: any) => $http.post('/api/project/Project/Get', params)
+export const Project_Get = (params: any) => $http.post('/project/Project/Get', params)
 // 立项申请
-export const Project_Add = (params: any) => $http.post('/api/project/Project/Add', params)
+export const Project_Add = (params: any) => $http.post('/project/Project/Add', params)
 // 编辑
-export const Project_Edit = (params: any) => $http.post('/api/project/Project/Edit', params)
+export const Project_Edit = (params: any) => $http.post('/project/Project/Edit', params)
 // 删除
-export const Project_Del = (params: any) => $http.post('/api/project/Project/Del', params)
+export const Project_Del = (params: any) => $http.post('/project/Project/Del', params)
 // 左侧用户列表
-export const Project_User_List = (params: any) => $http.post('/api/project/User/List', params)
+export const Project_User_List = (params: any) => $http.post('/project/User/List', params)
 // 导出word
-export const Project_Word = (params: any) => $http.post('/api/project/Project/Word', params)
+export const Project_Word = (params: any) => $http.post('/project/Project/Word', params)

+ 1 - 1
src/api/public/index.ts

@@ -1,4 +1,4 @@
 import $http from '../index'
 
 // 文件上传
-export const UpFileToken = (params: any) => $http.post('/api/user/UpFileToken', params)
+export const UpFileToken = (params: any) => $http.post('/user/UpFileToken', params)

+ 9 - 9
src/api/role/index.ts

@@ -1,20 +1,20 @@
 import $http from '../index'
 
 // 获取列表
-export const User_Power_List = (params: any) => $http.post('/api/user/Power/List', params)
+export const User_Power_List = (params: any) => $http.post('/user/Power/List', params)
 // 权限系统列表
-export const User_Sys_List = (params: any) => $http.post('/api/user/Power/Sys_List', params)
+export const User_Sys_List = (params: any) => $http.post('/user/Power/Sys_List', params)
 // 弹框菜单
-export const Menu_List = (params: any): any => $http.post('/api/user/Menu/List', params)
+export const Menu_List = (params: any): any => $http.post('/user/Menu/List', params)
 // 左侧菜单栏
-export const Menu_User_List = (params: any) => $http.post('/api/user/Menu/User_List', params)
+export const Menu_User_List = (params: any) => $http.post('/user/Menu/User_List', params)
 // 添加角色名
-export const User_Power_Add = (params: any): any => $http.post('/api/user/Power/Add', params)
+export const User_Power_Add = (params: any): any => $http.post('/user/Power/Add', params)
 // 编辑角色名
-export const User_Power_Edit = (params: any): any => $http.post('/api/user/Power/Edit', params)
+export const User_Power_Edit = (params: any): any => $http.post('/user/Power/Edit', params)
 // 删除角色名
-export const User_Power_Del = (params: any): any => $http.post('/api/user/Power/Del', params)
+export const User_Power_Del = (params: any): any => $http.post('/user/Power/Del', params)
 // 编辑菜单
-export const User_Power_Edit_Menu = (params: any): any => $http.post('/api/user/Power/Edit_Menu', params)
+export const User_Power_Edit_Menu = (params: any): any => $http.post('/user/Power/Edit_Menu', params)
 // 获取用户权限
-export const User_Power_Get = (params: any): any => $http.post('/api/user/Power/Get', params)
+export const User_Power_Get = (params: any): any => $http.post('/user/Power/Get', params)

+ 7 - 7
src/api/salary/index.ts

@@ -1,15 +1,15 @@
 import $http from '../index'
 // 列表 === 薪资统计
-export const Salary_List = (params: any) => $http.post('/api/salary/Salary/List', params)
+export const Salary_List = (params: any) => $http.post('/salary/Salary/List', params)
 // 员工列表
-export const Salary_User_List = (params: any) => $http.post('/api/salary/Salary/User_List', params)
+export const Salary_User_List = (params: any) => $http.post('/salary/Salary/User_List', params)
 // 获取最新的数据
-export const Salary_Get = (params: any) => $http.post('/api/salary/Salary/Get', params)
+export const Salary_Get = (params: any) => $http.post('/salary/Salary/Get', params)
 // 员工薪资
-export const Salary_User_Get = (params: any) => $http.post('/api/salary/Salary/User_Get', params)
+export const Salary_User_Get = (params: any) => $http.post('/salary/Salary/User_Get', params)
 // 发布
-export const Salary_Send = (params: any) => $http.post('/api/salary/Salary/Send', params)
+export const Salary_Send = (params: any) => $http.post('/salary/Salary/Send', params)
 // 添加
-export const Salary_Post = (params: any) => $http.post('/api/salary/Salary/Post', params)
+export const Salary_Post = (params: any) => $http.post('/salary/Salary/Post', params)
 // 导出Excel
-export const Salary_Excel = (params?: any) => $http.post('/api/salary/Salary/Excel', params)
+export const Salary_Excel = (params?: any) => $http.post('/salary/Salary/Excel', params)

+ 50 - 50
src/api/storehouse/index.ts

@@ -4,144 +4,144 @@ import $http from '../index'
  * 仓库
  */
 // 仓库列表
-export const Storehouse_Depot_List = (params: any) => $http.post('/api/storage/Depot/List', params)
+export const Storehouse_Depot_List = (params: any) => $http.post('/storage/Depot/List', params)
 // 仓库添加
-export const Storehouse_Depot_Add = (params: any) => $http.post('/api/storage/Depot/Add', params)
+export const Storehouse_Depot_Add = (params: any) => $http.post('/storage/Depot/Add', params)
 // 仓库修改
-export const Storehouse_Depot_Edit = (params: any) => $http.post('/api/storage/Depot/Edit', params)
+export const Storehouse_Depot_Edit = (params: any) => $http.post('/storage/Depot/Edit', params)
 // 仓库删除
-export const Storehouse_Depot_Del = (params: any) => $http.post('/api/storage/Depot/Del', params)
+export const Storehouse_Depot_Del = (params: any) => $http.post('/storage/Depot/Del', params)
 
 /**
  * 产品分类
  */
 // 产品列表
-export const Storehouse_ProductClass_List = (params: any) => $http.post('/api/storage/ProductClass/List', params)
+export const Storehouse_ProductClass_List = (params: any) => $http.post('/storage/ProductClass/List', params)
 // 产品添加
-export const Storehouse_ProductClass_Add = (params: any) => $http.post('/api/storage/ProductClass/Add', params)
+export const Storehouse_ProductClass_Add = (params: any) => $http.post('/storage/ProductClass/Add', params)
 // 产品修改
-export const Storehouse_ProductClass_Edit = (params: any) => $http.post('/api/storage/ProductClass/Edit', params)
+export const Storehouse_ProductClass_Edit = (params: any) => $http.post('/storage/ProductClass/Edit', params)
 // 产品删除
-export const Storehouse_ProductClass_Del = (params: any) => $http.post('/api/storage/ProductClass/Del', params)
+export const Storehouse_ProductClass_Del = (params: any) => $http.post('/storage/ProductClass/Del', params)
 
 /**
  * 产品
  */
 // 产品名称
-export const Storehouse_Product_Name_List = (params: any) => $http.post('/api/storage/Product/Name_List', params)
+export const Storehouse_Product_Name_List = (params: any) => $http.post('/storage/Product/Name_List', params)
 // 产品型号
-export const Storehouse_Product_Model_List = (params: any) => $http.post('/api/storage/Product/Model_List', params)
+export const Storehouse_Product_Model_List = (params: any) => $http.post('/storage/Product/Model_List', params)
 // 产品规格
-export const Storehouse_Product_Spec_List = (params: any) => $http.post('/api/storage/Product/Spec_List', params)
+export const Storehouse_Product_Spec_List = (params: any) => $http.post('/storage/Product/Spec_List', params)
 // 产品列表  - 验证合同产品列表-不分页
-export const Storehouse_Product_List = (params: any) => $http.post('/api/storage/Product/List', params)
+export const Storehouse_Product_List = (params: any) => $http.post('/storage/Product/List', params)
 // 产品添加
-export const Storehouse_Product_Add = (params: any) => $http.post('/api/storage/Product/Add', params)
+export const Storehouse_Product_Add = (params: any) => $http.post('/storage/Product/Add', params)
 // 产品修改
-export const Storehouse_Product_Edit = (params: any) => $http.post('/api/storage/Product/Edit', params)
+export const Storehouse_Product_Edit = (params: any) => $http.post('/storage/Product/Edit', params)
 // 产品删除
-export const Storehouse_Product_Del = (params: any) => $http.post('/api/storage/Product/Del', params)
+export const Storehouse_Product_Del = (params: any) => $http.post('/storage/Product/Del', params)
 
 /**
  * 物联网卡
  */
 // 物联网卡列表
-export const Storehouse_IotCard_List = (params: any) => $http.post('/api/storage/IotCard/List', params)
+export const Storehouse_IotCard_List = (params: any) => $http.post('/storage/IotCard/List', params)
 // 物联网卡添加
-export const Storehouse_IotCard_Add = (params: any) => $http.post('/api/storage/IotCard/Add', params)
+export const Storehouse_IotCard_Add = (params: any) => $http.post('/storage/IotCard/Add', params)
 // 物联网卡编辑
-export const Storehouse_IotCard_Edit = (params: any) => $http.post('/api/storage/IotCard/Edit', params)
+export const Storehouse_IotCard_Edit = (params: any) => $http.post('/storage/IotCard/Edit', params)
 // 物联网卡删除
-export const Storehouse_IotCard_Del = (params: any) => $http.post('/api/storage/IotCard/Del', params)
+export const Storehouse_IotCard_Del = (params: any) => $http.post('/storage/IotCard/Del', params)
 
 /**
  * 销售管理 -> 合同
  */
 // 合同列表
-export const Storehouse_Contract_List = (params: any) => $http.post('/api/storage/Contract/List', params)
+export const Storehouse_Contract_List = (params: any) => $http.post('/storage/Contract/List', params)
 // 生成合同编号
-export const Storehouse_Contract_Gen_Number = (params: any) => $http.post('/api/storage/Contract/Gen_Number', params)
+export const Storehouse_Contract_Gen_Number = (params: any) => $http.post('/storage/Contract/Gen_Number', params)
 // 合同-销售
-export const Storehouse_Contract_User_List = (params: any) => $http.post('/api/storage/Contract/User_List', params)
+export const Storehouse_Contract_User_List = (params: any) => $http.post('/storage/Contract/User_List', params)
 // 详情
-export const Storehouse_Contract_Get = (params: any) => $http.post('/api/storage/Contract/Get', params)
+export const Storehouse_Contract_Get = (params: any) => $http.post('/storage/Contract/Get', params)
 // 审批
-export const Storehouse_Contract_Approval = (params: any) => $http.post('/api/storage/Contract/Approval', params)
+export const Storehouse_Contract_Approval = (params: any) => $http.post('/storage/Contract/Approval', params)
 // 添加
-export const Storehouse_Contract_Add = (params: any) => $http.post('/api/storage/Contract/Add', params)
+export const Storehouse_Contract_Add = (params: any) => $http.post('/storage/Contract/Add', params)
 // 修改
-export const Storehouse_Contract_Edit = (params: any) => $http.post('/api/storage/Contract/Edit', params)
+export const Storehouse_Contract_Edit = (params: any) => $http.post('/storage/Contract/Edit', params)
 // 删除
-export const Storehouse_Contract_Del = (params: any) => $http.post('/api/storage/Contract/Del', params)
+export const Storehouse_Contract_Del = (params: any) => $http.post('/storage/Contract/Del', params)
 // 产品列表
 export const Storehouse_Contract_Product_List = (params: any) =>
-  $http.post('/api/storage/Contract/Product_List', params)
+  $http.post('/storage/Contract/Product_List', params)
 // 获取为出库或为完全出库合同列表
-export const Storehouse_Contract_Out_List = (params: any) => $http.post('/api/storage/Contract/Out_List', params)
+export const Storehouse_Contract_Out_List = (params: any) => $http.post('/storage/Contract/Out_List', params)
 
 /**
  * 库存管理
  */
 // 设备列表
-export const Storehouse_Device_List = (params: any) => $http.post('/api/storage/Device/List', params)
+export const Storehouse_Device_List = (params: any) => $http.post('/storage/Device/List', params)
 
 /**
  * 入库
  */
 // 入库列表
-export const Storehouse_StockIn_List = (params: any) => $http.post('/api/storage/StockIn/List', params)
+export const Storehouse_StockIn_List = (params: any) => $http.post('/storage/StockIn/List', params)
 // 详情
-export const Storehouse_StockIn_Get = (params: any) => $http.post('/api/storage/StockIn/Get', params)
+export const Storehouse_StockIn_Get = (params: any) => $http.post('/storage/StockIn/Get', params)
 // 入库
-export const Storehouse_StockIn_Add = (params: any) => $http.post('/api/storage/StockIn/Add', params)
+export const Storehouse_StockIn_Add = (params: any) => $http.post('/storage/StockIn/Add', params)
 
 /**
  * 出库
  */
 // 出库列表
-export const Storehouse_StockOut_List = (params: any) => $http.post('/api/storage/StockOut/List', params)
+export const Storehouse_StockOut_List = (params: any) => $http.post('/storage/StockOut/List', params)
 // 出库
-export const Storehouse_StockOut_Add = (params: any) => $http.post('/api/storage/StockOut/Add', params)
+export const Storehouse_StockOut_Add = (params: any) => $http.post('/storage/StockOut/Add', params)
 // 详情
-export const Storehouse_StockOut_Get = (params: any) => $http.post('/api/storage/StockOut/Get', params)
+export const Storehouse_StockOut_Get = (params: any) => $http.post('/storage/StockOut/Get', params)
 // 修改发货订单
-export const Storehouse_StockOut_Edit = (params: any) => $http.post('/api/storage/StockOut/Edit', params)
+export const Storehouse_StockOut_Edit = (params: any) => $http.post('/storage/StockOut/Edit', params)
 
 /**
  * 库存统计
  */
 // 统计列表
-export const Storehouse_Stock_List = (params: any) => $http.post('/api/storage/Stock/List', params)
+export const Storehouse_Stock_List = (params: any) => $http.post('/storage/Stock/List', params)
 // 查询明细
-export const Storehouse_Stock_Detail_List = (params: any) => $http.post('/api/storage/Stock/Detail_List', params)
+export const Storehouse_Stock_Detail_List = (params: any) => $http.post('/storage/Stock/Detail_List', params)
 // 导出明细
-export const Storehouse_Stock_Detail_Excel = (params: any) => $http.post('/api/storage/Stock/Detail_Excel', params)
+export const Storehouse_Stock_Detail_Excel = (params: any) => $http.post('/storage/Stock/Detail_Excel', params)
 
 // 检查 Sn 号
-export const Storehouse_Device_Check = (params: any) => $http.post('/api/storage/Device/Check', params)
+export const Storehouse_Device_Check = (params: any) => $http.post('/storage/Device/Check', params)
 
 /**
  * 验证合同
  */
 // 客户列表
 export const Storehouse_VerifyContract_Customer_List = (params: any) =>
-  $http.post('/api/storage/VerifyContract/Customer_List', params)
+  $http.post('/storage/VerifyContract/Customer_List', params)
 // 添加客户
 export const Storehouse_VerifyContract_Add_Customer = (params: any) =>
-  $http.post('/api/storage/VerifyContract/Add_Customer', params)
+  $http.post('/storage/VerifyContract/Add_Customer', params)
 // 编辑客户
 export const Storehouse_VerifyContract_Update_Customer = (params: any) =>
-  $http.post('/api/storage/VerifyContract/Update_Customer', params)
+  $http.post('/storage/VerifyContract/Update_Customer', params)
 // 明细列表
-export const Storehouse_VerifyContract_List = (params: any) => $http.post('/api/storage/VerifyContract/List', params)
+export const Storehouse_VerifyContract_List = (params: any) => $http.post('/storage/VerifyContract/List', params)
 // 添加
-export const Storehouse_VerifyContract_Add = (params: any) => $http.post('/api/storage/VerifyContract/Add', params)
+export const Storehouse_VerifyContract_Add = (params: any) => $http.post('/storage/VerifyContract/Add', params)
 // 编辑
-export const Storehouse_VerifyContract_Edit = (params: any) => $http.post('/api/storage/VerifyContract/Edit', params)
+export const Storehouse_VerifyContract_Edit = (params: any) => $http.post('/storage/VerifyContract/Edit', params)
 // 获取详情
-export const Storehouse_VerifyContract_Get = (params: any) => $http.post('/api/storage/VerifyContract/Get', params)
+export const Storehouse_VerifyContract_Get = (params: any) => $http.post('/storage/VerifyContract/Get', params)
 // 删除
-export const Storehouse_VerifyContract_Del = (params: any) => $http.post('/api/storage/VerifyContract/Del', params)
+export const Storehouse_VerifyContract_Del = (params: any) => $http.post('/storage/VerifyContract/Del', params)
 
 
 /**
@@ -149,6 +149,6 @@ export const Storehouse_VerifyContract_Del = (params: any) => $http.post('/api/s
  */
 //回款列表
 export const Storehouse_VerifyContract_Recover_List = (params: any) =>
-  $http.post('/api/storage/RecoveriesContract/List', params)
+  $http.post('/storage/RecoveriesContract/List', params)
 
   

+ 13 - 11
src/api/user/index.ts

@@ -1,23 +1,25 @@
 import $http from '../index'
 // 登录
-export const Login_verification = (params: any) => $http.post('/api/user/Login_verification', params)
+export const Login_verification = (params: any) => $http.post('/user/Login_verification', params)
 // 获取列表
-export const User_List = (params: any) => $http.post('/api/user/User/List', params)
+export const User_List = (params: any) => $http.post('/user/User/List', params)
 // 添加用户
-export const User_Add = (params: any) => $http.post('/api/user/User/Add', params)
+export const User_Add = (params: any) => $http.post('/user/User/Add', params)
 // 编辑用户
-export const User_Edit = (params: any) => $http.post('/api/user/User/Edit', params)
+export const User_Edit = (params: any) => $http.post('/user/User/Edit', params)
 // 删除用户
-export const User_Del = (params: any) => $http.post('/api/user/User/Del', params)
+export const User_Del = (params: any) => $http.post('/user/User/Del', params)
 //部门列表
-export const User_Dept_List = (params?: any) => $http.post('/api/user/Dept/List', params)
+export const User_Dept_List = (params?: any) => $http.post('/user/Dept/List', params)
 //岗位列表
-export const User_Post_List = (params?: any) => $http.post('/api/user/Post/List', params)
+export const User_Post_List = (params?: any) => $http.post('/user/Post/List', params)
 // 用户信息
-export const User_Info = (params?: any) => $http.post('/api/user/User/Info', params)
+export const User_Info = (params?: any) => $http.post('/user/User/Info', params)
 // 修改密码
-export const User_Post = (params?: any) => $http.post('/api/user/User/Post', params)
+export const User_Post = (params?: any) => $http.post('/user/User/Post', params)
 // 消息列表
-export const User_News_List = (params?: any) => $http.post('/api/user/News/List', params)
+export const User_News_List = (params?: any) => $http.post('/user/News/List', params)
 // 查看消息
-export const User_News_See = (params?: any) => $http.post('/api/user/News/See', params)
+export const User_News_See = (params?: any) => $http.post('/user/News/See', params)
+// 离职
+export const User_Leave = (params: any) => $http.post('/user/User/Leave', params)

+ 18 - 18
src/api/workAttendance/index.ts

@@ -3,42 +3,42 @@ import $http from '../index'
  * 请假
  */
 // 我的请假列表
-export const Leave_User_list = (params: any) => $http.post('api/ams/Leave/User_list', params)
+export const Leave_User_list = (params: any) => $http.post('ams/Leave/User_list', params)
 // 请假类型
-export const LeaveType_List = (params: any) => $http.post('/api/ams/LeaveType/List', params)
+export const LeaveType_List = (params: any) => $http.post('/ams/LeaveType/List', params)
 // 请假审批
-export const Leave_List = (params: any) => $http.post('/api/ams/Leave/List', params)
+export const Leave_List = (params: any) => $http.post('/ams/Leave/List', params)
 // 请假申请
-export const Leave_Add = (params: any) => $http.post('/api/ams/Leave/Add', params)
+export const Leave_Add = (params: any) => $http.post('/ams/Leave/Add', params)
 // 扣除-财务权限
-export const Leave_Deduct = (params: any) => $http.post('/api/ams/Leave/Deduct', params)
+export const Leave_Deduct = (params: any) => $http.post('/ams/Leave/Deduct', params)
 // 编辑
-export const Leave_Edit = (params: any) => $http.post('/api/ams/Leave/Edit', params)
+export const Leave_Edit = (params: any) => $http.post('/ams/Leave/Edit', params)
 // 审批
-export const Leave_Approval = (params: any) => $http.post('/api/ams/Leave/Approval', params)
+export const Leave_Approval = (params: any) => $http.post('/ams/Leave/Approval', params)
 // 删除
-export const Leave_Del = (params: any) => $http.post('/api/ams/Leave/Del', params)
+export const Leave_Del = (params: any) => $http.post('/ams/Leave/Del', params)
 // 请假剩余时长
-export const Leave_DaysOff = (params: any) => $http.post('/api/ams/Leave/DaysOff', params)
+export const Leave_DaysOff = (params: any) => $http.post('/ams/Leave/DaysOff', params)
 // 财务管理
-export const Leave_Finance_List = (params: any) => $http.post('/api/ams/Leave/Finance_List', params)
+export const Leave_Finance_List = (params: any) => $http.post('/ams/Leave/Finance_List', params)
 // 计算请假时长
-export const Leave_Duration = (params: any) => $http.post('/api/ams/Leave/Duration', params)
+export const Leave_Duration = (params: any) => $http.post('/ams/Leave/Duration', params)
 
 /**
  * 加班
  */
 // 审批列表
-export const Overtime_List = (params: any) => $http.post('/api/ams/Overtime/List', params)
+export const Overtime_List = (params: any) => $http.post('/ams/Overtime/List', params)
 // 我的加班列表
-export const Overtime_User_list = (params: any) => $http.post('/api/ams/Overtime/User_list', params)
+export const Overtime_User_list = (params: any) => $http.post('/ams/Overtime/User_list', params)
 // 加班申请
-export const Overtime_Add = (params: any) => $http.post('/api/ams/Overtime/Add', params)
+export const Overtime_Add = (params: any) => $http.post('/ams/Overtime/Add', params)
 // 编辑
-export const Overtime_Edit = (params: any) => $http.post('/api/ams/Overtime/Edit', params)
+export const Overtime_Edit = (params: any) => $http.post('/ams/Overtime/Edit', params)
 // 审批
-export const Overtime_Approval = (params: any) => $http.post('/api/ams/Overtime/Approval', params)
+export const Overtime_Approval = (params: any) => $http.post('/ams/Overtime/Approval', params)
 // 删除
-export const Overtime_Del = (params: any) => $http.post('/api/ams/Overtime/Del', params)
+export const Overtime_Del = (params: any) => $http.post('/ams/Overtime/Del', params)
 // 统计
-export const Overtime_Stat = (params: any) => $http.post('/api/ams/Overtime/Stat', params)
+export const Overtime_Stat = (params: any) => $http.post('/ams/Overtime/Stat', params)

+ 117 - 0
src/components/echart/Statistic.vue

@@ -0,0 +1,117 @@
+<script lang="ts" setup>
+import { CaretTop, Warning } from '@element-plus/icons-vue'
+import increaseFun from '@/plugins/increaseFun'
+import { reactive, watch } from "vue";
+
+
+// 接受父组件参数,配置默认值
+const props:any = defineProps({
+  StatisticData: {
+    type: Object,
+    default: () => [],
+  },
+});
+
+let data:any = reactive({
+  StatisticValue:[]
+})
+
+watch(() => props.StatisticData, async (newData) => {
+  data.StatisticValue = await increaseFun(newData)
+})
+</script>
+<template>
+  <el-row :gutter="16">
+    <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" v-for="(item, index) in data.StatisticValue" :key="index">
+      <div class="statistic-card">
+        <el-statistic :value="item.value">
+          <template #title>
+            <div style="display: inline-flex; align-items: center;margin-bottom:10px">
+              {{ item.label }}
+              <el-tooltip effect="dark" :content="item.content" placement="top">
+                <el-icon style="margin-left: 4px" :size="12">
+                  <Warning />
+                </el-icon>
+              </el-tooltip>
+            </div>
+          </template>
+        </el-statistic>
+        <div class="statistic-footer" v-if="item.percent>=0">
+          <div class="footer-item">
+            <span>同比去年增长</span>
+            <span class="green">
+              {{ item.percent }}
+              <el-icon>
+                <CaretTop />
+              </el-icon>
+            </span>
+          </div>
+        </div>
+
+        <div class="statistic-footer" v-else>
+          <div class="footer-item">
+            <span>同比去年减少</span>
+            <span class="red">
+              {{ item.percent }}
+              <el-icon>
+                <CaretBottom />
+              </el-icon>
+            </span>
+          </div>
+        </div>
+
+      </div>
+    </el-col>
+
+  </el-row>
+</template>
+  
+
+  
+<style scoped>
+:global(h2#card-usage ~ .example .example-showcase) {
+  background-color: var(--el-fill-color) !important;
+}
+
+.el-statistic {
+  --el-statistic-content-font-size: 28px;
+}
+
+.statistic-card {
+  height: 100%;
+  padding: 20px;
+  border-radius: 4px;
+  background-color: var(--el-bg-color-overlay);
+}
+
+.statistic-footer {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  flex-wrap: wrap;
+  font-size: 12px;
+  color: var(--el-text-color-regular);
+  margin-top: 10px;
+}
+
+.statistic-footer .footer-item {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.statistic-footer .footer-item span:last-child {
+  display: inline-flex;
+  align-items: center;
+  margin-left: 4px;
+}
+
+.green {
+  color: var(--el-color-success);
+}
+
+.red {
+  color: var(--el-color-error);
+}
+</style>
+  

+ 132 - 0
src/components/echart/echart-bar.vue

@@ -0,0 +1,132 @@
+<!--  -->
+<template>
+    <div class="card table">
+        <div style="height: 400px;" :id="props.id" class="myChart">
+        </div>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { onMounted, inject,watch, reactive,nextTick } from "vue";
+import findDataFun from '@/plugins/findData'
+
+// 接受父组件参数,配置默认值
+const props = defineProps({
+    id: {
+        type: String,
+        default: () => '',
+    },
+    barData:{
+        type:Object,
+        default: () => {},
+    },
+    switchData:{
+        type:Boolean,
+        default: () =>true,
+    }
+});
+let echart:any = null
+let myChart:any = null
+
+let echartData:any = reactive({
+    titles:'',//标题
+    xAxisArr:[],//x轴
+    seriesDiscount:[], //合同总金额
+    seriesRecoveries:[] //合同已回款金额
+})
+watch(() => props.switchData,()=>{
+    echartData = findDataFun('bar',props.barData,props.switchData)
+    myChart.clear();
+    myChart.setOption(initEcharts());
+})
+
+watch(() => props.barData,async()=>{
+    echartData = findDataFun('bar',props.barData,props.switchData)
+    myChart.clear();
+    myChart.setOption(initEcharts());
+})
+onMounted(() => {
+    echart = inject('echart')
+    myChart = echart.init(document.getElementById(props.id));
+    setEchartFun();
+})
+//函数
+const setEchartFun = async ()=>{
+    myChart.setOption(initEcharts());
+    window.onresize = function () {
+        myChart.resize();
+    };
+}
+const initEcharts = () => {
+    // 绘制图表
+    return {
+        tooltip: {
+            // formatter: function (params:any) {
+            //     console.log('111',params)
+            //     return params.name +''+ params.seriesName + ':' + params.value + '元'
+            // }
+        },
+        title: {
+            // text: '月度合同金额统计'+'(元)',
+            subtext:  echartData.titles
+        },
+        xAxis: [
+            {
+                axisTick: { show: false },
+                type: 'category',
+                data: echartData.xAxisArr
+            }
+        ],
+        legend: {
+            data: ['合同总金额', '已回款金额']
+        },
+        yAxis: {},
+        series: [
+            {
+                name: '合同总金额',
+                type: 'bar',
+                data: echartData.seriesDiscount,
+                itemStyle: { //面积图颜色设置
+                    color: {
+                        type: 'linear',
+                        x: 0,
+                        y: 0,
+                        x2: 0,
+                        y2: 1,
+                        colorStops: [
+                            { offset: 0, color: '#35f3ff' },
+                            { offset: 0.5, color: '#44dfff' },
+                            { offset: 1, color: '#56c6ff' }
+                        ],
+                        globalCoord: false // 缺省为 false
+                    },
+                    barBorderRadius: [30, 30, 0, 0] //圓角
+                },
+            },
+            {
+                name: '已回款金额',
+                type: 'bar',
+                data: echartData.seriesRecoveries,
+                itemStyle: { //面积图颜色设置
+                    color: {
+                        type: 'linear',
+                        x: 0,
+                        y: 0,
+                        x2: 0,
+                        y2: 1,
+                        colorStops: [
+                            { offset: 0, color: '#9dfdc8' },
+                            { offset: 0.5, color: '#73efdd' },
+                            { offset: 1, color: '#9afcc8' }
+                        ],
+                        globalCoord: false // 缺省为 false
+                    },
+                    barBorderRadius: [30, 30, 0, 0] //圓角
+                },
+            }
+        ]
+    }
+}
+
+
+</script>

+ 131 - 0
src/components/echart/echart-line.vue

@@ -0,0 +1,131 @@
+<!--  -->
+<template>
+    <div class="card table">
+        <div style="height: 400px;" :id="props.id" class="myChart">
+        </div>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { onMounted, inject,watch,reactive } from "vue";
+import findDataFun from '@/plugins/findData'
+// 接受父组件参数,配置默认值
+const props = defineProps({
+    id: {
+        type: String,
+        default: () => '',
+    },
+    lineData:{
+        type:Object,
+        default: () => {},
+    },
+    switchData:{
+        type:Boolean,
+        default: () =>true,
+    }
+});
+
+let echart:any = null
+let myChart:any = null
+
+let echartData:any = reactive({
+    titles:'',//标题
+    xAxisArr:[],//x轴
+    seriesDiscount:[], //合同总金额
+    seriesRecoveries:[] //合同已回款金额
+})
+watch(() => props.switchData,()=>{
+    echartData = findDataFun('line',props.lineData,props.switchData)
+    myChart.clear();
+    myChart.setOption(initEcharts());
+})
+
+watch(() => props.lineData,async()=>{
+    echartData = findDataFun('line',props.lineData,props.switchData)
+    myChart.clear();
+    myChart.setOption(initEcharts());
+})
+onMounted(() => {
+    echart = inject('echart')
+    myChart = echart.init(document.getElementById(props.id));
+    setEchartFun();
+})
+
+//函数
+const setEchartFun = async ()=>{
+    myChart.setOption(initEcharts());
+    window.onresize = function () {
+        myChart.resize();
+    };
+}
+
+
+const initEcharts = () => {
+    // 绘制图表
+    return {
+        tooltip: {
+            trigger: 'axis',
+            axisPointer: {
+                type: 'cross',
+                label: {
+                    backgroundColor: '#6a7985'
+                }
+            }
+        },
+        title: {
+            // text: 'Rainfall vs Evaporation',
+            subtext: echartData.titles
+        },
+        // grid: {
+        //     left: '3%',
+        //     right: '4%',
+        //     bottom: '3%',
+        //     containLabel: true
+        // },
+        xAxis: [
+            {
+                boundaryGap: false,
+                type: 'category',
+                data: echartData.xAxisArr
+            }
+        ],
+        yAxis: {
+            type: 'value'
+        },
+        series: [
+            {
+                name: echartData.tooltip,
+                type: 'line',
+                smooth: true,
+                stack: 'Total',
+                areaStyle: {},
+                emphasis: {
+                    focus: 'series'
+                },
+                itemStyle: { //面积图颜色设置
+                    color: {
+                        type: 'linear',
+                        x: 0,
+                        y: 0,
+                        x2: 0,
+                        y2: 1,
+                        colorStops: [
+                            {
+                                offset: 0, //offset 可取范围 0、0.1、0.2、到1
+                                color: 'rgba(250, 51, 171, 0.8)', // 0% 处的颜色
+                            },
+                            {
+                                offset: 1,
+                                color: 'rgba(206, 51, 181, 0.4)' // 100% 处的颜色
+                            }
+                        ],
+                        globalCoord: false // 缺省为 false
+                    }
+                },
+                data:echartData.seriesArr,
+            }
+        ]
+    }
+}
+
+</script>

+ 1 - 0
src/main.ts

@@ -18,6 +18,7 @@ import '@/styles/element.scss'
 
 import * as ElementPlusIconsVue from '@element-plus/icons-vue'
 
+
 const app = createApp(App)
 // 注册iocn图标
 for (const [key, component] of Object.entries(ElementPlusIconsVue)) {

+ 100 - 0
src/plugins/findData.ts

@@ -0,0 +1,100 @@
+
+/**
+ * 
+ * @param type bar柱状图 line曲线图
+ * @param data 处理数据
+ * @param swiData 当前的swi为按月true,按年false
+ */
+
+export default function findDataFun(type:any,data:any,swiData:any){
+    if(type=='bar'){
+        return barFun(data,swiData)
+    }else{
+        return lineFun(data,swiData)
+    }
+}
+
+//筛选bar
+function barFun(data:any,swiData:any) {
+    const paramData:any = {
+        titles:'',//标题
+        xAxisArr:[],//x轴
+        seriesDiscount:[], //合同总金额
+        seriesRecoveries:[] //合同已回款金额
+    }
+    if(swiData){//按月
+        if(data.ContractMoneyByMonth){
+            data.ContractMoneyByMonth.forEach((item:any) => {
+                paramData.titles = '月度合同金额统计(元)'
+                paramData.xAxisArr.push(item.T_date + '月')
+                paramData.seriesDiscount.push(item.T_discount)
+                paramData.seriesRecoveries.push(item.T_recoveries_money)
+            });
+        }else{
+            paramData.titles = '月度合同金额统计(元)'
+            paramData.xAxisArr = []
+            paramData.seriesDiscount = []
+            paramData.seriesRecoveries = []
+
+        }
+       
+    }else{//按年
+        if(data.ContractMoneyByYear){
+            data.ContractMoneyByYear.forEach((item:any) => {
+                paramData.titles = '年度合同金额统计(元)'
+                paramData.xAxisArr.push(item.T_date + '年')
+                paramData.seriesDiscount.push(item.T_discount)
+                paramData.seriesRecoveries.push(item.T_recoveries_money)
+            });
+        }else{
+            paramData.titles = '年度合同金额统计(元)'
+                paramData.xAxisArr = []
+                paramData.seriesDiscount = []
+                paramData.seriesRecoveries = []
+        }
+        
+    }
+    return paramData
+}
+
+//筛选line
+function lineFun(data:any,swiData:any) {
+    const paramData:any = {
+        tooltip:'',
+        titles:'',//标题
+        xAxisArr:[],//x轴
+        seriesArr:[], //合同数量
+    }
+    if(swiData){//按月
+        if(data.ContractNumByMonth){
+            data.ContractNumByMonth.forEach((item:any) => {
+                paramData.tooltip = '月度(份)'
+                paramData.titles = '月度合同数量(份)'
+                paramData.xAxisArr.push(item.T_date + '月')
+                paramData.seriesArr.push(item.T_num)
+            });
+        }else{
+            paramData.tooltip = '月度(份)'
+            paramData.titles = '月度合同数量(份)'
+            paramData.xAxisArr = []
+            paramData.seriesArr = []
+        }
+        
+    }else{//按年
+        if(data.ContractNumByYear){
+            data.ContractNumByYear.forEach((item:any) => {
+                paramData.tooltip = '年度(份)'
+                paramData.titles = '年度合同数量(份)'
+                paramData.xAxisArr.push(item.T_date + '年')
+                paramData.seriesArr.push(item.T_num)
+            });
+        }else{
+            paramData.tooltip = '年度(份)'
+            paramData.titles = '年度合同数量(份)'
+            paramData.xAxisArr = []
+            paramData.seriesArr = []
+        }
+        
+    }
+    return paramData
+}

+ 29 - 0
src/plugins/increaseFun.ts

@@ -0,0 +1,29 @@
+// (120-100)/100×100% = 20%;
+export default function increaseFun(data:any){
+    console.log('比列',data)
+    const paramData = [{
+        value:data.TotalMumByThisYear,
+        lastValue:data.TotalMumByLastYear,
+        label:'合同数量(份)',
+        content:'去年合同数量(份):' + data.TotalMumByLastYear,
+        percent:increaseFind(data.TotalMumByThisYear,data.TotalMumByLastYear)
+      },{
+        value:data.TotalMoneyByThisYear,
+        lastValue:data.TotalMoneyByLastYear,
+        label:'合同金额(元)',
+        content:'去年合同金额(元):' + data.TotalMoneyByLastYear,
+        percent:increaseFind(data.TotalMoneyByThisYear,data.TotalMoneyByLastYear)
+      },{
+        value:data.RecoveriesMoneyByThisYear,
+        lastValue:data.RecoveriesMoneyByLastYear,
+        label:'已回款金额(元)',
+        content:'去年已回款金额(元):' + data.RecoveriesMoneyByLastYear,
+        percent:increaseFind(data.RecoveriesMoneyByThisYear,data.RecoveriesMoneyByLastYear)
+    }]
+    return paramData
+}
+
+function increaseFind(ThisYear:any,LastYear:any) {
+    console.log('晒',ThisYear,LastYear)
+    return ThisYear-LastYear
+}

+ 5 - 3
src/views/Login.vue

@@ -41,6 +41,7 @@ const submitForm = (formEl: FormInstance | undefined) => {
           bzd_username: ruleForm.username,
           bzd_password: fnMd5(ruleForm.password)
         })
+
         if (res.Code === 200) {
           sessionStorage.setItem('User_tokey', res.Data)
           globalStore.SET_User_Tokey(res.Data)
@@ -55,9 +56,10 @@ const submitForm = (formEl: FormInstance | undefined) => {
           }, 1000)
         }
       } catch (error: any) {
-        if (error.Code === 202) {
-          loading.value = false
-        }
+        // if (error.Code === 202) {
+        //   loading.value = false
+        // }
+        loading.value = false
       }
     } else {
       return false

+ 147 - 148
src/views/account/roles/Roles.vue

@@ -17,7 +17,7 @@ import TableBase from '@/components/TableBase/index.vue'
 import type { FormInstance, FormRules } from 'element-plus'
 import type { ColumnProps } from '@/components/TableBase/interface/index'
 import { Edit, Delete, Operation } from '@element-plus/icons-vue'
-import { ElNotification, ElMessageBox, ElMessage } from 'element-plus'
+import { ElNotification, ElMessageBox, ElMessage,TabsPaneContext  } from 'element-plus'
 
 interface InSys {
   T_sys: string
@@ -39,6 +39,8 @@ const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
 const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
 const initParam = { User_tokey, T_name: '' }
 
+
+
 const DialogOpen = async (row: any) => {
   currentVal = row
   await getSysList()
@@ -52,32 +54,31 @@ const columns: ColumnProps[] = [
   { prop: 'operation', label: '操作', width: 200, fixed: 'right' }
 ]
 
+const menuDir:any = reactive({
+  activeName:null,//选中的tabs
+  MenuData:[],//tabs导航栏
+  tabsMenu:[],//tab展开导航
+  defaultKeys:[]//默认选中
+})
 const getSysList = async () => {
   const { Data } = await User_Sys_List({ User_tokey })
-  SysList.value = Data as InSys[]
-  const promises = []
-  for (let item of SysList.value) {
-    promises.push(getMenuList(item.T_sys))
-  }
-
-  Promise.all(promises).then(res => {
-    const menuListTemporary: any[] = []
-    res.forEach((item: any) => {
-      const { Children, T_permission } = item.Data.Menu[0]
-      item.Data.Menu[0].children = Children
-      if (['/account', 'mangage', '/salary', '/stock', '/projectMange'].includes(T_permission)) {
-        item.Data.Menu[0].father = true
-        menuMap.set(T_permission, { code: item.code, children: [] })
-      }
-      if (item.Data.Menu_checked) {
-        getPermissionArr(item.Data)
-      }
-      menuListTemporary.push(item.Data.Menu[0])
-    })
-    menuList.value = menuListTemporary
-    setCheckedTreeKeys(permissionArr.value)
-  })
+  console.log('导航',Data)
+  menuDir.MenuData = Data
+  menuDir.activeName = menuDir.MenuData[0].T_sys
+  const {Data:resIt} = await getMenuList(menuDir.activeName)
+  menuDir.tabsMenu = resIt.Menu[0].Children
+  menuDir.defaultKeys = resIt.Menu_checked?resIt.Menu_checked:[]
 }
+//点击切换tabs调用导航
+const handleClick = async(tab: TabsPaneContext, event: Event) => {
+  menuDir.defaultKeys = []
+  menuDir.activeName = tab.props.name
+  const {Data:resIt} = await getMenuList(menuDir.activeName)
+  menuDir.tabsMenu = resIt.Menu[0].Children
+  menuDir.defaultKeys = resIt.Menu_checked?resIt.Menu_checked:[]
+}
+
+//调用当前权限的子选项
 const getMenuList = async (code: string) => {
   const res: any = await User_Power_Get({ User_tokey, T_code: code, T_id: currentVal.T_id })
   return {
@@ -87,26 +88,26 @@ const getMenuList = async (code: string) => {
 }
 
 const permissionArr = ref<string[]>([])
-const getPermissionArr = (menu: any) => {
-  const { Menu, Menu_checked } = menu
-  const { Children, T_permission } = Menu[0]
-  getCurrentFlatMenu(Children, Menu_checked, T_permission)
-}
+// const getPermissionArr = (menu: any) => {
+//   const { Menu, Menu_checked } = menu
+//   const { Children, T_permission } = Menu[0]
+//   getCurrentFlatMenu(Children, Menu_checked, T_permission)
+// }
 
-const getCurrentFlatMenu = (children: any[], arr: number[], permission: string) => {
-  const fatherMenu = menuMap.get(permission)
+// const getCurrentFlatMenu = (children: any[], arr: number[], permission: string) => {
+//   const fatherMenu = menuMap.get(permission)
 
-  children.forEach((item: any) => {
-    const index = arr.findIndex((num: any) => num === item.Id)
-    if (item.Children) {
-      getCurrentFlatMenu(item.Children, arr, permission)
-    }
-    if (index !== -1 && !item.Children) {
-      permissionArr.value.push(item.T_permission)
-      fatherMenu.children.push(item)
-    }
-  })
-}
+//   children.forEach((item: any) => {
+//     const index = arr.findIndex((num: any) => num === item.Id)
+//     if (item.Children) {
+//       getCurrentFlatMenu(item.Children, arr, permission)
+//     }
+//     if (index !== -1 && !item.Children) {
+//       permissionArr.value.push(item.T_permission)
+//       fatherMenu.children.push(item)
+//     }
+//   })
+// }
 const setCheckedTreeKeys = (arr: string[]) => treeRef.value?.setCheckedKeys(arr, true)
 
 // 添加角色
@@ -204,36 +205,26 @@ const menuList = ref<any[]>([])
  */
 const getMontageRole = (children: any[]) => {
   let result = ''
-
-  const getChildIds = (node: any) => {
-    if (!node.Children) {
-      return `M${node.Id}|`
-    }
-    let ids = node.Children.map((child: any) => {
-      return getChildIds(child)
+  let arrMap:any = []
+  if(children.length!=0){
+    children.forEach((item:any)=>{
+      arrMap.push('M'+item)
     })
-    return `M${node.Id}|${ids.join('')}`
+    result = arrMap.join('|') + '|'
+    return result
+  }else{
+    return ''
   }
-
-  children.forEach((item: any) => {
-    result += getChildIds(item)
-  })
-  return result
 }
 /**
  * 提交
  */
-const append = async (data: any) => {
-  
-  const currentMenu = menuMap.get(data.T_permission)
-  const { code, children } = currentMenu
-  let T_menu = getMontageRole(children)
-  console.log('提交',T_menu,children)
-  // return
+const submit = async (data: any) => {
+  let T_menu = getMontageRole(menuDir.defaultKeys)
   const params = {
     User_tokey,
     T_id: currentVal.T_id,
-    T_code: code,
+    T_code: menuDir.activeName,
     T_menu
   }
   const res = await User_Power_Edit_Menu(params)
@@ -243,24 +234,24 @@ const append = async (data: any) => {
   }
 }
 let fatherDataCopy: any = {}
-const getMenuChildren = (menuchildren: any, T_permission: string) => {
-  let fatherData = getFatherData(T_permission)
-  const { children } = fatherData
+// const getMenuChildren = (menuchildren: any, T_permission: string) => {
+//   let fatherData = getFatherData(T_permission)
+//   const { children } = fatherData
 
-  if (!menuchildren?.length) {
-    const index = children.findIndex((child: any) => child.T_permission === menuchildren.T_permission)
-    if (index === -1) children.push({ ...menuchildren })
-  } else {
-    menuchildren.forEach((item: any) => {
-      if (item.Children) {
-        getMenuChildren(item, T_permission)
-      } else {
-        const index = children.findIndex((child: any) => item.T_permission === child.T_permission)
-        if (index === -1) children.push({ ...item })
-      }
-    })
-  }
-}
+//   if (!menuchildren?.length) {
+//     const index = children.findIndex((child: any) => child.T_permission === menuchildren.T_permission)
+//     if (index === -1) children.push({ ...menuchildren })
+//   } else {
+//     menuchildren.forEach((item: any) => {
+//       if (item.Children) {
+//         getMenuChildren(item, T_permission)
+//       } else {
+//         const index = children.findIndex((child: any) => item.T_permission === child.T_permission)
+//         if (index === -1) children.push({ ...item })
+//       }
+//     })
+//   }
+// }
 const getFatherData = (T_permission: string) => {
   let fatherData = menuMap.get(T_permission)
   if (['/base', '/property', '/inventory', '/salesManage'].includes(T_permission)) {
@@ -268,51 +259,63 @@ const getFatherData = (T_permission: string) => {
   }
   return fatherData
 }
+
+
 const checkChange = (data: any, check: boolean) => {
-  let fatherData = getFatherData(data.T_permission)
-  if (fatherData) {
-    fatherDataCopy = fatherData
-  }
-  if (check && fatherDataCopy) {
-    const { children } = fatherDataCopy
-    if (!data.Children) {
-      const index = children.findIndex((child: any) => data.T_permission === child.T_permission)
-      if (index === -1) children.push({ ...data })
-    } else {
-      getMenuChildren(data.Children, data.T_permission)
-    }
+  // console.log('选中',menuDir.defaultKeys,data,check)
+  if(check){//当前选中操作
+    const j = menuDir.defaultKeys.includes(data.Id)
+    if(!j)menuDir.defaultKeys.push(data.Id)//不在加入
+  }else{//当前取消操作
+    menuDir.defaultKeys.map((item: any, index: any) => {
+        if (item == data.Id) menuDir.defaultKeys.splice(index, 1)
+    })
   }
+  return
+  // let fatherData = getFatherData(data.T_permission)
+  // if (fatherData) {
+  //   fatherDataCopy = fatherData
+  // }
+  // if (check && fatherDataCopy) {
+  //   const { children } = fatherDataCopy
+  //   if (!data.Children) {
+  //     const index = children.findIndex((child: any) => data.T_permission === child.T_permission)
+  //     if (index === -1) children.push({ ...data })
+  //   } else {
+  //   }
+  // }
 
-  if (!check && fatherDataCopy) {
-    let { children } = fatherDataCopy
-    if (['/base', '/property', '/inventory', '/salesManage'].includes(data.T_permission)) {
-      fatherData = menuMap.get('/stock')
-      if (data.T_permission === '/base') {
-        children = children.filter((item: any) => {
-          return !['/list', '/classify', '/productionList', '/base'].includes(item.T_permission)
-        })
-      } else if (data.T_permission === '/property') {
-        children = children.filter((item: any) => {
-          return !['/ioTNetworkCard', '/property'].includes(item.T_permission)
-        })
-      } else if (data.T_permission === '/inventory') {
-        children = children.filter((item: any) => {
-          return !['/device', '/inStorage', '/outStock', '/inventoryStatistics', '/inventory'].includes(
-            item.T_permission
-          )
-        })
-      } else {
-        children = children.filter((item: any) => {
-          return !['/contract', '/contractSale', '/salesManage'].includes(item.T_permission)
-        })
-      }
-      fatherData.children = children
-      return
-    }
-    const index = children.findIndex((child: any) => data.T_permission === child.T_permission)
-    if (index === -1) children.splice(index, 1)
-  }
+  // if (!check && fatherDataCopy) {
+  //   let { children } = fatherDataCopy
+  //   if (['/base', '/property', '/inventory', '/salesManage'].includes(data.T_permission)) {
+  //     fatherData = menuMap.get('/stock')
+  //     if (data.T_permission === '/base') {
+  //       children = children.filter((item: any) => {
+  //         return !['/list', '/classify', '/productionList', '/base'].includes(item.T_permission)
+  //       })
+  //     } else if (data.T_permission === '/property') {
+  //       children = children.filter((item: any) => {
+  //         return !['/ioTNetworkCard', '/property'].includes(item.T_permission)
+  //       })
+  //     } else if (data.T_permission === '/inventory') {
+  //       children = children.filter((item: any) => {
+  //         return !['/device', '/inStorage', '/outStock', '/inventoryStatistics', '/inventory'].includes(
+  //           item.T_permission
+  //         )
+  //       })
+  //     } else {
+  //       children = children.filter((item: any) => {
+  //         return !['/contract', '/contractSale', '/salesManage'].includes(item.T_permission)
+  //       })
+  //     }
+  //     fatherData.children = children
+  //     return
+  //   }
+  //   const index = children.findIndex((child: any) => data.T_permission === child.T_permission)
+  //   if (index === -1) children.splice(index, 1)
+  // }
 }
+
 /**
  * dialog 关闭回调
  */
@@ -323,6 +326,8 @@ const dialogCloseCallback = () => {
     fatherDataCopy = {}
   })
 }
+
+
 </script>
 
 <template>
@@ -346,36 +351,30 @@ const dialogCloseCallback = () => {
         <el-button link type="danger" size="small" :icon="Delete" @click="UserDelete(row)">删除</el-button>
       </template>
     </TableBase>
-    <Dialog ref="dialog" width="50%" :handleClose="dialogCloseCallback">
+    <Dialog ref="dialog" width="50%" :handleClose="dialogCloseCallback" draggable>
       <template #header>
         <h3>编辑权限</h3>
       </template>
-      <transition appear name="fade" mode="out-in">
-        <el-tree
-          ref="treeRef"
-          :data="menuList"
-          show-checkbox
-          node-key="T_permission"
-          :expand-on-click-node="false"
-          :props="{ label: 'T_name', children: 'Children' }"
-          @check-change="checkChange"
-        >
-          <template #default="{ data }">
-            <div
-              class="custom-tree-node"
-              :style="{ 'border-bottom': data.Children && data.father ? ' 1px solid #ddd' : '' }"
-            >
-              <span>{{ data.T_name }}</span>
-              <span v-if="data.Children && data.father">
-                <el-button type="primary" size="small" @click="append(data)">提交</el-button>
-              </span>
-            </div>
-          </template>
-          <template #empty>
-            <el-empty></el-empty>
-          </template>
-        </el-tree>
-      </transition>
+      <el-tabs v-model="menuDir.activeName" class="demo-tabs" tabPosition="left" @tab-click="handleClick">
+        <el-tab-pane :label="item.T_name" :name="item.T_sys" v-for="item,index in menuDir.MenuData" :key="index">
+          <el-tree
+            :props="{ label: 'T_name', children: 'Children' }"
+            node-key="Id"
+            accordion
+            :default-expanded-keys="menuDir.defaultKeys"
+            :default-checked-keys="menuDir.defaultKeys"
+            :data="menuDir.tabsMenu"
+            show-checkbox
+            @check-change="checkChange"
+          />
+        </el-tab-pane>
+      </el-tabs>
+      <template #footer>
+        <div style="border-top: 1px solid #dcdfe6;padding-top: 10px;">
+          <el-button @click="dialog?.DialogClose()">取消</el-button>
+          <el-button type="primary" @click="submit">立即提交</el-button>
+        </div>
+      </template>
     </Dialog>
     <Drawer ref="drawerRef" :handleClose="callbackDrawer">
       <template #header="{ params }">

+ 56 - 8
src/views/account/users/Users.vue

@@ -3,8 +3,8 @@ import { ref, nextTick, reactive } from 'vue'
 import { GlobalStore } from '@/stores/index'
 import DrawerFrom from './components/DrawerFrom.vue'
 import TableBase from '@/components/TableBase/index.vue'
-import { Edit, Delete } from '@element-plus/icons-vue'
-import { User_List, User_Del } from '@/api/user/index'
+import { Edit, Delete,EditPen } from '@element-plus/icons-vue'
+import { User_List, User_Del,User_Leave } from '@/api/user/index'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import { ColumnProps } from '@/components/TableBase/interface/index'
 
@@ -14,14 +14,22 @@ const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
 const drawerFromRef = ref<InstanceType<typeof DrawerFrom> | null>(null)
 const initParam = reactive({
   User_tokey: globalStore.GET_User_tokey,
-  T_name: ''
+  T_name: '',
+  T_State:''
 })
-
+const options = ref<any[]>([{
+    value: '1',
+    label: '正常',
+  },{
+    value: '2',
+    label: '离职',
+  }])
 const columns: ColumnProps[] = [
   { type: 'index', label: '#', width: 80, fixed: 'left' },
   { prop: 'T_name', label: '姓名', width: 120, fixed: 'left', name: 'T_name' },
   { prop: 'T_post_name', label: '职位', ellipsis: true },
   { prop: 'T_dept_name', label: '部门', width: 120 },
+  { prop: 'T_State', label: '状态',  name: 'T_State',width: 120 },
   { prop: 'T_phone', label: '联系电话', width: 120 },
   { prop: 'T_nation', label: '民族' },
   { prop: 'T_sex', label: '性别', name: 'T_sex' },
@@ -45,6 +53,27 @@ const EditUserInfo = (row: any) => {
   openDrawerFrom()
   drawerFromRef.value?.DataEcho(row)
 }
+
+const Dimission = (row: any) =>{
+  ElMessageBox.confirm('确定将该成员设置为离职状态吗?', '离职警告', {
+    confirmButtonText: '确定',
+    cancelButtonText: '取消',
+    type: 'warning'
+  }).then(async () => {
+    const res:any = await User_Leave({T_uuid:row.T_uuid}) 
+    if (res.Code === 200) {
+      ElMessage.success('离职状态设置成功!')
+      nextTick(() => {
+        UpdateTableList()
+      })
+    }
+  })
+  .catch(() => {
+    ElMessage.warning('取消设置!')
+  })
+  
+}
+
 const DeleteUserInfo = (row: any) => {
   ElMessageBox.confirm('您确定要删除吗?', '警告', {
     confirmButtonText: '确定',
@@ -75,12 +104,26 @@ const SearchInfo = () => TableRef.value?.searchTable()
       <template #table-header>
         <div class="input-suffix">
           <el-row :gutter="20">
-            <el-col :span="12">
-              <span class="ml-3 w-35 text-gray-600 inline-flex items-center">账户查询:</span>
-              <el-input type="text" class="w-50 m-2" v-model="initParam.T_name" placeholder="输入账户名称查询" />
+            <el-col :span="4">
+              <div style="display: flex;align-items: center;">
+                <span style="flex-shrink: 0;">账户查询:</span>
+                <el-input type="text" v-model="initParam.T_name" placeholder="输入账户名称查询" />
+              </div>
+            </el-col>
+
+            <el-col :span="4">
+              <div style="display: flex;align-items: center;">
+                <span style="flex-shrink: 0;">状态查询::</span>
+                <el-select v-model="initParam.T_State" clearable placeholder="请选择状态">
+                  <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
+                </el-select>
+              </div>
+            </el-col>
+            <el-col :span="1">
               <el-button type="primary" @click="SearchInfo">搜索</el-button>
             </el-col>
-            <el-col :span="6" :offset="6"><el-button type="primary" @click="openDrawerFrom">添加</el-button></el-col>
+
+            <el-col :span="1" :offset="1"><el-button type="primary" @click="openDrawerFrom">添加</el-button></el-col>
           </el-row>
         </div>
       </template>
@@ -89,6 +132,10 @@ const SearchInfo = () => TableRef.value?.searchTable()
         <el-tag class="ml-2" v-if="row.T_sex === 1">男</el-tag>
         <el-tag class="ml-2" type="danger" v-else>女</el-tag>
       </template>
+      <template #T_State="{ row }">
+        <el-tag class="ml-2" v-if="row.T_State === 1">正常</el-tag>
+        <el-tag class="ml-2" type="danger" v-else>离职</el-tag>
+      </template>
       <template #T_expire="{ row }">
         <el-tag class="ml-2" v-if="row.T_expire === 0">否</el-tag>
         <el-tag class="ml-2" type="danger" v-else>是</el-tag>
@@ -103,6 +150,7 @@ const SearchInfo = () => TableRef.value?.searchTable()
         <el-tag class="ml-2" type="danger" v-else>实习生</el-tag>
       </template>
       <template #right="{ row }">
+        <el-button link type="primary" :disabled="row.T_State==2?true:false" size="small" :icon="EditPen" @click="Dimission(row)">离职</el-button>
         <el-button link type="primary" size="small" :icon="Edit" @click="EditUserInfo(row)">编辑</el-button>
         <el-button link type="danger" size="small" :icon="Delete" @click="DeleteUserInfo(row)">删除</el-button>
       </template>

+ 4 - 4
src/views/salary/SalaryMy.vue

@@ -110,7 +110,7 @@ getMySalary()
       </el-row>
     </el-card>
     <el-card class="salary-content">
-      <el-descriptions title="我的薪资" :column="3" border>
+      <el-descriptions title="我的薪资" :column="3" border style="margin-bottom: 20px;">
         <el-descriptions-item>
           <template #label>
             <h4>姓名:</h4>
@@ -132,7 +132,7 @@ getMySalary()
       </el-descriptions>
       <el-descriptions :column="2" border>
         <template v-for="item in salaryData" :key="item.field">
-          <el-descriptions-item v-if="!isSalary.includes(item.field)">
+          <el-descriptions-item v-if="!isSalary.includes(item.field)" min-width="150">
             <template #label>
               <div class="cell-item">
                 <i class="iconfont">{{ '\ue7d1' }}</i>
@@ -160,7 +160,8 @@ getMySalary()
         </el-descriptions-item>
         <el-descriptions-item :span="2">
           <template #label>备注:</template>
-          <el-tag type="danger">{{ salaryData[21].salary ? salaryData[21].salary : '-' }}</el-tag>
+          <el-tag type="danger" style="white-space: normal;height: auto;padding: 10px;line-height: 20px;">
+            {{ salaryData[21].salary ? salaryData[21].salary : '-' }}</el-tag>
         </el-descriptions-item>
       </el-descriptions>
     </el-card>
@@ -169,7 +170,6 @@ getMySalary()
 
 <style lang="scss" scoped>
 @import '@/styles/var.scss';
-
 .SalaryMy {
   @include f-direction;
 }

+ 96 - 0
src/views/storehouse/sales/contractStat.vue

@@ -0,0 +1,96 @@
+<script setup lang="ts">
+import { ref, reactive, provide } from 'vue'
+import echartBar from '@/components/echart/echart-bar.vue'
+import echartLine from '@/components/echart/echart-line.vue'
+
+import Statistic from '@/components/echart/Statistic.vue'
+
+import {Contract_Stat_Year } from '@/api/contractStat/index'
+
+import { GlobalStore } from '@/stores/index'
+
+import * as echarts from 'echarts'
+provide('echart', echarts)
+
+const globalStore = GlobalStore()
+
+
+
+const data:any = reactive({
+  //图表值
+  tableData:{},
+  SwitchValue:true
+})
+
+const initParam = reactive({
+  User_tokey: globalStore.GET_User_tokey,
+  T_type:2,
+  T_year: ''
+})
+
+//函数
+const ContractYearApi = async ()=>{
+  const res: any = await Contract_Stat_Year(initParam)
+  if (res.Code==200) {
+    data.tableData = res.Data
+  }
+}    
+ContractYearApi()
+
+//函数
+const disabledYear = (time:any)=>{
+  return new Date().getFullYear() < time.getFullYear();
+}
+</script>
+
+<template>
+  <div class="contract">
+    <el-card class="box-card box-card-item">
+      <el-row :gutter="20" style="margin-bottom: 0">
+        <el-col :xl="6" :lg="8" :md="10">
+          <span class="inline-flex items-center">选择年份:</span>
+          <el-date-picker v-model="initParam.T_year" style="width: 200px;margin-right: 20px;" value-format="YYYY"
+            type="year" placeholder="请选择年" :disabled-date="disabledYear"/>
+          <el-button type="primary" @click="ContractYearApi">搜索</el-button>
+        </el-col>
+      </el-row>
+    </el-card>
+    <el-card class="box-card box-card-item">
+      <template #header>
+        <div class="card-header">
+          <h4>本年统计</h4>
+        </div>
+      </template>
+      <Statistic :StatisticData="data.tableData"></Statistic>
+    </el-card>
+    <el-card class="box-card box-card-item">
+      <template #header>
+        <div class="card-header" style="display: flex;align-items: center;">
+          <h4 style="margin-right: 20px;">月度/年度合同曲线图统计</h4>
+          <el-switch v-model="data.SwitchValue" active-text="按月" inactive-text="按年" 
+          inline-prompt style="--el-switch-on-color: #13ce66; --el-switch-off-color: #409eff"/>
+        </div>
+      </template>
+      <el-row>
+        <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"> 
+          <echartBar id="receptionTrend1" :barData="data.tableData" :switchData="data.SwitchValue"></echartBar>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"> 
+          <echartLine id="receptionTrend2" :lineData="data.tableData" :switchData="data.SwitchValue"></echartLine>
+        </el-col>
+      </el-row>
+     
+    </el-card>
+  </div>
+</template>
+
+<style scoped lang="scss">
+
+.box-card-item {
+  margin-bottom: 0.75rem;
+}
+.contract{
+  height: 100%;
+  overflow-y: auto;
+}
+</style>

+ 16 - 17
vite.config.ts

@@ -11,7 +11,6 @@ import { visualizer } from 'rollup-plugin-visualizer' // Bundle 分析
 // https://vitejs.dev/config/
 export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
   const env = loadEnv(mode, process.cwd())
-
   return {
     resolve: {
       alias: {
@@ -28,23 +27,23 @@ export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
       }
     },
     server: {
-      open: true,
+      open: false,//打开浏览器
       host: '0.0.0.0',
-      // proxy: {//开发者模式打开  生产模式注释
-      //   '/api': {
-      //     target: 'https://erp.baozhida.cn',
-      //     changeOrigin: true,
-      //     rewrite: path => path.replace(/^\/api/, '/testapi')
-      //   },
-      //   '/testapi': {
-      //     target: 'https://erp.baozhida.cn',
-      //     changeOrigin: true
-      //   },
-      //   '/ams': {
-      //     target: 'http://erp.baozhida.cn',
-      //     changeOrigin: true
-      //   }
-      // }
+      proxy: {
+        [env.VITE_APP_BASE_API]: {
+          target: env.VITE_SERVE,
+          changeOrigin: true,//需要代理跨域
+          rewrite: (path) => path.replace(/^\/api/, '')
+        },
+        // '/testapi': {
+        //   target: 'https://erptest.baozhida.cn',
+        //   changeOrigin: true
+        // },
+        // '/ams': {
+        //   target: 'http://erp.baozhida.cn',
+        //   changeOrigin: true
+        // }
+      }
     },
     plugins: [
       vue(),