zhonghuizhen 9 месяцев назад
Родитель
Сommit
8a0982cde4

+ 25 - 2
src/api/business/attendance.js

@@ -1,6 +1,5 @@
-import request from '@/utils/request'
 import { BUSINESS_BASE_URL } from '@/api/baseUrl'
-import { save } from '@/api/platform/message/innerMessage'
+import request from '@/utils/request'
 
 /**
  * 考勤明细-打卡
@@ -109,3 +108,27 @@ export function getAttendanceReissue(params) {
     params
   })
 }
+
+/**
+ * 考勤概况-查询
+ * @param {*} params
+ */
+export function queryAttendanceData (data) {
+  return request({
+      url: BUSINESS_BASE_URL() + '/sql/attendance/queryData',
+      method: 'post',
+      data
+  })
+}
+
+/**
+ * 考勤统计-查询
+ * @param {*} params
+ */
+export function queryAttendanceStatData (data) {
+  return request({
+      url: BUSINESS_BASE_URL() + '/sql/attendance2/queryData',
+      method: 'post',
+      data
+  })
+}

+ 5 - 4
src/views/business/attendance/attendanceDetails.vue

@@ -205,11 +205,11 @@
 </template>
 
 <script>
-import ActionUtils from '@/utils/action'
+import { queryAttendanceDetail } from '@/api/business/attendance'
+import ibpsUserSelector from '@/business/platform/org/selector'
 import FixHeight from '@/mixins/height'
 import IbpsExport from '@/plugins/export'
-import ibpsUserSelector from '@/business/platform/org/selector'
-import { queryAttendanceDetail } from '@/api/business/attendance'
+import ActionUtils from '@/utils/action'
 
 export default {
   components: {
@@ -329,7 +329,7 @@ export default {
       this.loading = true
       queryAttendanceDetail(this.getSearchFormData())
         .then((res) => {
-          this.listData = res.variables.data
+          this.listData = res.data.dataResult
           if (this.listData.length > 0) {
             // 做部门和姓名处理
             this.listData.forEach((item) => {
@@ -341,6 +341,7 @@ export default {
               }
             })
           }
+
         })
         .finally(() => {
           this.loading = false

+ 294 - 464
src/views/business/attendance/attendanceOverview.vue

@@ -1,484 +1,314 @@
 <template>
   <div class="main-container">
-    <ibps-crud
-      ref="crud"
-      :display-field="title"
-      :height="height"
-      :data="listData"
-      :toolbars="listConfig.toolbars"
-      :search-form="listConfig.searchForm"
-      :pk-key="pkKey"
-      :columns="listConfig.columns"
-      :row-handle="listConfig.rowHandle"
-      :pagination="pagination"
-      :loading="loading"
-      :index-row="false"
-      @action-event="handleAction"
-      @sort-change="handleSortChange"
-      @pagination-change="handlePaginationChange"
-    >
-      <template slot="time">
-        <el-date-picker
-          v-model="daterRange"
-          size="mini"
-          type="daterange"
-          :picker-options="pickerOptions"
-          range-separator="至"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
-          align="right"
-          value-format="yyyy-MM-dd"
-        />
-      </template>
-      <template slot="userSlot">
-        <ibps-user-selector
-          v-model="searchXinMing"
-          type="user"
-          readonly-text="text"
-          :multiple="true"
-          size="mini"
-          :filter="filter"
-          filtrate
-        />
-      </template>
-      <!-- 自定义多级表头 -->
-      <template #prepend-column>
-        <el-table-column key="ri_qi_" prop="ri_qi_" label="日期" width="110" />
-        <el-table-column
-          key="user_name_"
-          prop="user_name_"
-          label="姓名"
-          width="120"
-        >
-          <template #default="{ row }">
-            <el-tag style="margin: 2px">
-              {{ row.user_name_ }}
-            </el-tag>
+      <ibps-crud
+          ref="crud"
+          :display-field="title"
+          :height="height"
+          :data="listData"
+          :toolbars="listConfig.toolbars"
+          :search-form="listConfig.searchForm"
+          :pk-key="pkKey"
+          :columns="listConfig.columns"
+          :row-handle="listConfig.rowHandle"
+          :pagination="pagination"
+          :loading="loading"
+          :index-row="false"
+          @action-event="handleAction"
+          @sort-change="handleSortChange"
+          @pagination-change="handlePaginationChange"
+      >
+          <template slot="time">
+              <el-date-picker
+                  v-model="daterRange"
+                  size="mini"
+                  type="daterange"
+                  :picker-options="pickerOptions"
+                  range-separator="至"
+                  start-placeholder="开始日期"
+                  end-placeholder="结束日期"
+                  align="right"
+                  value-format="yyyy-MM-dd"
+              />
           </template>
-        </el-table-column>
-        <!-- 基本信息分组 -->
-        <el-table-column label="基本信息">
-          <!--<el-table-column prop="yong_hu_id_" title="姓名" key="yong_hu_id_" width="80" />-->
-          <el-table-column
-            key="pos_name_"
-            prop="pos_name_"
-            label="部门"
-            width="140"
-          >
-            <template #default="{ row }">
-              <el-tag style="margin: 2px">
-                {{ row.pos_name_ }}
-              </el-tag>
-            </template>
-          </el-table-column>
-          <el-table-column
-            key="gong_hao_"
-            prop="gong_hao_"
-            label="工号"
-            width="110"
-          />
-        </el-table-column>
-        <!-- 上班分组 -->
-        <el-table-column label="考勤概况">
-          <el-table-column
-            key="zui_zao"
-            prop="zui_zao"
-            label="最早"
-            min-width="160"
-          />
-          <el-table-column
-            key="zui_wan"
-            prop="zui_wan"
-            label="最晚"
-            min-width="160"
-          />
-          <el-table-column
-            key="da_ka_ci_shu_"
-            prop="da_ka_ci_shu_"
-            label="打卡次数"
-            min-width="100"
-          />
-          <el-table-column
-            key="total_ban_ci_shi_chang"
-            prop="total_ban_ci_shi_chang"
-            label="标准工作时长(小时)"
-            min-width="160"
-          />
-          <el-table-column
-            key="total_gong_zuo_shi_chan"
-            prop="total_gong_zuo_shi_chan"
-            label="实际工作时长(小时)"
-            min-width="160"
-          />
-          <el-table-column
-            key="kao_qin_zhuang_tai"
-            prop="kao_qin_zhuang_tai"
-            label="考勤结果"
-            min-width="100"
-          >
-            <template #default="{ row }">
-              <span
-                :style="{
-                  color: row.kao_qin_zhuang_tai == '正常' ? 'inherit' : 'red'
-                }"
-              >
-                {{ row.kao_qin_zhuang_tai }}
-              </span>
-            </template>
-          </el-table-column>
-        </el-table-column>
-      </template>
-    </ibps-crud>
+          <template slot="userSlot">
+              <ibps-user-selector
+                  v-model="searchXinMing"
+                  type="user"
+                  readonly-text="text"
+                  :multiple="true"
+                  size="mini"
+                  :filter="filter"
+                  filtrate
+              />
+          </template>
+          <!-- 自定义多级表头 -->
+          <template #prepend-column>
+              <el-table-column key="ri_qi_" prop="ri_qi_" label="日期" width="110" />
+              <el-table-column key="user_name_" prop="user_name_" label="姓名" width="120">
+                  <template #default="{ row }">
+                      <el-tag style="margin: 2px;">
+                          {{ row.user_name_ }}
+                      </el-tag>
+                  </template>
+              </el-table-column>
+              <!-- 基本信息分组 -->
+              <el-table-column label="基本信息">
+                  <!--<el-table-column prop="yong_hu_id_" title="姓名" key="yong_hu_id_" width="80" />-->
+                  <el-table-column key="pos_name_" prop="pos_name_" label="部门" width="140">
+                      <template #default="{ row }">
+                          <el-tag style="margin: 2px;">
+                              {{ row.pos_name_ }}
+                          </el-tag>
+                      </template>
+                  </el-table-column>
+                  <el-table-column key="gong_hao_" prop="gong_hao_" label="工号" width="110" />
+              </el-table-column>
+              <!-- 上班分组 -->
+              <el-table-column label="考勤概况">
+                  <el-table-column key="zui_zao" prop="zui_zao" label="最早" min-width="160" />
+                  <el-table-column key="zui_wan" prop="zui_wan" label="最晚" min-width="160" />
+                  <el-table-column key="da_ka_ci_shu_" prop="da_ka_ci_shu_" label="打卡次数" min-width="100" />
+                  <el-table-column key="total_ban_ci_shi_chang" prop="total_ban_ci_shi_chang" label="标准工作时长(小时)" min-width="160" />
+                  <el-table-column key="total_gong_zuo_shi_chan" prop="total_gong_zuo_shi_chan" label="实际工作时长(小时)" min-width="160" />
+                  <el-table-column key="kao_qin_zhuang_tai" prop="kao_qin_zhuang_tai" label="考勤结果" min-width="100">
+                      <template #default="{ row }">
+                          <span :style="{ color: row.kao_qin_zhuang_tai=='正常' ? 'inherit' : 'red' }">
+                              {{ row.kao_qin_zhuang_tai }}
+                          </span>
+                      </template>
+                  </el-table-column>
+              </el-table-column>
+          </template>
+      </ibps-crud>
   </div>
 </template>
 
 <script>
-import ActionUtils from '@/utils/action'
+import { queryAttendanceData } from '@/api/business/attendance'
+import ibpsUserSelector from '@/business/platform/org/selector'
 import FixHeight from '@/mixins/height'
 import IbpsExport from '@/plugins/export'
-import ibpsUserSelector from '@/business/platform/org/selector'
-import color from '@/store/modules/ibps/modules/color'
+import ActionUtils from '@/utils/action'
 
 export default {
   components: {
-    ibpsUserSelector
+      ibpsUserSelector
   },
   mixins: [FixHeight],
-  data() {
-    const { userList = [], deptList = [] } = this.$store.getters || {}
-    const userOption = userList.map((item) => ({
-      label: item.userName,
-      value: item.userId
-    }))
-    const deptOption = deptList.map((item) => ({
-      label: item.positionName,
-      value: item.positionId
-    }))
-    return {
-      userOption,
-      deptOption,
-      title: '考勤概况统计',
-      pkKey: 'id_', // 主键对应数据库字段
-      loading: true,
-      height: document.clientHeight,
-      listData: [],
-      pagination: {
-        totalCount: 0,
-        page: 1,
-        limit: 15
-      },
-      sorts: {},
-      filter: [
-        {
-          descVal: '1',
-          includeSub: true,
-          old: 'position',
-          partyId: this.$store.getters.userInfo.employee.positions,
-          partyName: '',
-          scriptContent: '',
-          type: 'user',
-          userType: 'position'
-        }
-      ],
-      daterRange: [],
-      searchXinMing: '',
-      pickerOptions: {
-        disabledDate(time) {
-          const today = new Date()
-          today.setHours(0, 0, 0, 0)
-          // 禁用今天及未来的日期
-          return time.getTime() >= today.getTime()
-        }
-      },
-      listConfig: {
-        toolbars: [
-          {
-            key: 'search',
-            icon: 'ibps-icon-search',
-            label: '查询',
-            type: 'primary'
+  data () {
+      const { userList = [], deptList = [] } = this.$store.getters || {}
+      const userOption = userList.map(item => ({ label: item.userName, value: item.userId }))
+      const deptOption = deptList.map(item => ({ label: item.positionName, value: item.positionId }))
+      return {
+          userOption,
+          deptOption,
+          title: '考勤概况统计',
+          pkKey: 'id_', // 主键对应数据库字段
+          loading: true,
+          height: document.clientHeight,
+          listData: [],
+          pagination: {
+              totalCount: 0,
+              page: 1,
+              limit: 15
           },
-          {
-            key: 'export',
-            icon: 'ibps-icon-download',
-            label: '导出',
-            type: 'primary'
+          sorts: {},
+          filter: [{
+              descVal: '1',
+              includeSub: true,
+              old: 'position',
+              partyId: this.$store.getters.userInfo.employee.positions,
+              partyName: '',
+              scriptContent: '',
+              type: 'user',
+              userType: 'position'
+          }],
+          daterRange: [],
+          searchXinMing: '',
+          pickerOptions: {
+              disabledDate (time) {
+                  const today = new Date()
+                  today.setHours(0, 0, 0, 0)
+                  // 禁用今天及未来的日期
+                  return time.getTime() >= today.getTime()
+              }
+          },
+          listConfig: {
+              toolbars: [
+                  { key: 'search', icon: 'ibps-icon-search', label: '查询', type: 'primary' },
+                  { key: 'export', icon: 'ibps-icon-download', label: '导出', type: 'primary' }
+              ],
+              searchForm: {
+                  labelWidth: 100,
+                  forms: [
+                      { prop: '', label: '日期范围', fieldType: 'slot', slotName: 'time' },
+                      // { prop: 'Q^kao_qin_zhuang_ta^SL', label: '考勤状态', fieldType: 'select', options: [{ value: '正常', label: '正常' }, { value: '异常', label: '异常' }] },
+                      { prop: '', label: '姓名', fieldType: 'slot', slotName: 'userSlot' },
+                      { prop: 'Q^bu_men_^SL', label: '部门', fieldType: 'select', options: deptOption }
+                  ]
+              },
+              columns: []
           }
-        ],
-        searchForm: {
-          labelWidth: 100,
-          forms: [
-            {
-              prop: '',
-              label: '日期范围',
-              fieldType: 'slot',
-              slotName: 'time'
-            },
-            // { prop: 'Q^kao_qin_zhuang_ta^SL', label: '考勤状态', fieldType: 'select', options: [{ value: '正常', label: '正常' }, { value: '异常', label: '异常' }] },
-            {
-              prop: '',
-              label: '姓名',
-              fieldType: 'slot',
-              slotName: 'userSlot'
-            },
-            {
-              prop: 'Q^bu_men_^SL',
-              label: '部门',
-              fieldType: 'select',
-              options: deptOption
-            }
-          ]
-        },
-        columns: []
       }
-    }
   },
-  computed: {},
-  created() {
-    const daterRange = this.getTodayDate()
-    this.daterRange = [daterRange.sDay, daterRange.eDay]
-    this.loadData()
+  computed: {
+  },
+  created () {
+      const daterRange = this.getTodayDate()
+      this.daterRange = [daterRange.sDay, daterRange.eDay]
+      this.loadData()
   },
   methods: {
-    // 加载数据
-    loadData() {
-      this.loading = true
-      const sql = this.getSearchSql()
-      this.$common
-        .request('sql', sql)
-        .then((res) => {
-          this.listData = res.variables.data
-          // 做部门和姓名处理
-          this.listData.forEach((item) => {
-            item.userName = this.getUserLabel(item.yong_hu_id_)
-            item.deptName = this.getDeptLabel(item.bu_men_)
-          })
-          this.pagination.totalCount = this.listData[0]?.total_count
-        })
-        .finally(() => {
-          this.loading = false
-        })
-    },
-    getUserLabel(userId) {
-      const user = this.userOption.find((item) => item.value === userId)
-      return user ? user.label : ''
-    },
-    getDeptLabel(positionId) {
-      const dept = this.deptOption.find((item) => item.value === positionId)
-      return dept ? dept.label : ''
-    },
-    /**
-     * 获取格式化参数
-     */
-    getSearchFormData() {
-      const { first, second } = this.$store.getters.level || {}
-      const searchParam = this.$refs['crud']
-        ? this.$refs['crud'].getSearcFormData()
-        : {}
-      searchParam['Q^di_dian_^S'] = second || first
-      searchParam['Q^ri_qi_^DL'] = this.daterRange[0]
-      searchParam['Q^ri_qi_^DG'] = this.daterRange[1]
-      return ActionUtils.formatParams(searchParam, this.pagination, this.sorts)
-    },
-    getSearchSql() {
-      let sql = ``
-      const params = this.getSearchFormData()
-      // 定义操作符映射
-      const operatorMap = {
-        S: '=',
-        SL: 'LIKE',
-        DG: '<=',
-        DL: '>='
-      }
-      // 如果有查询条件,构建 WHERE 子句
-      if (params.parameters && params.parameters.length > 0) {
-        const conditions = []
-        params.parameters.forEach((item) => {
-          const { key, value } = item
-          const parts = key.split('^') // 格式: Q^field^operator
-          if (parts.length === 3 && parts[0] === 'Q') {
-            const field = parts[1] // 字段名
-            const operatorKey = parts[2] // 操作符(S/SL/DG/DL)
-            const operator = operatorMap[operatorKey]
-            if (operator) {
-              let condition
-              if (operator === 'LIKE') {
-                condition = `${field} LIKE '%${value}%'` // LIKE 模糊查询
-              } else {
-                condition = `${field} ${operator} '${value}'` // 其他操作符(=, <=, >=)
+      // 加载数据
+      loadData () {
+          this.loading = true
+          queryAttendanceData(this.getSearchFormData()).then(res => {
+              this.listData = res.data.dataResult
+              if (this.listData.length > 0) {
+                  // 做部门和姓名处理
+                  this.listData.forEach(item => {
+                      item.userName = this.getUserLabel(item.yong_hu_id_)
+                      item.deptName = this.getDeptLabel(item.bu_men_)
+                  })
               }
-              conditions.push(condition)
-            }
-          }
-        })
-
-        if (conditions.length > 0) {
-          let wherestr = ' WHERE ' + conditions.join(' AND ')
+              this.pagination.totalCount = res.data.pageResult?.totalCount
+          }).finally(() => {
+              this.loading = false
+          })
+      },
+      getUserLabel (userId) {
+          const user = this.userOption.find(item => item.value === userId)
+          return user ? user.label : ''
+      },
+      getDeptLabel (positionId) {
+          const dept = this.deptOption.find(item => item.value === positionId)
+          return dept ? dept.label : ''
+      },
+      /**
+       * 获取格式化参数
+      */
+      getSearchFormData () {
+          const { first, second } = this.$store.getters.level || {}
+          const searchParam = this.$refs['crud'] ? this.$refs['crud'].getSearcFormData() : {}
+          let searchUser = []
           if (this.searchXinMing) {
-            wherestr +=
-              `and yong_hu_id_ in ('` +
-              this.searchXinMing.split(',').join("','") +
-              `')`
+              searchUser = this.searchXinMing.split(',')
           }
-          sql = `select 
-                            t.*,
-                            (select COUNT(DISTINCT USER_ID_) 
-                            FROM v_attendance_statistics
-                            ${wherestr}
-                            ) AS total_count
-                        FROM (
-                            select 
-                                USER_ID_,
-                                ri_qi_,
-                                user_name_,
-                                pos_name_,
-                                gong_hao_,
-                                MIN(da_ka_shi_jian_1_) AS zui_zao,
-                                MAX(da_ka_shi_jian_2_) AS zui_wan,
-                                SUM(da_ka_ci_shu_) AS da_ka_ci_shu_,
-                                ROUND(SUM(ban_ci_shi_chang_) / 60.0,2) AS total_ban_ci_shi_chang,
-                                ROUND(SUM(gong_zuo_shi_chan) / 60.0,2) AS total_gong_zuo_shi_chan,
-                                SUM(CASE WHEN zhuang_tai_1_ = '异常' THEN 1 ELSE 0 END) + 
-                                SUM(CASE WHEN zhuang_tai_2_ = '异常' THEN 1 ELSE 0 END) AS chi_dao_ci_shu,
-                                SUM(CASE WHEN zhuang_tai_1_ = '' OR zhuang_tai_1_ IS NULL THEN 1 ELSE 0 END) + 
-                                SUM(CASE WHEN zhuang_tai_2_ = '' OR zhuang_tai_2_ IS NULL THEN 1 ELSE 0 END) AS que_qin_ci_shu,
-                                CASE 
-                                    WHEN SUM(CASE WHEN zhuang_tai_1_ = '异常' THEN 1 ELSE 0 END) + 
-                                        SUM(CASE WHEN zhuang_tai_2_ = '异常' THEN 1 ELSE 0 END) > 0 
-                                        AND SUM(CASE WHEN zhuang_tai_1_ = '' OR zhuang_tai_1_ IS NULL THEN 1 ELSE 0 END) + 
-                                            SUM(CASE WHEN zhuang_tai_2_ = '' OR zhuang_tai_2_ IS NULL THEN 1 ELSE 0 END) > 0 
-                                    THEN CONCAT('迟到', 
-                                        SUM(CASE WHEN zhuang_tai_1_ = '异常' THEN 1 ELSE 0 END) + 
-                                        SUM(CASE WHEN zhuang_tai_2_ = '异常' THEN 1 ELSE 0 END), '次,缺勤',
-                                        SUM(CASE WHEN zhuang_tai_1_ = '' OR zhuang_tai_1_ IS NULL THEN 1 ELSE 0 END) + 
-                                        SUM(CASE WHEN zhuang_tai_2_ = '' OR zhuang_tai_2_ IS NULL THEN 1 ELSE 0 END), '次')
-                                    WHEN SUM(CASE WHEN zhuang_tai_1_ = '异常' THEN 1 ELSE 0 END) + 
-                                        SUM(CASE WHEN zhuang_tai_2_ = '异常' THEN 1 ELSE 0 END) > 0 
-                                    THEN CONCAT('迟到', 
-                                        SUM(CASE WHEN zhuang_tai_1_ = '异常' THEN 1 ELSE 0 END) + 
-                                        SUM(CASE WHEN zhuang_tai_2_ = '异常' THEN 1 ELSE 0 END), '次')
-                                    WHEN SUM(CASE WHEN zhuang_tai_1_ = '' OR zhuang_tai_1_ IS NULL THEN 1 ELSE 0 END) + 
-                                        SUM(CASE WHEN zhuang_tai_2_ = '' OR zhuang_tai_2_ IS NULL THEN 1 ELSE 0 END) > 0 
-                                    THEN CONCAT('缺勤', 
-                                        SUM(CASE WHEN zhuang_tai_1_ = '' OR zhuang_tai_1_ IS NULL THEN 1 ELSE 0 END) + 
-                                        SUM(CASE WHEN zhuang_tai_2_ = '' OR zhuang_tai_2_ IS NULL THEN 1 ELSE 0 END), '次')
-                                    ELSE '正常'
-                                END AS kao_qin_zhuang_tai
-                            FROM 
-                                v_attendance_statistics
-                            ${wherestr}
-                            GROUP BY 
-                                USER_ID_, ri_qi_
-                            ORDER BY 
-                                ri_qi_ DESC
-                            LIMIT ${this.pagination.limit} OFFSET ${(this.pagination.page - 1) * this.pagination.limit}
-                        ) t `
-        }
-      }
-      return sql
-    },
-    // 分页/排序处理
-    handlePaginationChange(page) {
-      ActionUtils.setPagination(this.pagination, page)
-      this.loadData()
-    },
-    handleSortChange(sort) {
-      ActionUtils.setSorts(this.sorts, sort)
-      this.loadData()
-    },
-    getTodayDate() {
-      // 获取初始化查询截止日期
-      const yesterday = new Date()
-      yesterday.setDate(yesterday.getDate() - 1) // 减去1天
-      const year = yesterday.getFullYear()
-      const month = String(yesterday.getMonth() + 1).padStart(2, '0') // 月份从0开始,需要+1
-      const day = String(yesterday.getDate()).padStart(2, '0')
-      const daterRange = {
-        sDay: `${year}-${month}-${day}`,
-        eDay: `${year}-${month}-${day}`
-      }
-      return daterRange
-    },
-    // 操作处理
-    handleAction(command, _, selection) {
-      switch (command) {
-        case 'search':
-          ActionUtils.setFirstPagination(this.pagination)
+          const queryParams =
+          {
+                'pageNo': 1,
+                'limit': 15,
+                'param': {
+                    'buMen': searchParam['Q^bu_men_^SL'],
+                    'locationId': second || first,
+                    'yongHuId': searchUser,
+                    'kaishiJianShiJ^S': this.daterRange[0],
+                    'kaishiJianShiJ^E': this.daterRange[1]
+                }
+          }
+          return queryParams
+      },
+      // 分页/排序处理
+      handlePaginationChange (page) {
+          ActionUtils.setPagination(this.pagination, page)
           this.loadData()
-          break
-        case 'export':
-          this.exportData()
-          break
-      }
-    },
-    // 导出数据
-    exportData() {
-      const exportColumns = [
-        {
-          field_name: 'ri_qi_',
-          label: '日期',
-          name: 'ri_qi_'
-        },
-        {
-          field_name: 'user_name_',
-          label: '姓名',
-          name: 'user_name_'
-        },
-        {
-          field_name: 'pos_name_',
-          label: '部门',
-          name: 'pos_name_'
-        },
-        {
-          field_name: 'gong_hao_',
-          label: '工号',
-          name: 'gong_hao_'
-        },
-        {
-          field_name: 'zui_zao',
-          label: '最早',
-          name: 'zui_zao'
-        },
-        {
-          field_name: 'zui_wan',
-          label: '最晚',
-          name: 'zui_wan'
-        },
-        {
-          field_name: 'da_ka_ci_shu_',
-          label: '打卡次数',
-          name: 'da_ka_ci_shu_'
-        },
+      },
+      handleSortChange (sort) {
+          ActionUtils.setSorts(this.sorts, sort)
+          this.loadData()
+      },
+      getTodayDate () { // 获取初始化查询截止日期
+          const yesterday = new Date()
+          yesterday.setDate(yesterday.getDate() - 1) // 减去1天
+          const year = yesterday.getFullYear()
+          const month = String(yesterday.getMonth() + 1).padStart(2, '0') // 月份从0开始,需要+1
+          const day = String(yesterday.getDate()).padStart(2, '0')
+          const daterRange = {
+              sDay: `${year}-${month}-${day}`,
+              eDay: `${year}-${month}-${day}`
+          }
+          return daterRange
+      },
+      // 操作处理
+      handleAction (command, _, selection) {
+          switch (command) {
+              case 'search':
+                  ActionUtils.setFirstPagination(this.pagination)
+                  this.loadData()
+                  break
+              case 'export':
+                  this.exportData()
+                  break
+          }
+      },
+      // 导出数据
+      exportData () {
+          const exportColumns = [
+              {
+                  field_name: 'ri_qi_',
+                  label: '日期',
+                  name: 'ri_qi_'
+              },
+              {
+                  field_name: 'user_name_',
+                  label: '姓名',
+                  name: 'user_name_'
+              },
+              {
+                  field_name: 'pos_name_',
+                  label: '部门',
+                  name: 'pos_name_'
+              },
+              {
+                  field_name: 'gong_hao_',
+                  label: '工号',
+                  name: 'gong_hao_'
+              },
+              {
+                  field_name: 'zui_zao',
+                  label: '最早',
+                  name: 'zui_zao'
+              },
+              {
+                  field_name: 'zui_wan',
+                  label: '最晚',
+                  name: 'zui_wan'
+              },
+              {
+                  field_name: 'da_ka_ci_shu_',
+                  label: '打卡次数',
+                  name: 'da_ka_ci_shu_'
+              },
 
-        {
-          field_name: 'total_ban_ci_shi_chang',
-          label: '标准工作时长(分钟)',
-          name: 'total_ban_ci_shi_chang'
-        },
-        {
-          field_name: 'total_gong_zuo_shi_chan',
-          label: '实际工作时长(分钟)',
-          name: 'total_gong_zuo_shi_chan'
-        },
-        {
-          field_name: 'kao_qin_zhuang_tai',
-          label: '考勤结果',
-          name: 'kao_qin_zhuang_tai'
-        }
-      ]
-      this.handleExport(exportColumns, this.listData, `考勤概况统计数据`)
-    },
-    handleExport(columns, data, title, message, nameKey = 'name') {
-      IbpsExport.excel({
-        columns: columns,
-        data: data,
-        nameKey: nameKey,
-        title: title
-      }).then(() => {
-        const msg = message || '导出成功'
-        ActionUtils.success(msg)
-      })
-    }
+              {
+                  field_name: 'total_ban_ci_shi_chang',
+                  label: '标准工作时长(分钟)',
+                  name: 'total_ban_ci_shi_chang'
+              },
+              {
+                  field_name: 'total_gong_zuo_shi_chan',
+                  label: '实际工作时长(分钟)',
+                  name: 'total_gong_zuo_shi_chan'
+              },
+              {
+                  field_name: 'kao_qin_zhuang_tai',
+                  label: '考勤结果',
+                  name: 'kao_qin_zhuang_tai'
+              }
+          ]
+          this.handleExport(exportColumns, this.listData, `考勤概况统计数据`)
+      },
+      handleExport (columns, data, title, message, nameKey = 'name') {
+          IbpsExport.excel({
+              columns: columns,
+              data: data,
+              nameKey: nameKey,
+              title: title
+          }).then(() => {
+              const msg = message || '导出成功'
+              ActionUtils.success(msg)
+          })
+      }
   }
 }
 </script>
@@ -488,18 +318,18 @@ export default {
   padding: 20px;
   background: #fff;
   border-radius: 4px;
-  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+  box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
 }
 
 ::v-deep .el-table {
-  .el-table__column[prop='bu_men_'] {
-    min-width: 200px;
+  .el-table__column[prop="bu_men_"] { 
+    min-width: 200px; 
   }
-  .el-table__column[prop='pal_ban_ming_chen'] {
-    min-width: 180px;
+  .el-table__column[prop="pal_ban_ming_chen"] { 
+    min-width: 180px; 
   }
-  .el-tag {
-    margin: 2px;
+  .el-tag { 
+    margin: 2px; 
   }
 }
-</style>
+</style>

+ 31 - 103
src/views/business/attendance/attendanceStatistics.vue

@@ -181,12 +181,11 @@
 </template>
 
 <script>
-import ActionUtils from '@/utils/action'
+import { queryAttendanceStatData } from '@/api/business/attendance'
+import ibpsUserSelector from '@/business/platform/org/selector'
 import FixHeight from '@/mixins/height'
 import IbpsExport from '@/plugins/export'
-import ibpsUserSelector from '@/business/platform/org/selector'
-import color from '@/store/modules/ibps/modules/color'
-import { mount } from 'sortablejs'
+import ActionUtils from '@/utils/action'
 
 export default {
   components: {
@@ -292,21 +291,19 @@ export default {
     // 加载数据
     loadData() {
       this.loading = true
-      const sql = this.getSearchSql()
-      this.$common
-        .request('sql', sql)
-        .then((res) => {
-          this.listData = res.variables.data
-          // 做部门和姓名处理
-          this.listData.forEach((item) => {
-            item.userName = this.getUserLabel(item.yong_hu_id_)
-            item.deptName = this.getDeptLabel(item.bu_men_)
-          })
-          this.pagination.totalCount = this.listData[0]?.total_count
-        })
-        .finally(() => {
-          this.loading = false
-        })
+      queryAttendanceStatData(this.getSearchFormData()).then(res => {
+              this.listData = res.data.dataResult
+              if (this.listData.length > 0) {
+                  // 做部门和姓名处理
+                  this.listData.forEach(item => {
+                      item.userName = this.getUserLabel(item.yong_hu_id_)
+                      item.deptName = this.getDeptLabel(item.bu_men_)
+                  })
+              }
+              this.pagination.totalCount = res.data.pageResult?.totalCount
+      }).finally(() => {
+              this.loading = false
+      })
     },
     getUserLabel(userId) {
       const user = this.userOption.find((item) => item.value === userId)
@@ -321,93 +318,24 @@ export default {
      */
     getSearchFormData() {
       const { first, second } = this.$store.getters.level || {}
-      const searchParam = this.$refs['crud']
-        ? this.$refs['crud'].getSearcFormData()
-        : {}
-      searchParam['Q^di_dian_^S'] = second || first
-      searchParam['Q^ri_qi_^DL'] = this.daterRange[0]
-      searchParam['Q^ri_qi_^DG'] = this.daterRange[1]
-      return ActionUtils.formatParams(searchParam, this.pagination, this.sorts)
-    },
-    getSearchSql() {
-      let sql = ``
-      const params = this.getSearchFormData()
-      // 定义操作符映射
-      const operatorMap = {
-        S: '=',
-        SL: 'LIKE',
-        DG: '<=',
-        DL: '>='
+      const searchParam = this.$refs['crud'] ? this.$refs['crud'].getSearcFormData() : {}
+      let searchUser = []
+      if (this.searchXinMing) {
+          searchUser = this.searchXinMing.split(',')
       }
-      // 如果有查询条件,构建 WHERE 子句
-      if (params.parameters && params.parameters.length > 0) {
-        const conditions = []
-        params.parameters.forEach((item) => {
-          const { key, value } = item
-          const parts = key.split('^') // 格式: Q^field^operator
-          if (parts.length === 3 && parts[0] === 'Q') {
-            const field = parts[1] // 字段名
-            const operatorKey = parts[2] // 操作符(S/SL/DG/DL)
-            const operator = operatorMap[operatorKey]
-            if (operator) {
-              let condition
-              if (operator === 'LIKE') {
-                condition = `${field} LIKE '%${value}%'` // LIKE 模糊查询
-              } else {
-                condition = `${field} ${operator} '${value}'` // 其他操作符(=, <=, >=)
-              }
-              conditions.push(condition)
-            }
-          }
-        })
-
-        if (conditions.length > 0) {
-          let wherestr = ' WHERE ' + conditions.join(' AND ')
-          if (this.searchXinMing) {
-            wherestr +=
-              `and yong_hu_id_ in ('` +
-              this.searchXinMing.split(',').join("','") +
-              `')`
+      const queryParams =
+      {
+         'pageNo': 1,
+         'limit': 15,
+         'param': {
+                    'buMen': searchParam['Q^bu_men_^SL'],
+                    'locationId': second || first,
+                    'yongHuId': searchUser,
+                    'kaishiJianShiJ^S': this.daterRange[0],
+                    'kaishiJianShiJ^E': this.daterRange[1]
           }
-          sql = `select 
-                        (select COUNT(DISTINCT USER_ID_) 
-                            FROM v_attendance_statistics 
-                             ${wherestr}
-                        ) AS total_count,
-                        USER_ID_,
-                        ri_qi_,
-                        user_name_,
-		                pos_name_,
-		                gong_hao_,
-                        COUNT(ri_qi_) AS ying_chu_qin_shu,
-                        SUM(CASE WHEN (da_ka_shi_jian_1_ IS NULL OR da_ka_shi_jian_1_ = '') 
-                                AND (da_ka_shi_jian_2_ IS NULL OR da_ka_shi_jian_2_ = '') 
-                                THEN 1 ELSE 0 END) AS xiu_xi_shu,
-                        COUNT(ri_qi_) - SUM(CASE WHEN (da_ka_shi_jian_1_ IS NULL OR da_ka_shi_jian_1_ = '') 
-                                                AND (da_ka_shi_jian_2_ IS NULL OR da_ka_shi_jian_2_ = '') 
-                                                THEN 1 ELSE 0 END) AS shi_ji_chu_qin_shu,
-                        SUM(kao_qin_zhuang_ta) AS zheng_chang_shu,
-                        SUM(CASE WHEN kao_qin_zhuang_ta = '异常' OR kao_qin_zhuang_ta IS NULL OR kao_qin_zhuang_ta = '' THEN 1 ELSE 0 END) AS yi_chang_shu,
-                        ROUND(SUM(ban_ci_shi_chang_) / 60.0,2) AS total_ban_ci_shi_chang,
-                        ROUND(SUM(gong_zuo_shi_chan) / 60.0,2) AS total_gong_zuo_shi_chan,
-                        SUM(CASE WHEN zhuang_tai_1_ = '异常' OR zhuang_tai_2_ = '异常' THEN 1 ELSE 0 END) AS chi_dao_ci_shu,
-                        SUM(chi_dao_shi_chang) AS total_chi_dao_shi_chang,
-                        SUM(CASE WHEN zhuang_tai_1_ IS NULL OR zhuang_tai_1_ = '' THEN 1 ELSE 0 END) + 
-                        SUM(CASE WHEN zhuang_tai_2_ IS NULL OR zhuang_tai_2_ = '' THEN 1 ELSE 0 END) AS kuang_gong_ci_shu,
-
-                        SUM(CASE WHEN zhuang_tai_1_ = '异常' THEN 1 ELSE 0 END) +
-                        SUM(CASE WHEN zhuang_tai_2_ = '异常' THEN 1 ELSE 0 END) +
-                        SUM(CASE WHEN zhuang_tai_1_ IS NULL OR zhuang_tai_1_ = '' THEN 1 ELSE 0 END) + 
-                        SUM(CASE WHEN zhuang_tai_2_ IS NULL OR zhuang_tai_2_ = '' THEN 1 ELSE 0 END) AS yi_chang_he_ji
-                    FROM 
-                        v_attendance_statistics 
-                    ${wherestr}
-                    GROUP BY USER_ID_ ORDER BY USER_ID_
-                    LIMIT ${this.pagination.limit} OFFSET ${(this.pagination.page - 1) * this.pagination.limit}
-                    `
-        }
       }
-      return sql
+      return queryParams
     },
     getTodayDate() {
       // 获取初始化查询截止日期

+ 4 - 3
src/views/business/attendance/personAttendanceDetails.vue

@@ -194,10 +194,10 @@
 </template>
 
 <script>
-import ActionUtils from '@/utils/action'
+import { queryAttendanceDetail } from '@/api/business/attendance'
 import FixHeight from '@/mixins/height'
 import IbpsExport from '@/plugins/export'
-import { queryAttendanceDetail } from '@/api/business/attendance'
+import ActionUtils from '@/utils/action'
 
 export default {
   mixins: [FixHeight],
@@ -286,7 +286,7 @@ export default {
       this.loading = true
       queryAttendanceDetail(this.getSearchFormData())
         .then((res) => {
-          this.listData = res.variables.data
+          this.listData = res.data.dataResult
           if (this.listData.length > 0) {
             // 做部门和姓名处理
             this.listData.forEach((item) => {
@@ -296,6 +296,7 @@ export default {
               if (item.kaoQinZhuangTa === '') {
                 item.kaoQinZhuangTa = '异常'
               }
+
             })
           }
         })