zhangjie преди 1 година
родител
ревизия
aedafb14e0

+ 2 - 1
src/router/modules/projectQuality.js

@@ -17,7 +17,6 @@ export default {
       meta: {
         title: '项目质量管理',
         sort: 1,
-        icon: 'control-platform',
         alias: 'projectChildQualityManage',
       },
       children: [
@@ -32,6 +31,7 @@ export default {
             title: '质量问题反馈',
             sort: 1,
             alias: 'qualityProblem',
+            icon: 'service-crm',
           },
         },
         {
@@ -45,6 +45,7 @@ export default {
             title: '质量问题查询',
             sort: 1,
             alias: 'qualityProblemQuery',
+            icon: 'service-crm',
           },
         },
       ],

+ 4 - 2
src/router/modules/resourceGuard.js

@@ -17,7 +17,6 @@ export default {
       meta: {
         title: '人资保障',
         sort: 1,
-        icon: 'usergroup',
         alias: 'humanManage',
       },
       children: [
@@ -32,6 +31,7 @@ export default {
             title: '人员档案管理',
             sort: 1,
             alias: 'userArchives',
+            icon: 'service-crm',
           },
         },
         {
@@ -45,6 +45,7 @@ export default {
             title: '人员调配',
             sort: 2,
             alias: 'userAllocate',
+            icon: 'service-crm',
           },
         },
       ],
@@ -56,7 +57,6 @@ export default {
       meta: {
         title: '设备保障',
         sort: 2,
-        icon: 'print',
         alias: 'deviceManage',
       },
       children: [
@@ -71,6 +71,7 @@ export default {
             title: '出入库登记查询',
             sort: 1,
             alias: 'deviceInOut',
+            icon: 'service-crm',
           },
         },
         {
@@ -84,6 +85,7 @@ export default {
             title: '设备资源监控',
             sort: 2,
             alias: 'deviceControl',
+            icon: 'service-crm',
           },
         },
       ],

+ 0 - 13
src/router/modules/serviceUnit.js

@@ -72,19 +72,6 @@ export default {
             icon: 'service-range',
           },
         },
-        {
-          name: 'AddRange',
-          path: '/service-unit/service-unit-manage/add-range',
-          component: () =>
-            import(
-              '@/views/service-unit/service-unit-manage/add-range/index.vue'
-            ),
-          meta: {
-            title: '新增服务范围',
-            bind: 'serviceScope',
-            // bind: 'RangeManage', //注意,这种不是菜单,但是也属于路由,比如name为"RangeManage"的时候,该路由也要有权限。需要在addRoute的时候考虑进去
-          },
-        },
         {
           name: 'RegionalPlanning',
           path: '/service-unit/service-unit-manage/regional-planning',

+ 6 - 2
src/router/modules/sop.js

@@ -17,7 +17,6 @@ export default {
       meta: {
         title: 'SOP管理',
         sort: 1,
-        icon: 'layers',
         alias: 'sopChildManage',
       },
       children: [
@@ -30,6 +29,7 @@ export default {
             title: '教务处SOP管理',
             sort: 1,
             alias: 'office',
+            icon: 'service-crm',
           },
         },
         {
@@ -70,6 +70,7 @@ export default {
             title: '研究生SOP管理', //后端菜单暂时没有提供,等待需求落定
             sort: 2,
             alias: 'cloudMark',
+            icon: 'service-crm',
           },
         },
         {
@@ -81,6 +82,7 @@ export default {
             title: '设备出入库登记',
             sort: 3,
             alias: 'deviceInOutSop',
+            icon: 'service-crm',
           },
         },
         {
@@ -92,6 +94,7 @@ export default {
             title: '项目计划变更报备',
             sort: 4,
             alias: 'projectExchange',
+            icon: 'service-crm',
           },
         },
       ],
@@ -103,7 +106,6 @@ export default {
       meta: {
         title: 'SOP监控',
         sort: 1,
-        icon: 'browse',
         alias: 'sopControlManage',
       },
       children: [
@@ -116,6 +118,7 @@ export default {
             title: '延期预警',
             sort: 2,
             alias: 'delayWarn',
+            icon: 'service-crm',
           },
         },
         {
@@ -127,6 +130,7 @@ export default {
             title: '违规登记',
             sort: 3,
             alias: 'violation',
+            icon: 'service-crm',
           },
         },
       ],

+ 3 - 2
src/router/modules/user.js

@@ -17,7 +17,6 @@ export default {
       meta: {
         title: '组织架构管理',
         sort: 1,
-        icon: 'fork',
         alias: 'orgManage',
       },
       children: [
@@ -30,6 +29,7 @@ export default {
             title: '组织架构管理',
             sort: 1,
             alias: 'org',
+            icon: 'service-crm',
           },
         },
       ],
@@ -41,7 +41,6 @@ export default {
       meta: {
         title: '用户权限管理',
         sort: 2,
-        icon: 'pin',
         alias: 'userPrivilegeManage',
       },
       children: [
@@ -54,6 +53,7 @@ export default {
             title: '用户管理',
             sort: 1,
             alias: 'user',
+            icon: 'service-crm',
           },
         },
         {
@@ -65,6 +65,7 @@ export default {
             title: '角色管理',
             sort: 2,
             alias: 'role',
+            icon: 'service-crm',
           },
         },
         {

+ 4 - 1
src/router/modules/workHours.js

@@ -17,7 +17,6 @@ export default {
       meta: {
         title: '工时管理',
         sort: 1,
-        icon: 'history',
         alias: 'hoursChildManage',
       },
       children: [
@@ -32,6 +31,7 @@ export default {
             title: '异常审核',
             sort: 1,
             alias: 'exception',
+            icon: 'service-crm',
           },
         },
         {
@@ -45,6 +45,7 @@ export default {
             title: '考勤提交',
             sort: 2,
             alias: 'dingSubmit',
+            icon: 'service-crm',
           },
         },
         {
@@ -58,6 +59,7 @@ export default {
             title: '考勤明细查询',
             sort: 2,
             alias: 'dingDetail',
+            icon: 'service-crm',
           },
         },
         {
@@ -71,6 +73,7 @@ export default {
             title: '工时统计',
             sort: 3,
             alias: 'hourSubmit',
+            icon: 'service-crm',
           },
         },
       ],

+ 34 - 0
src/style/global.less

@@ -91,6 +91,40 @@ body {
     }
   }
 }
+.page-tab {
+  color: var(--td-text-color-primary);
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  font-size: var(--td-font-body-large);
+  cursor: pointer;
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  vertical-align: middle;
+  white-space: nowrap;
+  border-radius: var(--td-radius-default);
+  transition: all 0.2s linear;
+  touch-action: manipulation;
+  text-decoration: none;
+
+  height: var(--td-comp-size-xl);
+  font: var(--td-font-body-large);
+  padding-left: calc(var(--td-comp-paddingLR-xl) - 1px);
+  padding-right: calc(var(--td-comp-paddingLR-xl) - 1px);
+
+  &:not(:first-child) {
+    margin-left: 8px;
+  }
+
+  &.is-active {
+    color: var(--td-brand-color);
+    background-color: #e8f3ff;
+  }
+  &:not(.is-active):hover {
+    background-color: var(--td-gray-color-3);
+  }
+}
 .btn-group {
   & > .t-button {
     &:not(:first-child) {

+ 17 - 15
src/views/project-quality/project-quality-manage/issues-feedback/index.vue

@@ -1,19 +1,21 @@
 <template>
-  <div class="issues-feedback flex flex-col h-full">
+  <div class="flex flex-col h-full">
+    <div class="page-action">
+      <t-button
+        variant="outline"
+        :disabled="!selectedRowKeys.length"
+        @click="handleDestroy"
+      >
+        <template #icon><svg-icon name="delete" color="#262626" /></template>
+        作废
+      </t-button>
+    </div>
     <SearchForm :fields="fields" :params="params">
       <template #service="{ item, params }">
         <select-service-unit v-model="params[item.prop]"></select-service-unit>
       </template>
     </SearchForm>
     <div class="flex-1 page-wrap">
-      <div class="btn-group">
-        <t-button
-          theme="success"
-          :disabled="!selectedRowKeys.length"
-          @click="handleDestroy"
-          >作废</t-button
-        >
-      </div>
       <t-table
         size="small"
         row-key="id"
@@ -207,15 +209,15 @@ const columns = [
   },
   { colKey: 'problemNo', title: '质量问题编号', minWidth: 120 },
   { colKey: 'crmNo', title: '项目单号', minWidth: 120 },
-  { colKey: 'customType', title: '客户类型', cell: 'type', width: 100 },
-  { colKey: 'custom', title: '客户名称' },
+  { colKey: 'customType', title: '客户类型', cell: 'type', width: 120 },
+  { colKey: 'custom', title: '客户名称', width: 140 },
   { colKey: 'sopType', title: '实施产品' },
   { colKey: 'summary', title: '问题简要' },
   { colKey: 'userNames', title: '责任人' },
   { colKey: 'type', title: '问题类型', cell: 'issues-type', width: 120 },
   { colKey: 'reason', title: '问题归因', cell: 'issues-reason', width: 120 },
-  { colKey: 'influenceDegree', title: '影响度', width: 70 },
-  { colKey: 'submitter', title: '提交人' },
+  { colKey: 'influenceDegree', title: '影响度', width: 100 },
+  { colKey: 'submitter', title: '提交人', width: 140 },
   {
     colKey: 'submissionTime',
     title: '提交时间',
@@ -228,9 +230,9 @@ const columns = [
     cell: 'update-time',
     width: 180,
   },
-  { colKey: 'status', title: '流程状态', cell: 'flow-status', width: 100 },
+  { colKey: 'status', title: '流程状态', cell: 'flow-status', width: 120 },
   { colKey: 'setup', title: '当前节点' },
-  { colKey: 'pendApproveUsers', title: '当前负责人' },
+  { colKey: 'pendApproveUsers', title: '当前负责人', width: 120 },
 ];
 
 const { pagination, tableData, fetchData, search, onChange } = useFetchTable(

+ 0 - 208
src/views/service-unit/service-unit-manage/add-range/index.vue

@@ -1,208 +0,0 @@
-<template>
-  <div class="add-range flex flex-col h-full">
-    <SearchForm :fields="fields" :params="params">
-      <template #user="{ item, params }">
-        <select-type-user
-          v-model="params[item.prop]"
-          type="ACCOUNT_MANAGER"
-        ></select-type-user>
-      </template>
-    </SearchForm>
-
-    <div class="flex-1 page-wrap">
-      <div class="btn-group">
-        <t-button
-          theme="success"
-          :disabled="!selectedRowKeys.length"
-          @click="handlerBatchBind"
-          >批量划定</t-button
-        >
-      </div>
-      <t-table
-        size="small"
-        row-key="id"
-        :columns="columns"
-        :data="tableData"
-        bordered
-        :pagination="{
-          defaultCurrent: 1,
-          defaultPageSize: 10,
-          onChange,
-          showJumper: true,
-          showPageSize: false,
-          current: pagination.pageNumber,
-        }"
-        v-loading="tableLoading"
-        :selected-row-keys="selectedRowKeys"
-        @select-change="selectChange"
-      >
-        <template #type="{ col, row }">
-          {{ customerTypeFilter(row[col.colKey]) }}
-        </template>
-        <template #begin-time="{ col, row }">
-          {{ timestampFilter(row[col.colKey]) }}
-        </template>
-        <template #exam-start-time="{ col, row }">
-          {{ timestampFilter(row[col.colKey]) }}
-        </template>
-        <template #exam-end-time="{ col, row }">
-          {{ timestampFilter(row[col.colKey]) }}
-        </template>
-        <template #create-time="{ col, row }">
-          {{ timestampFilter(row[col.colKey]) }}
-        </template>
-      </t-table>
-    </div>
-
-    <!-- MultDelineationDialog -->
-    <mult-delineation-dialog
-      v-model:visible="showMultDelineationDialog"
-      :crm-ids="selectedRowKeys"
-      @success="search"
-    ></mult-delineation-dialog>
-  </div>
-</template>
-
-<script setup name="AddRange">
-import { reactive, ref, computed } from 'vue';
-import { omit } from 'lodash';
-import { MessagePlugin } from 'tdesign-vue-next';
-import { serviceScopeUnbindCrmQueryApi } from '@/api/service-unit';
-import useFetchTable from '@/hooks/useFetchTable';
-import { CUSTOMER_TYPE } from '@/config/constants';
-import { customerTypeFilter, timestampFilter } from '@/utils/filter';
-import MultDelineationDialog from '../../dispatch/dispatch-manage/mult-delineation-dialog.vue';
-import { dictToOptionList } from '@/utils/tool';
-
-let showMultDelineationDialog = ref(false);
-
-const fields = ref([
-  {
-    prop: 'crmUserId',
-    label: '客户经理',
-    type: 'select',
-    labelWidth: 80,
-    colSpan: 5,
-    cell: 'user',
-  },
-  {
-    prop: 'productType',
-    label: '客户类型',
-    type: 'select',
-    labelWidth: 80,
-    colSpan: 5,
-    attrs: {
-      clearable: true,
-    },
-  },
-  {
-    prop: 'customName',
-    label: '客户名称',
-    labelWidth: 80,
-    colSpan: 5,
-    options: dictToOptionList(CUSTOMER_TYPE),
-    attrs: {
-      clearable: true,
-    },
-  },
-  {
-    prop: 'crmNo',
-    label: '项目单号',
-    labelWidth: 80,
-    colSpan: 5,
-    attrs: {
-      clearable: true,
-    },
-  },
-  {
-    type: 'buttons',
-    colSpan: 2,
-    children: [
-      {
-        type: 'button',
-        text: '查询',
-        onClick: () => {
-          search();
-        },
-      },
-    ],
-  },
-  {
-    prop: 'crmTime',
-    label: '派单时间',
-    type: 'daterange',
-    labelWidth: 80,
-    colSpan: 10,
-    attrs: {
-      clearable: true,
-    },
-  },
-]);
-const params = reactive({
-  crmUserId: '',
-  productType: '',
-  customName: '',
-  crmNo: '',
-  crmTime: [],
-});
-const computedParams = computed(() => {
-  let data = omit(params, ['crmTime']);
-  data.startTime = params.crmTime[0];
-  data.endTime = params.crmTime[1];
-  return data;
-});
-
-const selectedRowKeys = ref([]);
-const selectChange = (value) => {
-  selectedRowKeys.value = value;
-};
-const columns = [
-  {
-    colKey: 'row-select',
-    type: 'multiple',
-    width: 50,
-    fixed: 'left',
-  },
-  { colKey: 'crmNo', title: '项目单号', minWidth: 80 },
-  { colKey: 'beginTime', title: '派单时间', width: 180, cell: 'begin-time' },
-  { colKey: 'crmUserName', title: '客户经理', minWidth: 80 },
-  { colKey: 'productType', title: '客户类型', width: 90, cell: 'type' },
-  { colKey: 'customName', title: '客户名称', minWidth: 100 },
-  { colKey: 'productName', title: '项目名称', minWidth: 80 },
-  { colKey: 'productName', title: '实施产品', minWidth: 80 },
-  {
-    colKey: 'examStartTime',
-    title: '考试开始时间',
-    width: 180,
-    cell: 'exam-start-time',
-  },
-  {
-    colKey: 'examEndTime',
-    title: '考试结束时间',
-    width: 180,
-    cell: 'exam-end-time',
-  },
-  { colKey: 'creatorName', title: '提交人', minWidth: 80 },
-  { colKey: 'createTime', title: '提交时间', width: 180, cell: 'create-time' },
-];
-const {
-  loading: tableLoading,
-  pagination,
-  tableData,
-  search,
-  onChange,
-} = useFetchTable(serviceScopeUnbindCrmQueryApi, {
-  fetchDataHandle: () => {
-    selectedRowKeys.value = [];
-  },
-  params: computedParams,
-});
-
-const handlerBatchBind = () => {
-  if (!selectedRowKeys.value.length) {
-    MessagePlugin.error('请选择要划定的记录');
-    return;
-  }
-  showMultDelineationDialog.value = true;
-};
-</script>

+ 2 - 0
src/views/system/config-manage/customer-manage/edit-customer-dialog.vue

@@ -187,6 +187,8 @@ const areaChagne = (val) => {
   formData.area = val[2];
 };
 
+// 获取经纬度 https://apis.map.qq.com/ws/geocoder/v1/?address=%E6%AD%A6%E6%B1%89%E9%94%A6%E7%BB%A3%E9%BE%99%E5%9F%8E&key=ORUBZ-OXNW4-HMGUJ-KMTZJ-46N37-YWFVF
+
 const save = async () => {
   const valid = await formRef.value.validate();
   if (valid !== true) return;

+ 15 - 14
src/views/user/auth-manage/role-manage/index.vue

@@ -1,14 +1,12 @@
 <template>
   <div class="role h-full">
+    <div v-perm="'role_BUTTON_Add'" class="page-action page-header">
+      <t-button theme="primary" @click="handleAdd({})">
+        <template #icon><svg-icon name="add-circle" color="#fff" /></template>
+        新增角色
+      </t-button>
+    </div>
     <div class="flex-1 page-wrap">
-      <div class="btn-group">
-        <t-button
-          v-perm="'role_BUTTON_Add'"
-          theme="success"
-          @click="toAddRole({})"
-          >新增角色</t-button
-        >
-      </div>
       <t-table
         size="small"
         row-key="id"
@@ -31,22 +29,19 @@
 </template>
 
 <script setup name="User" lang="jsx">
-import { reactive, ref } from 'vue';
 import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
 import useFetchTable from '@/hooks/useFetchTable';
 import { getRoleList, deleteRole } from '@/api/user';
 import { useRouter } from 'vue-router';
 const router = useRouter();
-const toAddRole = (params) => {
-  router.push({ name: 'AddRole', query: params });
-};
+
 const columns = [
   { colKey: 'name', title: '角色名称' },
   {
     title: '管理',
     colKey: 'operate',
     fixed: 'right',
-    width: 200,
+    width: 120,
     cell: (h, { row }) => {
       return (
         <div class="table-operations">
@@ -56,7 +51,7 @@ const columns = [
             hover="color"
             onClick={(e) => {
               e.stopPropagation();
-              toAddRole({ id: row.id });
+              handleAdd({ id: row.id });
             }}
           >
             修改
@@ -77,12 +72,18 @@ const columns = [
     },
   },
 ];
+
+const handleAdd = (params) => {
+  router.push({ name: 'AddRole', query: params });
+};
+
 const handleDelete = (row) => {
   const confirmDia = DialogPlugin({
     header: '操作提示',
     body: `确定要删除角色 ${row.name} 吗`,
     confirmBtn: '确定',
     cancelBtn: '取消',
+    theme: 'warning',
     onConfirm: async () => {
       confirmDia.hide();
       const res = await deleteRole({ roleId: row.id }).catch(() => {});

+ 17 - 6
src/views/user/auth-manage/user-manage/add-user-dialog.vue

@@ -7,17 +7,20 @@
     :closeOnOverlayClick="false"
     :callBacks="[run1, run2.bind(null, { pageNumber: 1, pageSize: 1000 })]"
   >
-    <t-form ref="formRef" :data="formData" labelWidth="120px" :rules="rules">
+    <t-form ref="formRef" :data="formData" labelWidth="100px" :rules="rules">
       <t-form-item label="登录名" name="loginName">
         <t-input v-model="formData.loginName"></t-input>
       </t-form-item>
       <t-form-item label="姓名" name="realName">
         <t-input v-model="formData.realName"></t-input>
       </t-form-item>
-      <t-form-item label="性别" name="genderStr">
-        <t-radio-group v-model="formData.genderStr">
-          <t-radio value="男">男</t-radio>
-          <t-radio value="女">女</t-radio>
+      <t-form-item label="性别" name="gender">
+        <t-radio-group v-model="formData.gender">
+          <t-radio
+            v-for="(val, key) in GENDER_TYPE"
+            :value="key"
+            :label="val"
+          ></t-radio>
         </t-radio-group>
       </t-form-item>
       <t-form-item label="手机" name="mobileNumber">
@@ -51,6 +54,8 @@ import useClearDialog from '@/hooks/useClearDialog';
 import { ref, computed } from 'vue';
 import { getOrgStructList, getRoleList, addUser } from '@/api/user';
 import { useRequest } from 'vue-request';
+import { GENDER_TYPE } from '@/config/constants';
+
 const props = defineProps({
   visible: Boolean,
   curRow: Object,
@@ -70,7 +75,7 @@ const { formData, isEdit } = useClearDialog(
   {
     loginName: '',
     realName: '',
-    genderStr: '',
+    gender: '',
     mobileNumber: '',
     orgId: '',
     roleIds: [],
@@ -123,6 +128,12 @@ const rules = {
       message: '请选择机构',
     },
   ],
+  gender: [
+    {
+      required: true,
+      message: '请选择性别',
+    },
+  ],
   roleIds: [
     {
       required: true,

+ 16 - 16
src/views/user/auth-manage/user-manage/index.vue

@@ -1,17 +1,12 @@
 <template>
   <div class="user h-full">
+    <div v-perm="'user_BUTTON_Add'" class="page-action page-header">
+      <t-button theme="primary" @click="handleAdd">
+        <template #icon><svg-icon name="add-circle" color="#fff" /></template>
+        新增用户
+      </t-button>
+    </div>
     <div class="flex-1 page-wrap">
-      <div class="btn-group">
-        <t-button
-          v-perm="'user_BUTTON_Add'"
-          theme="success"
-          @click="
-            curRow = null;
-            showAddUserDialog = true;
-          "
-          >新增用户</t-button
-        >
-      </div>
       <t-table
         size="small"
         row-key="id"
@@ -68,12 +63,12 @@ const toggleStatus = (row) => {
   });
 };
 const columns = [
-  { colKey: 'id', title: '用户ID', width: 180 },
+  { colKey: 'id', title: '用户ID', width: 200 },
   { colKey: 'realName', title: '姓名' },
-  { colKey: 'genderStr', title: '性别', width: 60 },
-  { colKey: 'mobileNumber', title: '手机' },
-  { colKey: 'roles', title: '角色', minWidth: 200 },
-  { colKey: 'enable', title: '状态', width: 80 },
+  { colKey: 'genderStr', title: '性别', width: 80 },
+  { colKey: 'mobileNumber', title: '手机', width: 160 },
+  { colKey: 'roles', title: '角色' },
+  { colKey: 'enable', title: '状态', width: 100 },
   {
     title: '管理',
     colKey: 'operate',
@@ -132,6 +127,11 @@ const {
   search,
 } = useFetchTable(getUserList);
 
+const handleAdd = () => {
+  curRow.value = null;
+  showAddUserDialog.value = true;
+};
+
 const addSuccess = () => {
   showAddUserDialog.value = false;
   MessagePlugin.success('操作成功');

+ 2 - 2
src/views/user/auth-manage/user-manage/update-user-pwd-dialog.vue

@@ -6,7 +6,7 @@
     :width="500"
     :closeOnOverlayClick="false"
   >
-    <t-form ref="formRef" :data="formData" labelWidth="120px" :rules="rules">
+    <t-form ref="formRef" :data="formData" labelWidth="80px" :rules="rules">
       <t-form-item label="新密码" name="newPassword">
         <t-input
           v-model="formData.newPassword"
@@ -53,7 +53,7 @@ const rules = {
 };
 const updateHandler = () => {
   updateUserPassword({
-    newPassword: getBase64(formData.getBase64),
+    newPassword: getBase64(formData.newPassword),
     id: props.curRow.id,
   }).then(() => {
     emit('success');

+ 16 - 13
src/views/user/org-struct-manage/struct-manage/index.vue

@@ -1,17 +1,13 @@
 <template>
   <div class="struct-manage h-full">
+    <div v-perm="'org_BUTTON_Add'" class="page-action page-header">
+      <t-button theme="primary" @click="handleAdd">
+        <template #icon><svg-icon name="add-circle" color="#fff" /></template>
+        新增管理节点
+      </t-button>
+    </div>
+
     <div class="flex-1 page-wrap">
-      <div class="btn-group">
-        <t-button
-          v-perm="'org_BUTTON_Add'"
-          theme="success"
-          @click="
-            curRow = null;
-            showAddNodeDialog = true;
-          "
-          >新增管理节点</t-button
-        >
-      </div>
       <t-table
         size="small"
         row-key="id"
@@ -35,13 +31,14 @@
 </template>
 
 <script setup name="StructManage" lang="jsx">
-import { computed, ref } from 'vue';
+import { ref } from 'vue';
 import { MessagePlugin } from 'tdesign-vue-next';
 import { useRequest } from 'vue-request';
 import { getOrgStructList, toggleOrgNodeStatus } from '@/api/user';
 import AddNodeDialog from './add-node-dialog.vue';
 const showAddNodeDialog = ref(false);
 const curRow = ref(null);
+
 const toggleStatus = (row) => {
   toggleOrgNodeStatus({ id: row.id, enable: !row.enable }).then(() => {
     MessagePlugin.success('操作成功');
@@ -50,11 +47,12 @@ const toggleStatus = (row) => {
 };
 const columns = [
   { colKey: 'name', title: '管理节点' },
-  { colKey: 'enable', title: '状态' },
+  { colKey: 'enable', title: '状态', width: 120 },
   {
     title: '管理',
     colKey: 'operate',
     fixed: 'right',
+    width: 120,
     cell: (h, { row }) => {
       return (
         <div class="table-operations">
@@ -85,6 +83,11 @@ const columns = [
   },
 ];
 
+const handleAdd = () => {
+  curRow.value = null;
+  showAddNodeDialog.value = true;
+};
+
 const {
   data: tableData,
   loading: tableLoading,

+ 44 - 42
src/views/work-hours/work-hours-manage/abnormal-check/done-check.vue

@@ -8,36 +8,38 @@
         <select-supplier v-model="params[item.prop]"> </select-supplier>
       </template>
     </SearchForm>
-    <t-table
-      size="small"
-      row-key="id"
-      :columns="columns"
-      :data="tableData"
-      bordered
-      :pagination="{
-        defaultCurrent: 1,
-        defaultPageSize: 10,
-        onChange,
-        total: pagination.total,
-        current: pagination.pageNumber,
-      }"
-    >
-      <template #backup-time="{ col, row }">
-        {{ timestampFilter(row[col.colKey]) }}
-      </template>
-      <template #apply-time="{ col, row }">
-        {{ timestampFilter(row[col.colKey]) }}
-      </template>
-      <template #approve-time="{ col, row }">
-        {{ timestampFilter(row[col.colKey]) }}
-      </template>
-      <template #custom-type="{ col, row }">
-        {{ customerTypeFilter(row[col.colKey]) }}
-      </template>
-      <template #result="{ col, row }">
-        {{ auditingResultFilter(row[col.colKey]) }}
-      </template>
-    </t-table>
+    <div class="flex-1 page-wrap">
+      <t-table
+        size="small"
+        row-key="id"
+        :columns="columns"
+        :data="tableData"
+        bordered
+        :pagination="{
+          defaultCurrent: 1,
+          defaultPageSize: 10,
+          onChange,
+          total: pagination.total,
+          current: pagination.pageNumber,
+        }"
+      >
+        <template #backup-time="{ col, row }">
+          {{ timestampFilter(row[col.colKey]) }}
+        </template>
+        <template #apply-time="{ col, row }">
+          {{ timestampFilter(row[col.colKey]) }}
+        </template>
+        <template #approve-time="{ col, row }">
+          {{ timestampFilter(row[col.colKey]) }}
+        </template>
+        <template #custom-type="{ col, row }">
+          {{ customerTypeFilter(row[col.colKey]) }}
+        </template>
+        <template #result="{ col, row }">
+          {{ auditingResultFilter(row[col.colKey]) }}
+        </template>
+      </t-table>
+    </div>
   </div>
 </template>
 
@@ -154,27 +156,27 @@ const computedParams = computed(() => {
 });
 
 const columns = [
-  { colKey: 'serviceName', title: '服务单元' },
-  { colKey: 'sopNo', title: 'SOP流水号' },
-  { colKey: 'createRealName', title: '姓名' },
-  { colKey: 'supplierName', title: '供应商' },
-  { colKey: 'customName', title: '客户名称' },
-  { colKey: 'customType', title: '客户类型', cell: 'custom-type', width: 100 },
-  { colKey: 'dingExceptionTypeStr', title: '异常类型' },
-  { colKey: 'exceptionTime', title: '异常日期' },
-  { colKey: 'applyTime', title: '补卡时间', cell: 'backup-time', width: 170 },
+  { colKey: 'serviceName', title: '服务单元', width: 140 },
+  { colKey: 'sopNo', title: 'SOP流水号', width: 200 },
+  { colKey: 'createRealName', title: '姓名', width: 140 },
+  { colKey: 'supplierName', title: '供应商', width: 140 },
+  { colKey: 'customName', title: '客户名称', width: 140 },
+  { colKey: 'customType', title: '客户类型', cell: 'custom-type', width: 120 },
+  { colKey: 'dingExceptionTypeStr', title: '异常类型', width: 120 },
+  { colKey: 'exceptionTime', title: '异常日期', width: 140 },
+  { colKey: 'applyTime', title: '补卡时间', cell: 'backup-time', width: 180 },
   { colKey: 'reason', title: '理由' },
   // TODO:附件展示
   { colKey: 'attachmentPaths', title: '附件/截图' },
-  { colKey: 'createTime', title: '申请时间', cell: 'apply-time', width: 170 },
-  { colKey: 'statusStr', title: '审核状态', width: 100 },
+  { colKey: 'createTime', title: '申请时间', cell: 'apply-time', width: 180 },
+  { colKey: 'statusStr', title: '审核状态', width: 120 },
   {
     colKey: 'dingExceptionApprove',
     title: '审核结果',
     cell: 'result',
     width: 100,
   },
-  { colKey: 'approveUsersName', title: '审核人' },
+  { colKey: 'approveUsersName', title: '审核人', width: 140 },
   {
     colKey: 'approveTime',
     title: '审核时间',

+ 38 - 18
src/views/work-hours/work-hours-manage/abnormal-check/index.vue

@@ -1,27 +1,47 @@
 <template>
   <div class="abnormal-check h-full overflow-auto">
-    <t-tabs v-model="curTab" theme="card">
-      <t-tab-panel value="1">
-        <template #label>待审核</template>
-        <WaitCheck></WaitCheck>
-      </t-tab-panel>
-      <t-tab-panel value="2">
-        <template #label>已审核</template>
-        <DoneCheck></DoneCheck>
-      </t-tab-panel>
-    </t-tabs>
+    <div class="page-action">
+      <div
+        v-for="item in tabs"
+        :key="item.value"
+        :class="['page-tab', { 'is-active': curTab === item.value }]"
+        @click="switchTab(item)"
+        >{{ item.label }}</div
+      >
+    </div>
+
+    <component :is="tabComp"></component>
   </div>
 </template>
 
 <script setup name="AbnormalCheck">
-import { ref } from 'vue';
+import { computed, ref } from 'vue';
 import WaitCheck from './wait-check';
 import DoneCheck from './done-check';
-const curTab = ref('1');
-</script>
 
-<style lang="less" scoped>
-.abnormal-check {
-  padding: 15px;
-}
-</style>
+const tabs = [
+  {
+    label: '待审核',
+    value: 'wait',
+  },
+  {
+    label: '已审核',
+    value: 'done',
+  },
+];
+
+const tabComps = {
+  wait: WaitCheck,
+  done: DoneCheck,
+};
+let curTab = ref('');
+const tabComp = computed(() => {
+  return tabComps[curTab.value];
+});
+
+const switchTab = (tab) => {
+  curTab.value = tab.value;
+};
+
+switchTab(tabs[0]);
+</script>

+ 66 - 65
src/views/work-hours/work-hours-manage/abnormal-check/wait-check.vue

@@ -1,71 +1,73 @@
 <template>
   <div class="wait-check">
-    <SearchForm :fields="fields" :params="params" showAll>
-      <template #service="{ item, params }">
-        <select-service-unit v-model="params[item.prop]"></select-service-unit>
-      </template>
-      <template #supplier="{ item, params }">
-        <select-supplier v-model="params[item.prop]"> </select-supplier>
-      </template>
-    </SearchForm>
-    <div class="btn-group">
+    <div class="page-action">
       <t-button
-        theme="success"
+        theme="primary"
         :disabled="!selectedRowKeys.length"
         @click="handleAudit(selectedRowKeys, true)"
         >批量通过</t-button
       >
       <t-button
-        theme="danger"
+        theme="primary"
         :disabled="!selectedRowKeys.length"
         @click="handleAudit(selectedRowKeys, false)"
         >批量拒绝</t-button
       >
     </div>
-    <t-table
-      size="small"
-      row-key="taskId"
-      :columns="columns"
-      :data="tableData"
-      bordered
-      :pagination="{
-        defaultCurrent: 1,
-        defaultPageSize: 10,
-        onChange,
-        total: pagination.total,
-        current: pagination.pageNumber,
-      }"
-      :selected-row-keys="selectedRowKeys"
-      @select-change="selectChange"
-    >
-      <template #backup-time="{ col, row }">
-        {{ timestampFilter(row[col.colKey]) }}
-      </template>
-      <template #apply-time="{ col, row }">
-        {{ timestampFilter(row[col.colKey]) }}
-      </template>
-      <template #custom-type="{ col, row }">
-        {{ customerTypeFilter(row[col.colKey]) }}
+    <SearchForm :fields="fields" :params="params" showAll>
+      <template #service="{ item, params }">
+        <select-service-unit v-model="params[item.prop]"></select-service-unit>
       </template>
-      <template #operate="{ row }">
-        <div class="table-operations" @click.stop>
-          <t-link
-            theme="primary"
-            hover="color"
-            @click="handleAudit([row.taskId], true)"
-          >
-            通过
-          </t-link>
-          <t-link
-            theme="danger"
-            hover="color"
-            @click="handleAudit([row.taskId], false)"
-          >
-            拒绝
-          </t-link>
-        </div>
+      <template #supplier="{ item, params }">
+        <select-supplier v-model="params[item.prop]"> </select-supplier>
       </template>
-    </t-table>
+    </SearchForm>
+    <div class="flex-1 page-wrap">
+      <t-table
+        size="small"
+        row-key="taskId"
+        :columns="columns"
+        :data="tableData"
+        bordered
+        :pagination="{
+          defaultCurrent: 1,
+          defaultPageSize: 10,
+          onChange,
+          total: pagination.total,
+          current: pagination.pageNumber,
+        }"
+        :selected-row-keys="selectedRowKeys"
+        @select-change="selectChange"
+      >
+        <template #backup-time="{ col, row }">
+          {{ timestampFilter(row[col.colKey]) }}
+        </template>
+        <template #apply-time="{ col, row }">
+          {{ timestampFilter(row[col.colKey]) }}
+        </template>
+        <template #custom-type="{ col, row }">
+          {{ customerTypeFilter(row[col.colKey]) }}
+        </template>
+        <template #operate="{ row }">
+          <div class="table-operations" @click.stop>
+            <t-link
+              theme="primary"
+              hover="color"
+              @click="handleAudit([row.taskId], true)"
+            >
+              通过
+            </t-link>
+            <t-link
+              theme="danger"
+              hover="color"
+              @click="handleAudit([row.taskId], false)"
+            >
+              拒绝
+            </t-link>
+          </div>
+        </template>
+      </t-table>
+    </div>
   </div>
 </template>
 
@@ -179,25 +181,24 @@ const columns = [
     width: 50,
     fixed: 'left',
   },
-  { colKey: 'serviceName', title: '服务单元' },
-  { colKey: 'sopNo', title: 'SOP流水号' },
-  { colKey: 'createRealName', title: '姓名' },
-  { colKey: 'supplierName', title: '供应商' },
-  { colKey: 'customName', title: '客户名称' },
-  { colKey: 'customType', title: '客户类型', cell: 'custom-type', width: 100 },
+  { colKey: 'serviceName', title: '服务单元', width: 140 },
+  { colKey: 'sopNo', title: 'SOP流水号', width: 200 },
+  { colKey: 'createRealName', title: '姓名', width: 140 },
+  { colKey: 'supplierName', title: '供应商', width: 140 },
+  { colKey: 'customName', title: '客户名称', width: 140 },
+  { colKey: 'customType', title: '客户类型', cell: 'custom-type', width: 120 },
   { colKey: 'dingExceptionTypeStr', title: '异常类型' },
-  { colKey: 'exceptionTime', title: '异常日期' },
-  { colKey: 'applyTime', title: '补卡时间', cell: 'backup-time', width: 170 },
+  { colKey: 'exceptionTime', title: '异常日期', width: 140 },
+  { colKey: 'applyTime', title: '补卡时间', cell: 'backup-time', width: 180 },
   { colKey: 'reason', title: '理由' },
   // TODO:附件展示
   { colKey: 'attachmentPaths', title: '附件/截图' },
-  { colKey: 'statusStr', title: '审核状态', width: 100 },
-  { colKey: 'approveUserName', title: '当前审核人' },
-  { colKey: 'createTime', title: '申请时间', cell: 'apply-time', width: 170 },
+  { colKey: 'statusStr', title: '审核状态', width: 120 },
+  { colKey: 'approveUserName', title: '当前审核人', width: 140 },
+  { colKey: 'createTime', title: '申请时间', cell: 'apply-time', width: 180 },
   {
     title: '管理',
     colKey: 'operate',
-    cell: 'operate',
     fixed: 'right',
     width: 120,
   },

+ 9 - 9
src/views/work-hours/work-hours-manage/work-attendance-detail/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="work-attendance flex flex-col h-full">
+  <div class="flex flex-col h-full">
     <SearchForm :fields="fields" :params="params" showAll>
       <template #service="{ item, params }">
         <select-service-unit v-model="params[item.prop]"></select-service-unit>
@@ -10,14 +10,13 @@
     </SearchForm>
 
     <div class="flex-1 page-wrap">
-      <div class="flex justify-between items-center">
-        <t-space>
-          <span>考勤总计:{{ statisticsInfo.total }}</span>
-          <span>异常考勤:{{ statisticsInfo.abnormal }}</span>
-          <span>累计人天:{{ statisticsInfo.allDays }}天</span>
-          <span>累计工时:{{ statisticsInfo.allHours }}小时</span>
-        </t-space>
-      </div>
+      <p class="page-wrap-tips">
+        <ErrorCircleFilledIcon /> 考勤总计:{{
+          statisticsInfo.total
+        }},异常考勤:{{ statisticsInfo.abnormal }},累计人天:{{
+          statisticsInfo.allDays
+        }}天,累计工时:{{ statisticsInfo.allHours }}小时
+      </p>
 
       <t-table
         size="small"
@@ -52,6 +51,7 @@
 <script setup name="WorkAttendanceDetail">
 import { reactive, ref } from 'vue';
 import { omit } from 'lodash';
+import { ErrorCircleFilledIcon } from 'tdesign-icons-vue-next';
 
 import useFetchTable from '@/hooks/useFetchTable';
 import {

+ 56 - 51
src/views/work-hours/work-hours-manage/work-attendance/index.vue

@@ -1,5 +1,19 @@
 <template>
-  <div class="work-attendance flex flex-col h-full">
+  <div class="flex flex-col h-full">
+    <div class="page-action">
+      <t-button
+        theme="primary"
+        :disabled="!selectedRowKeys.length"
+        @click="multSubmit"
+        >批量提交</t-button
+      >
+      <t-button
+        theme="primary"
+        :disabled="!selectedRowKeys.length"
+        @click="multExport"
+        >批量导出</t-button
+      >
+    </div>
     <SearchForm :fields="fields" :params="params">
       <template #service="{ item, params }">
         <select-service-unit v-model="params[item.prop]"></select-service-unit>
@@ -13,29 +27,15 @@
     </SearchForm>
 
     <div class="flex-1 page-wrap">
-      <div class="flex justify-between items-center">
-        <t-space>
-          <span>考勤总计:{{ statisticsInfo.total }}</span>
-          <span>已提交:{{ statisticsInfo.submitted }}</span>
-          <span>待提交:{{ statisticsInfo.unSubmitted }}</span>
-          <span>累计人天:{{ statisticsInfo.allDays }}天</span>
-          <span>累计工时:{{ statisticsInfo.allHours }}小时</span>
-        </t-space>
-        <div class="btn-group">
-          <t-button
-            theme="success"
-            :disabled="!selectedRowKeys.length"
-            @click="multSubmit"
-            >批量提交</t-button
-          >
-          <t-button
-            theme="success"
-            :disabled="!selectedRowKeys.length"
-            @click="multExport"
-            >批量导出</t-button
-          >
-        </div>
-      </div>
+      <p class="page-wrap-tips">
+        <ErrorCircleFilledIcon /> 考勤总计:{{
+          statisticsInfo.total
+        }},已提交:{{ statisticsInfo.submitted }},待提交:{{
+          statisticsInfo.unSubmitted
+        }},累计人天:{{ statisticsInfo.allDays }}天,累计工时:{{
+          statisticsInfo.allHours
+        }}小时
+      </p>
 
       <t-table
         size="small"
@@ -92,9 +92,10 @@
   </div>
 </template>
 
-<script setup lang="jsx" name="WorkAttendance">
+<script setup name="WorkAttendance">
 import { reactive, ref } from 'vue';
 import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
+import { ErrorCircleFilledIcon } from 'tdesign-icons-vue-next';
 import useFetchTable from '@/hooks/useFetchTable';
 import {
   workAttendanceListApi,
@@ -168,7 +169,7 @@ const fields = ref([
     prop: 'supplierId',
     label: '所属供应商',
     type: 'select',
-    labelWidth: 120,
+    labelWidth: 100,
     colSpan: 5,
     cell: 'supplier',
   },
@@ -201,7 +202,7 @@ const fields = ref([
       decimalPlaces: 0,
       max: 1000000,
       min: 0,
-      style: 'width: 120px',
+      style: 'width: 100%',
     },
   },
   {
@@ -215,7 +216,7 @@ const fields = ref([
       decimalPlaces: 0,
       max: 1000000,
       min: 0,
-      style: 'width: 120px',
+      style: 'width: 100%',
     },
   },
   {
@@ -229,7 +230,7 @@ const fields = ref([
       decimalPlaces: 0,
       max: 1000000,
       min: 0,
-      style: 'width: 120px',
+      style: 'width: 100%',
     },
   },
   {
@@ -243,7 +244,7 @@ const fields = ref([
       decimalPlaces: 0,
       max: 1000000,
       min: 0,
-      style: 'width: 120px',
+      style: 'width: 100%',
     },
   },
 ]);
@@ -268,27 +269,27 @@ const columns = [
     width: 50,
     fixed: 'left',
   },
-  { colKey: 'serviceUnitName', title: '服务单元' },
-  { colKey: 'sopNo', title: 'SOP流水号' },
-  { colKey: 'customName', title: '客户名称' },
-  { colKey: 'province', title: '省份', minWidth: 60 },
-  { colKey: 'city', title: '城市', minWidth: 60 },
-  { colKey: 'enterTime', title: '进场时间', cell: 'enter-time', width: 170 },
-  { colKey: 'outerTime', title: '撤场时间', cell: 'outer-time', width: 170 },
-  { colKey: 'userName', title: '姓名(人员档案号)', cell: 'user', width: 150 },
+  { colKey: 'serviceUnitName', title: '服务单元', width: 160 },
+  { colKey: 'sopNo', title: 'SOP流水号', width: 200 },
+  { colKey: 'customName', title: '客户名称', width: 120 },
+  { colKey: 'province', title: '省份', width: 120 },
+  { colKey: 'city', title: '城市', width: 120 },
+  { colKey: 'enterTime', title: '进场时间', cell: 'enter-time', width: 180 },
+  { colKey: 'outerTime', title: '撤场时间', cell: 'outer-time', width: 180 },
+  { colKey: 'userName', title: '姓名(人员档案号)', cell: 'user', width: 170 },
   { colKey: 'roleName', title: '项目角色' },
   { colKey: 'supplier', title: '供应商' },
-  { colKey: 'attendance', title: '实际出勤(天)', width: 120 },
-  { colKey: 'weekdays', title: '工作日(天)', width: 110 },
-  { colKey: 'weekends', title: '周末(天)', width: 100 },
-  { colKey: 'holidays', title: '法定节假日(天)', width: 140 },
-  { colKey: 'workHours', title: '累计工时(天)', width: 120 },
-  { colKey: 'violationDays', title: '违规工时(天)', width: 120 },
-  { colKey: 'q', title: '考勤异常数(天)', width: 140 },
-  { colKey: 'r', title: '剩余补卡次数', width: 110 },
-  { colKey: 's', title: '待处理异常数', width: 110 },
-  { colKey: 'status', title: '提交状态', cell: 'status', width: 100 },
-  { colKey: 'submitter', title: '提交人' },
+  { colKey: 'attendance', title: '实际出勤(天)', width: 140 },
+  { colKey: 'weekdays', title: '工作日(天)', width: 130 },
+  { colKey: 'weekends', title: '周末(天)', width: 120 },
+  { colKey: 'holidays', title: '法定节假日(天)', width: 160 },
+  { colKey: 'workHours', title: '累计工时(天)', width: 140 },
+  { colKey: 'violationDays', title: '违规工时(天)', width: 140 },
+  { colKey: 'q', title: '考勤异常数(天)', width: 150 },
+  { colKey: 'r', title: '剩余补卡次数', width: 120 },
+  { colKey: 's', title: '待处理异常数', width: 120 },
+  { colKey: 'status', title: '提交状态', cell: 'status', width: 120 },
+  { colKey: 'submitter', title: '提交人', width: 120 },
   {
     colKey: 'submissionTime',
     title: '提交时间',
@@ -298,9 +299,8 @@ const columns = [
   {
     title: '管理',
     colKey: 'operate',
-    cell: 'operate',
     fixed: 'right',
-    width: 120,
+    width: 160,
   },
 ];
 const { pagination, tableData, fetchData, search, onChange } = useFetchTable(
@@ -328,6 +328,7 @@ const multSubmit = () => {
     body: `确定要提交选择的所有记录吗?`,
     confirmBtn: '确定',
     cancelBtn: '取消',
+    theme: 'success',
     onConfirm: async () => {
       confirmDia.hide();
       const res = await workAttendanceSubmitApi(selectedRowKeys.value).catch(
@@ -349,6 +350,7 @@ const multExport = () => {
     body: `确定要导出选择的所有记录吗?`,
     confirmBtn: '确定',
     cancelBtn: '取消',
+    theme: 'info',
     onConfirm: async () => {
       confirmDia.hide();
       const res = await workAttendanceExportApi(selectedRowKeys.value).catch(
@@ -366,6 +368,7 @@ const handleSubmit = (row) => {
     body: `该工时数据提交后就可以进行工时统计结算,且该工时数据无法进行任何修改操作,您要继续提交吗?`,
     confirmBtn: '确定',
     cancelBtn: '取消',
+    theme: 'success',
     onConfirm: async () => {
       confirmDia.hide();
       const res = await workAttendanceSubmitApi([row.id]).catch(() => {});
@@ -381,6 +384,7 @@ const handleWithdraw = (row) => {
     body: `您确定要撤回这条已提交的工时数据吗?您操作撤回后,还需要工时管理人员同意撤回,这条工时数据才能被真正撤回。`,
     confirmBtn: '确定',
     cancelBtn: '取消',
+    theme: 'warning',
     onConfirm: async () => {
       confirmDia.hide();
       const res = await workAttendanceWithdrawApi(row.id).catch(() => {});
@@ -396,6 +400,7 @@ const handleCancelWithdraw = (row) => {
     body: `确定要取消撤回当前记录吗?`,
     confirmBtn: '确定',
     cancelBtn: '取消',
+    theme: 'warning',
     onConfirm: async () => {
       confirmDia.hide();
       const res = await workAttendanceCancelWithdrawApi(row.id).catch(() => {});

+ 30 - 31
src/views/work-hours/work-hours-manage/work-statistics/index.vue

@@ -1,5 +1,8 @@
 <template>
   <div class="work-statistics flex flex-col h-full">
+    <div class="page-action">
+      <t-button theme="primary" @click="handleExport">导出统计结果</t-button>
+    </div>
     <SearchForm :fields="fields" :params="params">
       <template #service="{ item, params }">
         <select-service-unit v-model="params[item.prop]"></select-service-unit>
@@ -12,20 +15,16 @@
       </template>
     </SearchForm>
     <div class="flex-1 page-wrap">
-      <div class="flex justify-between items-center">
-        <t-space>
-          <span>考勤总计:{{ statisticsInfo.total }}</span>
-          <span>已提交:{{ statisticsInfo.submitted }}</span>
-          <span>待提交:{{ statisticsInfo.unSubmitted }}</span>
-          <span>已提交累计人天:{{ statisticsInfo.allDays }}天</span>
-          <span>已提交累计工时:{{ statisticsInfo.allHours }}小时</span>
-        </t-space>
-        <div class="btn-group">
-          <t-button theme="success" @click="handleExport"
-            >导出统计结果</t-button
-          >
-        </div>
-      </div>
+      <p class="page-wrap-tips">
+        <ErrorCircleFilledIcon /> 考勤总计:{{
+          statisticsInfo.total
+        }},已提交:{{ statisticsInfo.submitted }},待提交:{{
+          statisticsInfo.unSubmitted
+        }},已提交累计人天:{{ statisticsInfo.allDays }}天,已提交累计工时:{{
+          statisticsInfo.allHours
+        }}小时
+      </p>
+
       <t-table
         size="small"
         row-key="id"
@@ -74,9 +73,10 @@
   </div>
 </template>
 
-<script setup lang="jsx" name="WorkStatistics">
+<script setup name="WorkStatistics">
 import { ref, reactive, onMounted } from 'vue';
 import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
+import { ErrorCircleFilledIcon } from 'tdesign-icons-vue-next';
 import useFetchTable from '@/hooks/useFetchTable';
 import {
   workStatisticsListApi,
@@ -176,7 +176,7 @@ const fields = ref([
       decimalPlaces: 0,
       max: 1000000,
       min: 0,
-      style: 'width: 120px',
+      style: 'width: 100%',
     },
   },
 ]);
@@ -192,11 +192,11 @@ const params = reactive({
 });
 
 const columns = [
-  { colKey: 'service', title: '服务单元' },
-  { colKey: 'sopNo', title: 'SOP流水号' },
-  { colKey: 'custom', title: '客户名称' },
-  { colKey: 'province', title: '省份' },
-  { colKey: 'city', title: '城市' },
+  { colKey: 'service', title: '服务单元', width: 160 },
+  { colKey: 'sopNo', title: 'SOP流水号', width: 200 },
+  { colKey: 'custom', title: '客户名称', width: 120 },
+  { colKey: 'province', title: '省份', width: 120 },
+  { colKey: 'city', title: '城市', width: 120 },
   {
     colKey: 'examStartTime',
     title: '项目开始时间',
@@ -209,16 +209,16 @@ const columns = [
     width: 180,
     cell: 'end-time',
   },
-  { colKey: 'userName', title: '姓名(人员档案号)', cell: 'user', width: 150 },
-  { colKey: 'roleName', title: '项目角色' },
+  { colKey: 'userName', title: '姓名(人员档案号)', cell: 'user', width: 170 },
+  { colKey: 'roleName', title: '项目角色', width: 120 },
   { colKey: 'supplier', title: '供应商' },
-  { colKey: 'attendance', title: '实际出勤(天)', width: 120 },
-  { colKey: 'weekdays', title: '工作日(天)', width: 110 },
-  { colKey: 'weekends', title: '周末(天)', width: 100 },
-  { colKey: 'holidays', title: '法定节假日(天)', width: 140 },
-  { colKey: 'workHours', title: '累计工时(天)', width: 120 },
-  { colKey: 'violationDays', title: '违规工时(天)', width: 120 },
-  { colKey: 'submitter', title: '提交人' },
+  { colKey: 'attendance', title: '实际出勤(天)', width: 140 },
+  { colKey: 'weekdays', title: '工作日(天)', width: 130 },
+  { colKey: 'weekends', title: '周末(天)', width: 120 },
+  { colKey: 'holidays', title: '法定节假日(天)', width: 160 },
+  { colKey: 'workHours', title: '累计工时(天)', width: 140 },
+  { colKey: 'violationDays', title: '违规工时(天)', width: 140 },
+  { colKey: 'submitter', title: '提交人', width: 120 },
   {
     colKey: 'submissionTime',
     title: '提交时间',
@@ -229,7 +229,6 @@ const columns = [
   {
     title: '管理',
     colKey: 'operate',
-    cell: 'operate',
     fixed: 'right',
     width: 100,
   },