Browse Source

Merge branch 'master' of http://47.100.37.243:10191/wutt/manHourHousekeeper

Guo1B0 1 year ago
parent
commit
d319e87596
41 changed files with 3966 additions and 46 deletions
  1. 24 0
      fhKeeper/formulahousekeeper/customerBuler-crm/.gitignore
  2. 1 0
      fhKeeper/formulahousekeeper/customerBuler-crm/.nvmrc
  3. 3 0
      fhKeeper/formulahousekeeper/customerBuler-crm/.vscode/extensions.json
  4. 18 0
      fhKeeper/formulahousekeeper/customerBuler-crm/README.md
  5. 13 0
      fhKeeper/formulahousekeeper/customerBuler-crm/index.html
  6. 3018 0
      fhKeeper/formulahousekeeper/customerBuler-crm/package-lock.json
  7. 32 0
      fhKeeper/formulahousekeeper/customerBuler-crm/package.json
  8. 6 0
      fhKeeper/formulahousekeeper/customerBuler-crm/postcss.config.js
  9. 1 0
      fhKeeper/formulahousekeeper/customerBuler-crm/public/vite.svg
  10. 7 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/App.vue
  11. 3 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/TailWindCss/index.css
  12. 1 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/assets/vue.svg
  13. 66 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/ReEcharts/index.vue
  14. 18 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/main.ts
  15. 8 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/index.vue
  16. 256 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/login.vue
  17. 18 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/test/config.ts
  18. 20 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/test/index.vue
  19. 32 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/router/index.ts
  20. 18 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/store/index.ts
  21. 80 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/styles.css
  22. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/styles/global.scss
  23. 41 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/utils/errorStatusCode.ts
  24. 66 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/utils/request.ts
  25. 7 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/vite-env.d.ts
  26. 9 0
      fhKeeper/formulahousekeeper/customerBuler-crm/tailwind.config.js
  27. 30 0
      fhKeeper/formulahousekeeper/customerBuler-crm/tsconfig.json
  28. 11 0
      fhKeeper/formulahousekeeper/customerBuler-crm/tsconfig.node.json
  29. 39 0
      fhKeeper/formulahousekeeper/customerBuler-crm/vite.config.ts
  30. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  31. 47 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceImportServiceImpl.java
  32. 37 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  33. 6 16
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  34. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages.properties
  35. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_en_US.properties
  36. 1 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ReportService.java
  37. 2 2
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  38. 1 0
      fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue
  39. 3 1
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/fillReport.vue
  40. 14 9
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  41. 6 3
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

+ 24 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/.gitignore

@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 1 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/.nvmrc

@@ -0,0 +1 @@
+v20.11.0

+ 3 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/.vscode/extensions.json

@@ -0,0 +1,3 @@
+{
+  "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"]
+}

+ 18 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/README.md

@@ -0,0 +1,18 @@
+# Vue 3 + TypeScript + Vite
+
+This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
+
+## Recommended IDE Setup
+
+- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin).
+
+## Type Support For `.vue` Imports in TS
+
+TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) to make the TypeScript language service aware of `.vue` types.
+
+If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a [Take Over Mode](https://github.com/johnsoncodehk/volar/discussions/471#discussioncomment-1361669) that is more performant. You can enable it by the following steps:
+
+1. Disable the built-in TypeScript Extension
+   1. Run `Extensions: Show Built-in Extensions` from VSCode's command palette
+   2. Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.

+ 13 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/index.html

@@ -0,0 +1,13 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Vite + Vue + TS</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script type="module" src="/src/main.ts"></script>
+  </body>
+</html>

File diff suppressed because it is too large
+ 3018 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/package-lock.json


+ 32 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/package.json

@@ -0,0 +1,32 @@
+{
+  "name": "customerbuler-crm",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "start": "vite",
+    "build": "vue-tsc && vite build",
+    "preview": "vite preview"
+  },
+  "dependencies": {
+    "axios": "^1.6.7",
+    "echarts": "^5.5.0",
+    "element-plus": "^2.5.6",
+    "pinia": "^2.1.7",
+    "vue": "^3.4.19",
+    "vue-router": "^4.3.0"
+  },
+  "devDependencies": {
+    "@types/node": "^20.11.24",
+    "@vitejs/plugin-vue": "^5.0.4",
+    "autoprefixer": "^10.4.17",
+    "postcss": "^8.4.35",
+    "sass": "^1.71.1",
+    "sass-loader": "^14.1.1",
+    "tailwindcss": "^3.4.1",
+    "typescript": "^5.2.2",
+    "vite": "^5.1.4",
+    "vue-tsc": "^1.8.27"
+  }
+}

+ 6 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/postcss.config.js

@@ -0,0 +1,6 @@
+export default {
+  plugins: {
+    tailwindcss: {},
+    autoprefixer: {},
+  },
+}

File diff suppressed because it is too large
+ 1 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/public/vite.svg


+ 7 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/App.vue

@@ -0,0 +1,7 @@
+<template>
+  <router-view></router-view>
+</template>
+
+<script setup lang="ts"></script>
+
+<style scoped></style>

+ 3 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/TailWindCss/index.css

@@ -0,0 +1,3 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;

+ 1 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/assets/vue.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>

+ 66 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/ReEcharts/index.vue

@@ -0,0 +1,66 @@
+<script setup lang="ts">
+import { ECharts, EChartsOption, init } from 'echarts';
+import { ref, watch, onMounted, onBeforeUnmount } from 'vue';
+
+// 定义props
+interface Props {
+	width?: string;
+	height?: string;
+	option: EChartsOption;
+}
+const props = withDefaults(defineProps<Props>(), {
+	width: '100%',
+	height: '100%',
+	option: () => ({})
+});
+
+const myChartsRef = ref<HTMLDivElement>();
+let myChart: ECharts;
+// eslint-disable-next-line no-undef
+// let timer: string | number | NodeJS.Timeout | undefined;
+let timer: number | undefined;
+
+// 初始化echarts
+const initChart = (): void => {
+	if (myChart !== undefined) {
+		myChart.dispose();
+	}
+	myChart = init(myChartsRef.value as HTMLDivElement);
+	// 拿到option配置项,渲染echarts
+	myChart?.setOption(props.option, true);
+};
+
+// 重新渲染echarts
+const resizeChart = (): void => {
+	timer = setTimeout(() => {
+		if (myChart) {
+			myChart.resize();
+		}
+	}, 500);
+};
+
+onMounted(() => {
+	initChart();
+	window.addEventListener('resize', resizeChart);
+});
+
+onBeforeUnmount(() => {
+	window.removeEventListener('resize', resizeChart);
+	clearTimeout(timer);
+	timer = 0;
+});
+
+watch(
+	props.option,
+	() => {
+		initChart();
+	},
+	{
+		deep: true
+	}
+);
+</script>
+
+<template>
+	<div ref="myChartsRef" :style="{ height: height, width: width }" :option="option" />
+</template>

+ 18 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/main.ts

@@ -0,0 +1,18 @@
+import { createApp } from 'vue'
+import { createPinia } from 'pinia'
+import ElementPlus from 'element-plus'
+import 'element-plus/dist/index.css'
+import App from './App.vue'
+import router from './router/index'
+import "./styles.css"
+import "./TailWindCss/index.css";
+import * as echarts from 'echarts';
+
+const app = createApp(App)
+
+app.config.globalProperties.$echarts = echarts;
+app
+  .use(ElementPlus)
+  .use(createPinia())
+  .use(router)
+  .mount('#app')

+ 8 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/index.vue

@@ -0,0 +1,8 @@
+<template>
+    <div>
+        indexyemian
+    </div>
+</template>
+<script setup lang="ts">
+</script>
+<style scoped lang="scss"></style>

+ 256 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/login.vue

@@ -0,0 +1,256 @@
+<template>
+    <div @click="tologin">登录</div>
+    <h2> {{ store.name }}</h2>
+    <h1 @click="changeName">修改名称</h1>
+    <el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick" />
+    <div @click="networkRequest()">点击发起网络请求</div>
+    <div class="abc fonsSize30">测试sass样式</div>
+    <div class="text-pink-200">1111</div>
+    <div :style="{ width: '1230px', height: '350px' }">
+        <Echarts :option="option" />
+    </div>
+</template>
+<script lang="ts" setup>
+import { reactive } from 'vue';
+import Echarts from '@/components/ReEcharts/index.vue';
+import { useRoute, useRouter } from 'vue-router'
+import { useStore } from "../store/index";
+import { post } from '@/utils/request'
+
+const router = useRouter()
+const store = useStore()
+function tologin() {
+    router.push({
+        name: 'index'
+    })
+}
+function changeName(): void {
+    store.name = '索索'
+}
+
+async function networkRequest(): Promise<void> {
+    console.log('发起请求')
+    const requestUrl = '/user/loginAdmin'
+    const data = {
+        username: '18130408100',
+        password: '220926'
+    }
+    // proxy.$post(requestUrl, data)
+    // .then((response: any) => {
+    //     console.log(response, '<=== 请求返回的数据')
+    // })
+    const res = await post(requestUrl, data)
+    console.log(res, '<=== 请求返回的数据')
+}
+
+
+interface Tree {
+    label: string
+    children?: Tree[]
+}
+
+const handleNodeClick = (data: Tree) => {
+    console.log(data)
+}
+
+const data: Tree[] = [
+    {
+        label: 'Level one 1',
+        children: [
+            {
+                label: 'Level two 1-1',
+                children: [
+                    {
+                        label: 'Level three 1-1-1',
+                    },
+                ],
+            },
+        ],
+    },
+    {
+        label: 'Level one 2',
+        children: [
+            {
+                label: 'Level two 2-1',
+                children: [
+                    {
+                        label: 'Level three 2-1-1',
+                    },
+                ],
+            },
+            {
+                label: 'Level two 2-2',
+                children: [
+                    {
+                        label: 'Level three 2-2-1',
+                    },
+                ],
+            },
+        ],
+    },
+    {
+        label: 'Level one 3',
+        children: [
+            {
+                label: 'Level two 3-1',
+                children: [
+                    {
+                        label: 'Level three 3-1-1',
+                    },
+                ],
+            },
+            {
+                label: 'Level two 3-2',
+                children: [
+                    {
+                        label: 'Level three 3-2-1',
+                    },
+                ],
+            },
+        ],
+    },
+]
+
+const defaultProps = {
+    children: 'children',
+    label: 'label',
+}
+
+const option = reactive({
+    tooltip: {
+        trigger: 'axis',
+        axisPointer: {
+            type: 'shadow',
+            label: {
+                show: true
+            }
+        }
+    },
+    grid: {
+        left: '4%',
+        top: '15%',
+        right: '4%',
+        bottom: '10%'
+    },
+    legend: {
+        data: ['昨日总人数', '今日实时人数'],
+        top: '4%',
+        color: '#1FC3CE',
+        fontSize: 14,
+        selected: { 昨日使用率: false } // 不需要显示的设置为false
+    },
+    xAxis: {
+        data: [
+            '会议室1',
+            '会议室2',
+            '会议室3',
+            '会议室4',
+            '会议室5',
+            '会议室6',
+            '会议室7',
+            '会议室8',
+            '会议室9'
+        ],
+        axisLine: {
+            show: true, //隐藏X轴轴线
+            lineStyle: {
+                color: '#eee',
+                width: 1
+            }
+        },
+        axisTick: {
+            show: true, //隐藏X轴刻度
+            alignWithLabel: true
+        },
+        axisLabel: {
+            show: true,
+            color: '#333', //X轴文字颜色
+            fontSize: 14
+        }
+    },
+    yAxis: [
+        {
+            type: 'value',
+            name: '人数',
+            nameTextStyle: {
+                color: '#333',
+                fontSize: 14
+            },
+            splitLine: {
+                show: true,
+                lineStyle: {
+                    width: 1,
+                    color: '#eee'
+                }
+            },
+            axisTick: {
+                show: false
+            },
+            axisLine: {
+                show: false
+            },
+            axisLabel: {
+                show: true,
+                color: '#333',
+                fontSize: 14
+            }
+        }
+    ],
+    series: [
+        {
+            name: '昨日总人数',
+            type: 'bar',
+            barWidth: 18,
+            itemStyle: {
+                color: {
+                    type: 'linear',
+                    x: 0, // 右
+                    y: 1, // 下
+                    x2: 0, // 左
+                    y2: 0, // 上
+                    colorStops: [
+                        {
+                            offset: 0,
+                            color: '#F89898' // 0% 处的颜色
+                        },
+                        {
+                            offset: 1,
+                            color: '#F56C6C' // 100% 处的颜色
+                        }
+                    ]
+                }
+            },
+            data: [24, 45, 43, 35, 76, 154, 86, 42, 68]
+        },
+        {
+            name: '今日实时人数',
+            type: 'bar',
+            barWidth: 18,
+            itemStyle: {
+                color: {
+                    type: 'linear',
+                    x: 0, // 右
+                    y: 1, // 下
+                    x2: 0, // 左
+                    y2: 0, // 上
+                    colorStops: [
+                        {
+                            offset: 0,
+                            color: '#52A7FF' // 0% 处的颜色
+                        },
+                        {
+                            offset: 1,
+                            color: '#409EFF' // 100% 处的颜色
+                        }
+                    ]
+                }
+            },
+            data: [133, 23, 114, 67, 89, 35, 67, 96, 90]
+        }
+    ]
+});
+
+</script>
+
+<style lang="scss" scoped></style>
+

+ 18 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/test/config.ts

@@ -0,0 +1,18 @@
+export const config = {
+  1: {
+    num: 1,
+    show: true,
+  },
+  2: {
+    num: 2,
+    show: true,
+  },
+  3: {
+    num: "",
+    show: false,
+  },
+  4: {
+    num: "少时诵诗书",
+    show: false,
+  },
+};

+ 20 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/test/index.vue

@@ -0,0 +1,20 @@
+<template>
+  <div class="flex w-96 justify-around">
+    <div class="w-1/6 h-80 bg-cyan-200 line-through">1</div>
+    <div class="w-1/6 h-80 bg-cyan-200 leading-normal">2</div>
+    <div v-if="config[id].show" class="w-1/6 h-80 bg-cyan-200 hover:translate-y-10 duration-500">3</div>
+    <div class="myClass">4</div>
+    <div>{{ config[id].num }}</div>
+  </div>
+</template>
+<script lang="ts" setup>
+import { config } from "./config"
+const id = 2;
+</script>
+<style lang="scss" scoped>
+.myClass {
+  @apply w-1/6;
+  @apply bg-red-700;
+  @apply text-white
+}
+</style>

+ 32 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/router/index.ts

@@ -0,0 +1,32 @@
+import { createRouter, createWebHistory, } from 'vue-router'
+import Login from '../pages/login.vue';
+
+export const routes = [
+    {
+        path: '/',
+        redirect: '/login'
+    },
+    {
+        name: 'login',
+        path: '/login',
+        component: Login
+    },
+    {
+        name: 'index',
+        path: '/index',
+        component: () => import("../pages/index.vue")
+    }, {
+        name: "test",
+        path: "/test",
+        component: () => import("../pages/test/index.vue")
+    }
+]
+const router = createRouter({
+    scrollBehavior: () => ({ left: 0, top: 0 }),
+    history: createWebHistory(),
+    routes,
+})
+router.beforeEach((_to, _from, next) => {
+    next()
+})
+export default router

+ 18 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/store/index.ts

@@ -0,0 +1,18 @@
+import { defineStore, acceptHMRUpdate } from "pinia";
+export const useStore = defineStore({
+    id: "index",
+    state: () => ({name: "old name",}),
+    getters: {
+        myName: (state) => {
+            return `getters ${state.name}`
+        }
+    },
+    actions: {
+        changeName(name: string) {
+            this.name = name
+        }
+    },
+});
+if (import.meta.hot) {
+    import.meta.hot.accept(acceptHMRUpdate(useStore, import.meta.hot))
+}

+ 80 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/styles.css

@@ -0,0 +1,80 @@
+:root {
+    font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
+    line-height: 1.5;
+    font-weight: 400;
+  
+    color-scheme: light dark;
+    color: rgba(255, 255, 255, 0.87);
+    background-color: #242424;
+  
+    font-synthesis: none;
+    text-rendering: optimizeLegibility;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+  }
+  
+  a {
+    font-weight: 500;
+    color: #646cff;
+    text-decoration: inherit;
+  }
+  a:hover {
+    color: #535bf2;
+  }
+  
+  body {
+    margin: 0;
+    display: flex;
+    place-items: center;
+    min-width: 320px;
+    min-height: 100vh;
+  }
+  
+  h1 {
+    font-size: 3.2em;
+    line-height: 1.1;
+  }
+  
+  button {
+    border-radius: 8px;
+    border: 1px solid transparent;
+    padding: 0.6em 1.2em;
+    font-size: 1em;
+    font-weight: 500;
+    font-family: inherit;
+    background-color: #1a1a1a;
+    cursor: pointer;
+    transition: border-color 0.25s;
+  }
+  button:hover {
+    border-color: #646cff;
+  }
+  button:focus,
+  button:focus-visible {
+    outline: 4px auto -webkit-focus-ring-color;
+  }
+  
+  .card {
+    padding: 2em;
+  }
+  
+  #app {
+    max-width: 1280px;
+    margin: 0 auto;
+    padding: 2rem;
+    text-align: center;
+  }
+  
+  @media (prefers-color-scheme: light) {
+    :root {
+      color: #213547;
+      background-color: #ffffff;
+    }
+    a:hover {
+      color: #747bff;
+    }
+    button {
+      background-color: #f9f9f9;
+    }
+  }
+  

+ 0 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/styles/global.scss


+ 41 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/utils/errorStatusCode.ts

@@ -0,0 +1,41 @@
+export const showMessage = (status: number | string): string => {
+    let message: string = "";
+    switch (status) {
+      case 400:
+        message = "请求错误(400)";
+        break;
+      case 401:
+        message = "未授权,请重新登录(401)";
+        break;
+      case 403:
+        message = "拒绝访问(403)";
+        break;
+      case 404:
+        message = "请求出错(404)";
+        break;
+      case 408:
+        message = "请求超时(408)";
+        break;
+      case 500:
+        message = "服务器错误(500)";
+        break;
+      case 501:
+        message = "服务未实现(501)";
+        break;
+      case 502:
+        message = "网络错误(502)";
+        break;
+      case 503:
+        message = "服务不可用(503)";
+        break;
+      case 504:
+        message = "网络超时(504)";
+        break;
+      case 505:
+        message = "HTTP版本不受支持(505)";
+        break;
+      default:
+        message = `连接出错(${status})!`;
+    }
+    return `${message},请检查网络或联系管理员!`;
+  };

+ 66 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/utils/request.ts

@@ -0,0 +1,66 @@
+import axios from "axios";
+import { showMessage } from "./errorStatusCode"; // 引入状态码文件
+import type { AxiosRequestConfig, AxiosResponse, AxiosError } from "axios";
+import { ElNotification } from "element-plus";
+
+// 创建axios实例
+const instance = axios.create({
+  baseURL: "/api", // 设置API的基础URL
+});
+
+// 请求拦截器
+instance.interceptors.request.use(
+  (config: AxiosRequestConfig): any => {
+    // 可在请求发送前对config进行修改,如添加请求头等
+    const headers = config.headers || {};
+    headers["Authorization"] = "Bxxx";
+    config.headers = headers;
+    return config;
+  },
+  (error: AxiosError) => {
+    // 处理请求错误
+    return Promise.reject(error);
+  }
+);
+
+// 响应拦截器
+instance.interceptors.response.use(
+  (response: AxiosResponse) => {
+    // 对响应数据进行处理
+    if (response.status != 200) {
+      ElNotification({
+        message: showMessage(response.status), // 传入响应码,匹配响应码对应信息,
+        type: "error",
+      });
+    }
+    return response;
+  },
+  (error: AxiosError) => {
+    // 处理响应错误
+    return Promise.reject(error);
+  }
+);
+
+// 封装GET请求
+export async function get<T>(url: string, params?: any): Promise<T> {
+  return instance
+    .get<T>(url, { params })
+    .then((response) => response.data)
+    .catch((error) => {
+      throw error;
+    });
+}
+
+// 封装POST请求
+export async function post<T>(url: string, data?: any): Promise<T> {
+  return instance
+    .post<T>(url, data, {
+      headers: {
+        "Content-type": " application/x-www-form-urlencoded; charset=UTF-8",
+      },
+    })
+    .then((response) => response.data)
+    .catch((error) => {
+      throw error;
+    });
+}

+ 7 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/vite-env.d.ts

@@ -0,0 +1,7 @@
+/// <reference types="vite/client" />
+declare module "*.vue" {
+    import type { DefineComponent } from "vue";
+    const vueComponent: DefineComponent<{}, {}, any>;
+    export default vueComponent;
+}
+

+ 9 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/tailwind.config.js

@@ -0,0 +1,9 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+  content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
+  theme: {
+    extend: {},
+  },
+  plugins: [],
+}
+

+ 30 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/tsconfig.json

@@ -0,0 +1,30 @@
+{
+  "compilerOptions": {
+    "target": "ES2020",
+    "useDefineForClassFields": true,
+    "module": "ESNext",
+    "lib": ["ES2020", "DOM", "DOM.Iterable"],
+    "skipLibCheck": true,
+
+    /* Bundler mode */
+    /* "moduleResolution": "bundler" */
+    "moduleResolution": "node",
+    "allowImportingTsExtensions": true,
+    "resolveJsonModule": true,
+    "isolatedModules": true,
+    "noEmit": true,
+    "jsx": "preserve",
+
+    /* Linting */
+    "strict": true,
+    /* "noUnusedLocals": true 是否开始不使用变量报错 */
+    "noUnusedLocals": false,
+    "noUnusedParameters": true,
+    "noFallthroughCasesInSwitch": true,
+    "paths": {
+      "@/*": ["./src/*"]
+    }
+  },
+  "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"],
+  "references": [{ "path": "./tsconfig.node.json" }]
+}

+ 11 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/tsconfig.node.json

@@ -0,0 +1,11 @@
+{
+  "compilerOptions": {
+    "composite": true,
+    "skipLibCheck": true,
+    "module": "ESNext",
+    "moduleResolution": "bundler",
+    "allowSyntheticDefaultImports": true,
+    "strict": true
+  },
+  "include": ["vite.config.ts"]
+}

+ 39 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/vite.config.ts

@@ -0,0 +1,39 @@
+import { defineConfig } from "vite";
+import vue from "@vitejs/plugin-vue";
+
+import { resolve } from "path";
+
+const target = "http://47.101.180.183:10010";
+
+export default defineConfig({
+  plugins: [vue()],
+  server: {
+    host: "127.0.0.1",
+    port: 19123,
+    open: true,
+    proxy: {
+      "/api": {
+        // 这里的'/api'表示需要转发到的接口路径前缀
+        target, // 将请求转发到的目标地址
+        changeOrigin: true, // 支持跨域
+        rewrite: (path) => path.replace(/^\/api/, ""), // 去除请求路径中的'/api'前缀
+      },
+    },
+  },
+  resolve: {
+    alias: {
+      "@": resolve(__dirname, "./src"),
+    },
+    //extensions: [".ts", ".js", ".vue", ".json", ".mjs"],
+    extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],
+  },
+  // css相关配置
+  css: {
+    preprocessorOptions: {
+      scss: {
+        additionalData: '@import "@/styles/global.scss";'
+
+      },
+    },
+  },
+});

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -442,7 +442,7 @@ public class ReportController {
         }
 
         if (overtimeHours == null) {
-            overtimeHours = new Double[projectId.length];
+            overtimeHours = new Double[projectAuditorId.length];
             for(int i=0;i<projectAuditorId.length; i++) {
                 overtimeHours[i] = null;
             }

+ 47 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceImportServiceImpl.java

@@ -1,6 +1,7 @@
 package com.management.platform.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.pagehelper.util.StringUtil;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.*;
@@ -356,10 +357,18 @@ public class FinanceImportServiceImpl extends ServiceImpl<FinanceImportMapper, F
                     Cell field1 = cusColList.size() > 0?row.getCell(9):null;
                     Cell field2 = cusColList.size() > 1?row.getCell(10):null;
                     Cell field3 = cusColList.size() > 2?row.getCell(11):null;
+                    Cell field4 = cusColList.size() > 3?row.getCell(12):null;
+                    Cell field5 = cusColList.size() > 4?row.getCell(13):null;
+                    Cell field6 = cusColList.size() > 5?row.getCell(14):null;
+                    Cell field7 = cusColList.size() > 6?row.getCell(15):null;
 
                     if (field1 != null)field1.setCellType(CellType.STRING);
                     if (field2 != null)field2.setCellType(CellType.STRING);
                     if (field3 != null)field3.setCellType(CellType.STRING);
+                    if (field4 != null)field4.setCellType(CellType.STRING);
+                    if (field5 != null)field5.setCellType(CellType.STRING);
+                    if (field6 != null)field6.setCellType(CellType.STRING);
+                    if (field7 != null)field7.setCellType(CellType.STRING);
 
                     finance.setCompanyId(companyId);
                     finance.setName(name);
@@ -385,49 +394,49 @@ public class FinanceImportServiceImpl extends ServiceImpl<FinanceImportMapper, F
                         if (bonusCell != null) {
                             bonusCell.setCellType(CellType.STRING);
                             String bonusString = bonusCell.getStringCellValue();
-                            BigDecimal bonus = bonusString != null ? new BigDecimal(bonusString.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
+                            BigDecimal bonus = !StringUtil.isEmpty(bonusString) ? new BigDecimal(bonusString.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
                             finance.setBonus(bonus);
                             if (financeConfig.getBonusCalculate()==1) total = total.add(bonus);
                         }
                         if (allowanceCell != null) {
                             allowanceCell.setCellType(CellType.STRING);
                             String item = allowanceCell.getStringCellValue();
-                            BigDecimal value = item != null ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
+                            BigDecimal value = !StringUtil.isEmpty(item) ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
                             finance.setAllowance(value);
                             if (financeConfig.getAllowanceCalculate()==1) total = total.add(value);
                         }
                         if (inJobCell != null) {
                             inJobCell.setCellType(CellType.STRING);
                             String item = inJobCell.getStringCellValue();
-                            BigDecimal value = item != null ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
+                            BigDecimal value = !StringUtil.isEmpty(item) ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
                             finance.setInsuranceLosejob(value);
                             if (financeConfig.getInsuranceLosejobCalculate()==1) total = total.add(value);
                         }
                         if (inMedicalCell != null) {
                             inMedicalCell.setCellType(CellType.STRING);
                             String item = inMedicalCell.getStringCellValue();
-                            BigDecimal value = item != null ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
+                            BigDecimal value = !StringUtil.isEmpty(item) ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
                             finance.setInsuranceMedical(value);
                             if (financeConfig.getInsuranceMedicalCalculate()==1) total = total.add(value);
                         }
                         if (inOldCell != null) {
                             inOldCell.setCellType(CellType.STRING);
                             String item = inOldCell.getStringCellValue();
-                            BigDecimal value = item != null ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
+                            BigDecimal value = !StringUtil.isEmpty(item) ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
                             finance.setInsuranceOld(value);
                             if (financeConfig.getInsuranceOldCalculate()==1) total = total.add(value);
                         }
                         if (injuryCell != null) {
                             injuryCell.setCellType(CellType.STRING);
                             String item = injuryCell.getStringCellValue();
-                            BigDecimal value = item != null ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
+                            BigDecimal value = !StringUtil.isEmpty(item) ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
                             finance.setInsuranceInjury(value);
                             if (financeConfig.getInsuranceInjuryCalculate()==1) total = total.add(value);
                         }
                         if (houseFundCell != null) {
                             houseFundCell.setCellType(CellType.STRING);
                             String item = houseFundCell.getStringCellValue();
-                            BigDecimal value = item != null ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
+                            BigDecimal value = !StringUtil.isEmpty(item) ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
                             finance.setHouseFund(value);
                             if (financeConfig.getHouseFundCalculate()==1) total = total.add(value);
                         }
@@ -435,24 +444,52 @@ public class FinanceImportServiceImpl extends ServiceImpl<FinanceImportMapper, F
                         if (field1 != null) {
                             field1.setCellType(CellType.STRING);
                             String item = field1.getStringCellValue();
-                            BigDecimal value = item != null ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
+                            BigDecimal value = !StringUtil.isEmpty(item) ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
                             finance.setCustomField1(value);
                             if (financeConfig.getField1Calculate() != null && financeConfig.getField1Calculate()==1) total = total.add(value);
                         }
                         if (field2 != null) {
                             field2.setCellType(CellType.STRING);
                             String item = field2.getStringCellValue();
-                            BigDecimal value = item != null ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
+                            BigDecimal value = !StringUtil.isEmpty(item) ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
                             finance.setCustomField2(value);
                             if (financeConfig.getField2Calculate() != null && financeConfig.getField2Calculate()==1) total = total.add(value);
                         }
                         if (field3 != null) {
                             field3.setCellType(CellType.STRING);
                             String item = field3.getStringCellValue();
-                            BigDecimal value = item != null ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
+                            BigDecimal value = !StringUtil.isEmpty(item)? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
                             finance.setCustomField3(value);
                             if (financeConfig.getField3Calculate() != null && financeConfig.getField3Calculate()==1) total = total.add(value);
                         }
+                        if (field4 != null) {
+                            field4.setCellType(CellType.STRING);
+                            String item = field4.getStringCellValue();
+                            BigDecimal value = !StringUtil.isEmpty(item)? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
+                            finance.setCustomField4(value);
+                            if (financeConfig.getField4Calculate() != null && financeConfig.getField4Calculate()==1) total = total.add(value);
+                        }
+                        if (field5 != null) {
+                            field5.setCellType(CellType.STRING);
+                            String item = field5.getStringCellValue();
+                            BigDecimal value = !StringUtil.isEmpty(item)? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
+                            finance.setCustomField5(value);
+                            if (financeConfig.getField5Calculate() != null && financeConfig.getField5Calculate()==1) total = total.add(value);
+                        }
+                        if (field6 != null) {
+                            field6.setCellType(CellType.STRING);
+                            String item = field6.getStringCellValue();
+                            BigDecimal value = !StringUtil.isEmpty(item)? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
+                            finance.setCustomField6(value);
+                            if (financeConfig.getField6Calculate() != null && financeConfig.getField6Calculate()==1) total = total.add(value);
+                        }
+                        if (field7 != null) {
+                            field7.setCellType(CellType.STRING);
+                            String item = field7.getStringCellValue();
+                            BigDecimal value = !StringUtil.isEmpty(item)? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
+                            finance.setCustomField7(value);
+                            if (financeConfig.getField7Calculate() != null && financeConfig.getField7Calculate()==1) total = total.add(value);
+                        }
                         finance.setTotalCost(total);
 
                         //如果需要更新员工成本

+ 37 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java

@@ -649,6 +649,9 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             BigDecimal totalField7 = cusColList.size() > 6?BigDecimal.valueOf(0):null;
 
             List<String> headList = new ArrayList<String>();
+            List<String> sheetNameList = new ArrayList<String>();
+            sheetNameList.add("财务数据分摊总表");
+            int fixedColCount = 4;
             if (groupByCategory == 0) {
                 //headList.add("项目编号");
                 headList.add(MessageUtils.message("entry.projectId"));
@@ -656,28 +659,39 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 headList.add(MessageUtils.message("entry.projectName"));
                 //headList.add("人员");
                 headList.add(MessageUtils.message("entry.personnel"));
-                headList.add("部门");
+                headList.add(MessageUtils.message("entry.dept"));
                 for (UserCustom userCustom : userCustoms) {
                     headList.add(userCustom.getName());
+                    fixedColCount++;
                 }
                 //headList.add("工时(h)");
                 headList.add(MessageUtils.message("entry.workHours")+"(h)");
+                fixedColCount++;
             } else {
                 //headList.add("项目分类");
                 headList.add(MessageUtils.message("entry.projectType"));
             }
             FinanceFixedcolname fixedItem = financeFixedcolnameService.getFixed(companyId);
             headList.add(fixedItem.getMonthCost()+"(元)");
+            sheetNameList.add(fixedItem.getMonthCost()+"分摊表");
             headList.add(fixedItem.getBonus()+"(元)");
+            sheetNameList.add(fixedItem.getBonus()+"分摊表");
             headList.add(fixedItem.getAllowance()+"(元)");
+            sheetNameList.add(fixedItem.getAllowance()+"分摊表");
             headList.add(fixedItem.getInsuranceOld()+"(元)");
+            sheetNameList.add(fixedItem.getInsuranceOld()+"分摊表");
             headList.add(fixedItem.getInsuranceMedical()+"(元)");
+            sheetNameList.add(fixedItem.getInsuranceMedical()+"分摊表");
             headList.add(fixedItem.getInsuranceLosejob()+"(元)");
+            sheetNameList.add(fixedItem.getInsuranceLosejob()+"分摊表");
             headList.add(fixedItem.getInsuranceInjury()+"(元)");
+            sheetNameList.add(fixedItem.getInsuranceInjury()+"分摊表");
             headList.add(fixedItem.getHouseFund()+"(元)");
+            sheetNameList.add(fixedItem.getHouseFund()+"分摊表");
 //            headList.add("其他(元)");
             for (FinanceTblcuscol col : cusColList) {
                 headList.add(col.getFieldName());
+                sheetNameList.add(col.getFieldName()+"分摊表");
             }
             //headList.add("总成本(元)");
             headList.add(MessageUtils.message("entry.totalCost")+"(元)");
@@ -1463,9 +1477,29 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             allList.add(sumRow);
             //生成excel文件导出
             //String fileName = yearMonth+(groupByCategory==0?"财务人员成本_":"财务项目分类成本_")+System.currentTimeMillis();
-            String fileName = yearMonth+(groupByCategory==0?MessageUtils.message("fileName.costFinancialPersonnel"):MessageUtils.message("fileName.proClassCost"))+System.currentTimeMillis();
+            String fileName = yearMonth+(groupByCategory == 0?MessageUtils.message("fileName.costFinancialPersonnel"):MessageUtils.message("fileName.proClassCost"))+System.currentTimeMillis();
             try {
-                return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
+                if (groupByCategory == 0) {
+                    //一个总表和自定义字段多个sheet
+                    List[] multiSheetDataList = new ArrayList[sheetNameList.size()];
+                    multiSheetDataList[0] = allList;
+                    for (int i = 1; i < sheetNameList.size(); i++) {
+                        multiSheetDataList[i] = new ArrayList();
+                        for (List<String> rowData : allList) {
+                            List<String> newRow = new ArrayList<String>();
+                            //取前面固定的列
+//                            System.out.println("before: "+rowData.size());
+                            rowData.subList(0, fixedColCount).forEach(newRow::add);
+//                            System.out.println("after: "+rowData.size());
+                            //按当前表单的顺序,取数据部分
+                            newRow.add(rowData.get(fixedColCount + i - 1));
+                            multiSheetDataList[i].add(newRow);
+                        }
+                    }
+                    return excelExportService.exportMultiSheetGeneralExcelByTitleAndList(wxCorpInfo,fileName , multiSheetDataList, path, sheetNameList.toArray(new String[0]));
+                } else {
+                    return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
+                }
             } catch (Exception e) {
                 e.printStackTrace();
             }

+ 6 - 16
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -1241,6 +1241,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                         //跨天请假的情况,中间如果有非工作日要自动补齐时间。
                         List<LocalDate> betweenNonWorkDays = new ArrayList<>();
                         int betweenTotalDays = 0;
+                        boolean isWholeDayLeave = false;
                         for (int t = 0; t < holidayItems.size(); t++) {
                             JSONObject holiday = holidayItems.getJSONObject(t);
                             JSONObject spTitle = holiday.getJSONObject("sp_title");
@@ -1277,6 +1278,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                             if (leaveStart.equals("上午")) {
                                                 leaveEnd = baseAfternoonEnd;//上午和下午都请假,算全天
                                                 leaveStart = baseMorningStart;
+                                                isWholeDayLeave = true;
                                             } else {
                                                 leaveStart = "14:00";
                                                 leaveEnd = baseAfternoonEnd;//请假的下班打卡时间,算上班结束的时间
@@ -1316,6 +1318,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                             if (showLog) System.out.println("跨天请假第一天leaveStart为:"+leaveStart);
                                             if (leaveStart.equals("上午")) {
                                                 leaveStart = baseMorningStart;
+                                                isWholeDayLeave = true;//第一天上午开始请假,第一天就算全天请假
                                             } else if (leaveStart.equals("下午")) {
                                                 leaveStart = baseAfternoonStart;
                                             }
@@ -1325,6 +1328,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                             //当前日期就是最后一天,需判断上下午半天请假的情况
                                             if (leaveEnd.equals("下午")) {
                                                 leaveEnd = baseAfternoonEnd;//请假到最后一天的下午,就算是全天
+                                                isWholeDayLeave = true;
                                             } else if (leaveEnd.equals("上午")) {
                                                 //上午请假
                                                 leaveEnd = baseMorningEnd;
@@ -1335,6 +1339,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                             //中间日期就是全天
                                             leaveStart = baseMorningStart;
                                             leaveEnd = baseAfternoonEnd;
+                                            isWholeDayLeave = true;
                                             if (showLog) System.out.println("===中间天请假===");
                                         }
                                     }
@@ -1498,21 +1503,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                             switch (spItem.getInteger("type")) {
                                 case 1://请假
                                     //单独计算请假时间
-//                                    Double leaveTime = ct.getAskLeaveTime();
-//                                    if (leaveTime == null) {
-//                                        leaveTime = 0.0;
-//                                    }
-//                                    int wxDuration = spItem.getInteger("duration");
-//                                    int seconds = 0;
-//                                    if (betweenNonWorkDays.size() > 0) {
-//                                        //跨天请假中含有非工作日的情况,要减去非工作日来重新计算实际工作日的每天请假时长。
-//                                        seconds = wxDuration * betweenTotalDays/(betweenTotalDays - betweenNonWorkDays.size());
-//                                    } else {
-//                                        seconds = wxDuration;
-//                                    }
-//                                    double curLeaveTime = convertDayTimeToHours(DateTimeUtil.getHoursFromSeconds(seconds));
-//                                    System.out.println("curLeaveTime============="+curLeaveTime);
-//                                    ct.setAskLeaveTime(leaveTime + curLeaveTime);
                                     break;
                                 case 2://补卡
                                 case 3://出差
@@ -1640,7 +1630,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                         }
                         //针对赛元微电子,请半天假的情况下。重新校正打卡和工作时长
                         if (corpInfo.getCorpid().equals("wpy9TkCAAAgNp4jvqxKTpXrhvwFvyFHg")) {
-                            if (morningLeave && afternoonLeave) {
+                            if ((morningLeave && afternoonLeave) || isWholeDayLeave) {
                                 ct.setAskLeaveTime(baseMorningWorkTime + baseAfternoonWorkTime);
                                 ct.setWorkHours(0.0);
                                 ct.setCardTime(0.0);

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages.properties

@@ -415,6 +415,7 @@ entry.Participants=参与人
 entry.projectManager=项目经理
 entry.level=级别
 entry.department=所属部门
+entry.dept=部门
 entry.customer=客户
 entry.startData=开始日期
 entry.endDate=截止日期

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_en_US.properties

@@ -415,6 +415,7 @@ entry.Participants=Participants
 entry.projectManager=project manager
 entry.level=level
 entry.department=Department
+entry.dept=Department
 entry.customer=customer
 entry.startData=Start Date
 entry.endDate=end date

+ 1 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ReportService.java

@@ -113,7 +113,7 @@ public interface ReportService extends IService<Report> {
 //
 //    HttpRespMsg batchApproveByDate(String startDate, String endDate, HttpServletRequest request);
 
-    HttpRespMsg submitReport(Report report, HttpServletRequest request);
+    HttpRespMsg  submitReport(Report report, HttpServletRequest request);
 
     HttpRespMsg getChekerList(Integer checkType, Integer deptId);
 

+ 2 - 2
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -135,7 +135,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     private String path;
 
     @Override
-    public HttpRespMsg submitReport(Report report, HttpServletRequest request) {
+    public synchronized HttpRespMsg submitReport(Report report, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
@@ -160,7 +160,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
         }
 
-        //检查今日该员工的该工序是否已经有报工
+        //检查当天该员工的该工序是否已经有报工
         Report todayReport = reportMapper.selectOne(new QueryWrapper<Report>().eq("creator_id", token).eq("user_procedure_team_id", report.getUserProcedureTeamId()).eq("create_date", targetDate));
         //计算工作时长
         ProdProcedureTeam prodProcedureTeam = prodProcedureTeamMapper.selectById(report.getUserProcedureTeamId());

+ 1 - 0
fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue

@@ -29,6 +29,7 @@
 
         <!--列表-->
         <el-table :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+            <el-table-column prop="id" label="企业ID" min-width="180" align="center"></el-table-column>
             <el-table-column prop="companyName" label="企业名称" min-width="240" align="center">
             </el-table-column>
             <el-table-column prop="setMeal" label="是否签约"  min-width="80" align="center">

+ 3 - 1
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/fillReport.vue

@@ -191,6 +191,7 @@ export default {
       this.submitData();
     },
     submitData() {
+      this.saving = true;
       let postData = {
         userProcedureTeamId: this.reportForm.id,
         prodProcedureId: this.reportForm.prod_procedure_id,
@@ -211,13 +212,14 @@ export default {
         if (this.reportForm.check_type != 0) {
           if (this.reportForm.checker_id == null) {
             this.$toast.fail('请选择检验人')
+            this.saving = false;
             return;
           } else {
             postData.checkerId = this.reportForm.checker_id;
           }
         }
       }
-      this.saving = true;
+      
       this.$axios.post("/report/submitReport", postData)
         .then(res => {
           this.saving = false;

+ 14 - 9
fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue

@@ -98,7 +98,7 @@
                 </el-radio-group>
                 
                 <el-table :data="reviewLis" style="width: 100%" :height="400">
-                    <el-table-column prop="userName" :label="$t('other.operator')">
+                    <el-table-column prop="userName" :label="$t('other.operator')" width="100">
                         <template slot-scope="scope">
                             <div>
                                 <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data></span>
@@ -106,8 +106,8 @@
                             </div>
                         </template>
                     </el-table-column>
-                    <el-table-column prop="ymonth" :label="$t('BelongsIn')"></el-table-column>
-                    <el-table-column prop="fileName" :label="$t('filename')">
+                    <el-table-column prop="ymonth" :label="$t('BelongsIn')" width="100"></el-table-column>
+                    <el-table-column prop="fileName" :label="$t('filename')"  >
                         <template slot-scope="scope">
                             <div>
                                 <el-link type="primary" @click="downloadByA({name:scope.row.fileName,url:scope.row.serverName})"> {{scope.row.fileName}}</el-link>
@@ -128,13 +128,13 @@
                             </div>
                         </template>
                     </el-table-column>
-                    <el-table-column prop="indate" :label="$t('Uploadtime')"></el-table-column>
-                    <el-table-column prop="date" :label="$t('operation')" v-if="(tabPosition == 1 || tabPosition == 0) && (reviewerRuleForm.auditorId == user.id)">
+                    <el-table-column prop="indate" :label="$t('Uploadtime')" width="150"></el-table-column>
+                    <el-table-column prop="date" :label="$t('operation')" v-if="(tabPosition == 1 || tabPosition == 0) && (reviewerRuleForm.auditorId == user.id)" :width="tabPosition==0?210:120">
                         <template slot-scope="scope">
                             <div>
-                                <el-button type="primary" size="small" v-if="tabPosition == 0" @click="operationList(0, scope.row.id)">{{ $t('btn.through') }}</el-button>
-                                <el-button type="warning" size="small" v-if="tabPosition == 0" @click="operationList(1, scope.row.id)">{{ $t('btn.rejected') }}</el-button>
-                                <el-button type="warning" size="small" v-if="tabPosition == 1" @click="operationList(2, scope.row.id)">{{ $t('btn.undo') }}</el-button>
+                                <el-button type="primary" size="small" :loading="operating" v-if="tabPosition == 0" @click="operationList(0, scope.row.id)">{{ $t('btn.through') }}</el-button>
+                                <el-button type="warning" size="small" :loading="operating" v-if="tabPosition == 0" @click="operationList(1, scope.row.id)">{{ $t('btn.rejected') }}</el-button>
+                                <el-button type="warning" size="small" :loading="operating" v-if="tabPosition == 1" @click="operationList(2, scope.row.id)">{{ $t('btn.undo') }}</el-button>
                             </div>
                         </template>
                     </el-table-column>
@@ -593,6 +593,7 @@ import { error } from 'dingtalk-jsapi';
         },
         data() {
             return {
+                operating: false,
                 showMissingDialog: false,
                 missingFinanceUserList: [],
                 groupByCategory:0,
@@ -1627,6 +1628,7 @@ import { error } from 'dingtalk-jsapi';
             },
             // 审核操作
             operationList(zhi, id) {
+                if (this.operating) return;
                 let urls
                 if(zhi == 0) {
                     urls = '/finance-import/agree'
@@ -1635,16 +1637,19 @@ import { error } from 'dingtalk-jsapi';
                 } else {
                     urls = '/finance-import/cancel'
                 }
+                this.operating = true;
                 this.http.post(urls, {
                     id: id,
                 },
                 res => {
                     if (res.code == "ok") {
+                        this.operating = false;
                        this.$message({
                             message: this.$t('operationissuccessful'),
                             type: "success"
                         });
-                        this.getReviewList()
+                        this.getReviewList();
+                        this.loadMonthData();
                     } else {
                         this.$message({
                             message: res.msg,

+ 6 - 3
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -278,7 +278,7 @@
                         </template>
                     </van-field>
                     <van-field v-if="user.company.packageProject == 1" readonly name="taskId" :value="item.taskName"
-                        :rules="[{ required: user.companyId == 3092 ? true : false, message: '请选择任务/里程碑' }]" label="任务/里程碑"
+                        :rules="[{ required: reportTimeType.taskRequired? true : false, message: '请选择任务/里程碑' }]" label="任务/里程碑"
                         placeholder="请选择任务/里程碑" @click="clickPickerTask(index, item)"></van-field>
                     <van-field v-if="user.companyId == 3092" readonly name="sapServiceId" :value="item.sapServiceName"
                         :rules="[{ required: true, message: '请选择服务' }]" label="服务" placeholder="请选择服务"
@@ -2283,7 +2283,6 @@ export default {
                 if (this.user.timeType.customDegreeActive == 1) {
                     let customDegreeMultiple = this.user.timeType.customDegreeMultiple
                     if (this.form.domains[i].degreeId) {
-                        // formData.append("degreeId", this.form.domains[i].degreeId);
                         if(!customDegreeMultiple) { // 单选
                             formData.append("degreeId", this.form.domains[i].degreeId);
                         } else {
@@ -2295,7 +2294,11 @@ export default {
                             this.$toast.fail('请选择' + this.user.timeType.customDegreeName)
                             return
                         } else {
-                            formData.append("degreeId", !customDegreeMultiple ? -1 : "[]");
+                            if (!customDegreeMultiple) {
+                                formData.append("degreeId", -1);
+                            } else {
+                                formData.append("multiDegrId", '[]');
+                            }
                         }
                     }
                 } else {