shudonghui hace 1 año
padre
commit
b5d506cd8e

+ 247 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/TBDingCountQueryResult.java

@@ -0,0 +1,247 @@
+package com.qmth.sop.business.bean.result;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.HeadFontStyle;
+import com.alibaba.excel.annotation.write.style.HeadStyle;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author dhshu
+ * @since 2023-08-01
+ */
+@ApiModel(value = "TBDingCountQueryResult对象", description = "考勤打卡统计查询")
+@ColumnWidth(value = 30)
+@HeadStyle(fillForegroundColor = 11)
+@HeadFontStyle(color = 1)
+public class TBDingCountQueryResult implements Serializable {
+
+
+    @ApiModelProperty(value = "服务单元")
+    @ExcelProperty(value = "服务单元")
+    private String service;
+    @ApiModelProperty(value = "SOP流水号")
+    @ExcelProperty(value = "SOP流水号")
+    private String sopNo;
+    @ApiModelProperty(value = "客户名称")
+    @ExcelProperty(value = "客户名称")
+    private String custom;
+    @ApiModelProperty(value = "省份")
+    @ExcelProperty(value = "省份")
+    private String province;
+    @ApiModelProperty(value = "城市")
+    @ExcelProperty(value = "城市")
+    private String city;
+    @ApiModelProperty(value = "项目开始时间")
+    @ExcelProperty(value = "项目开始时间")
+    private String examStartTime;
+    @ApiModelProperty(value = "项目结束时间")
+    @ExcelProperty(value = "项目结束时间")
+    private String examEndTime;
+    @ApiModelProperty(value = "姓名")
+    @ExcelProperty(value = "姓名")
+    private String userName;
+    @ApiModelProperty(value = "人员档案号")
+    @ExcelProperty(value = "人员档案号")
+    private String userNo;
+    @ApiModelProperty(value = "项目角色")
+    @ExcelProperty(value = "项目角色")
+    private String roleName;
+    @ApiModelProperty(value = "供应商")
+    @ExcelProperty(value = "供应商")
+    private String supplier;
+    @ApiModelProperty(value = "实际出勤(天)")
+    @ExcelProperty(value = "实际出勤(天)")
+    private String attendance;
+    @ApiModelProperty(value = "工作日(天)")
+    @ExcelProperty(value = "工作日(天)")
+    private String weekdays;
+    @ApiModelProperty(value = "周末(天)")
+    @ExcelProperty(value = "周末(天)")
+    private String weekends;
+    @ApiModelProperty(value = "法定节假日(天)")
+    @ExcelProperty(value = "法定节假日(天)")
+    private String holidays;
+    @ApiModelProperty(value = "累计工时(小时)")
+    @ExcelProperty(value = "累计工时(小时)")
+    private String workHours;
+    @ApiModelProperty(value = "违规工时(天)")
+    @ExcelProperty(value = "违规工时(天)")
+    private String violationDays;
+    @ApiModelProperty(value = "提交人")
+    @ExcelProperty(value = "提交人")
+    private String submitter;
+    @ApiModelProperty(value = "提交时间")
+    @ExcelProperty(value = "提交时间")
+    private String submissionTime;
+    @ApiModelProperty(value = "状态,START:已开始,AUDITING:审核中,REJECT:已驳回,END:已终止,FINISH:已结束")
+    @ExcelProperty(value = "提交状态")
+    private String status;
+
+    public String getService() {
+        return service;
+    }
+
+    public void setService(String service) {
+        this.service = service;
+    }
+
+    public String getSopNo() {
+        return sopNo;
+    }
+
+    public void setSopNo(String sopNo) {
+        this.sopNo = sopNo;
+    }
+
+    public String getCustom() {
+        return custom;
+    }
+
+    public void setCustom(String custom) {
+        this.custom = custom;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getExamStartTime() {
+        return examStartTime;
+    }
+
+    public void setExamStartTime(String examStartTime) {
+        this.examStartTime = examStartTime;
+    }
+
+    public String getExamEndTime() {
+        return examEndTime;
+    }
+
+    public void setExamEndTime(String examEndTime) {
+        this.examEndTime = examEndTime;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getUserNo() {
+        return userNo;
+    }
+
+    public void setUserNo(String userNo) {
+        this.userNo = userNo;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+
+    public String getSupplier() {
+        return supplier;
+    }
+
+    public void setSupplier(String supplier) {
+        this.supplier = supplier;
+    }
+
+    public String getAttendance() {
+        return attendance;
+    }
+
+    public void setAttendance(String attendance) {
+        this.attendance = attendance;
+    }
+
+    public String getWeekdays() {
+        return weekdays;
+    }
+
+    public void setWeekdays(String weekdays) {
+        this.weekdays = weekdays;
+    }
+
+    public String getWeekends() {
+        return weekends;
+    }
+
+    public void setWeekends(String weekends) {
+        this.weekends = weekends;
+    }
+
+    public String getHolidays() {
+        return holidays;
+    }
+
+    public void setHolidays(String holidays) {
+        this.holidays = holidays;
+    }
+
+    public String getWorkHours() {
+        return workHours;
+    }
+
+    public void setWorkHours(String workHours) {
+        this.workHours = workHours;
+    }
+
+    public String getViolationDays() {
+        return violationDays;
+    }
+
+    public void setViolationDays(String violationDays) {
+        this.violationDays = violationDays;
+    }
+
+    public String getSubmitter() {
+        return submitter;
+    }
+
+    public void setSubmitter(String submitter) {
+        this.submitter = submitter;
+    }
+
+    public String getSubmissionTime() {
+        return submissionTime;
+    }
+
+    public void setSubmissionTime(String submissionTime) {
+        this.submissionTime = submissionTime;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+}

+ 68 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/TBDingCountResult.java

@@ -0,0 +1,68 @@
+package com.qmth.sop.business.bean.result;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Param:
+ * @return:
+ * @Author: dhshu
+ * @Date: 2023/8/10
+ */
+@ApiModel(value = "TBDingCountResult对象", description = "工时统计")
+public class TBDingCountResult implements Serializable {
+
+
+    @ApiModelProperty(value = "考勤总计")
+    Long total;
+    @ApiModelProperty(value = "已提交")
+    Long submitted;
+    @ApiModelProperty(value = "待提交")
+    Long unSubmitted;
+    @ApiModelProperty(value = "已提交累计人天")
+    Long allDays;
+    @ApiModelProperty(value = "已提交累计工时")
+    Long allHours;
+
+    public Long getTotal() {
+        return total;
+    }
+
+    public void setTotal(Long total) {
+        this.total = total;
+    }
+
+    public Long getSubmitted() {
+        return submitted;
+    }
+
+    public void setSubmitted(Long submitted) {
+        this.submitted = submitted;
+    }
+
+    public Long getUnSubmitted() {
+        return unSubmitted;
+    }
+
+    public void setUnSubmitted(Long unSubmitted) {
+        this.unSubmitted = unSubmitted;
+    }
+
+    public Long getAllDays() {
+        return allDays;
+    }
+
+    public void setAllDays(Long allDays) {
+        this.allDays = allDays;
+    }
+
+    public Long getAllHours() {
+        return allHours;
+    }
+
+    public void setAllHours(Long allHours) {
+        this.allHours = allHours;
+    }
+}

+ 27 - 7
sop-business/src/main/java/com/qmth/sop/business/mapper/TBDingMapper.java

@@ -1,16 +1,36 @@
 package com.qmth.sop.business.mapper;
 
-import com.qmth.sop.business.entity.TBDing;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
+import com.qmth.sop.business.bean.result.TBDingCountResult;
+import com.qmth.sop.business.entity.TBDing;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
 
 /**
- * <p>
- * 考勤打卡表 Mapper 接口
- * </p>
+ * 考勤打卡表 Mapper 接口.
  *
- * @author wangliang
- * @since 2023-08-01
+ * @author: shudonghui
+ * @date: 2023-08-10 14:23:07
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.qmth.com.cn
  */
 public interface TBDingMapper extends BaseMapper<TBDing> {
 
-}
+    /**
+     * 查询列表
+     *
+     * @param iPage
+     * @return
+     */
+
+    IPage<TBDingCountQueryResult> query(IPage<Map> iPage, @Param("serviceId") Long serviceId, @Param("status") String status, @Param("createId") Long createId, @Param("userName") String userName, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo, @Param("days") Long days);
+
+    List<TBDingCountQueryResult> query(@Param("serviceId") Long serviceId, @Param("status") String status, @Param("createId") Long createId, @Param("userName") String userName, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo, @Param("days") Long days);
+
+    TBDingCountResult count(@Param("serviceId") Long serviceId, @Param("createId") Long createId, @Param("userName") String userName, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo);
+}

+ 25 - 7
sop-business/src/main/java/com/qmth/sop/business/service/TBDingService.java

@@ -1,16 +1,34 @@
 package com.qmth.sop.business.service;
 
-import com.qmth.sop.business.entity.TBDing;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
+import com.qmth.sop.business.bean.result.TBDingCountResult;
+import com.qmth.sop.business.entity.TBDing;
+
+import java.util.List;
+import java.util.Map;
 
 /**
- * <p>
  * 考勤打卡表 服务类
- * </p>
  *
- * @author wangliang
- * @since 2023-08-01
+ * @author: shudonghui
+ * @date: 2023-08-10 14:23:08
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.qmth.com.cn
  */
-public interface TBDingService extends IService<TBDing> {
+public interface TBDingService extends IService<TBDing>{
+
+    /**
+    * 查询列表
+    *
+    * @param iPage
+    * @return
+    */
+    IPage<TBDingCountQueryResult> query(IPage<Map> iPage, Long serviceId, String status, Long createId, String userName, Long supplierId, String custom, String sopNo, Long days);
+    List<TBDingCountQueryResult> query(Long serviceId, String status, Long createId, String userName, Long supplierId, String custom, String sopNo, Long days);
 
-}
+    TBDingCountResult count(Long serviceId, Long createId, String userName, Long supplierId, String custom, String sopNo);
+}

+ 36 - 7
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBDingServiceImpl.java

@@ -1,20 +1,49 @@
 package com.qmth.sop.business.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
+import com.qmth.sop.business.bean.result.TBDingCountResult;
 import com.qmth.sop.business.entity.TBDing;
 import com.qmth.sop.business.mapper.TBDingMapper;
 import com.qmth.sop.business.service.TBDingService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Map;
+
 /**
- * <p>
- * 考勤打卡表 服务实现类
- * </p>
+ * 考勤打卡表 服务实现.
  *
- * @author wangliang
- * @since 2023-08-01
+ * @author: shudonghui
+ * @date: 2023-08-10 14:23:08
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.qmth.com.cn
  */
 @Service
 public class TBDingServiceImpl extends ServiceImpl<TBDingMapper, TBDing> implements TBDingService {
 
-}
+
+    /**
+     * 查询列表
+     *
+     * @param iPage
+     * @return
+     */
+
+    @Override
+    public IPage<TBDingCountQueryResult> query(IPage<Map> iPage, Long serviceId, String status, Long createId, String userName, Long supplierId, String custom, String sopNo, Long days) {
+        return this.baseMapper.query(iPage, serviceId, status, createId, userName, supplierId, custom, sopNo, days);
+    }
+
+    @Override
+    public List<TBDingCountQueryResult> query(Long serviceId, String status, Long createId, String userName, Long supplierId, String custom, String sopNo, Long days) {
+        return this.baseMapper.query(serviceId, status, createId, userName, supplierId, custom, sopNo, days);
+    }
+
+    @Override
+    public TBDingCountResult count(Long serviceId,  Long createId, String userName, Long supplierId, String custom, String sopNo) {
+        return this.baseMapper.count(serviceId, createId, userName, supplierId, custom, sopNo);
+    }
+}

+ 79 - 0
sop-business/src/main/java/com/qmth/sop/business/templete/execute/AsyncDingCountExportService.java

@@ -0,0 +1,79 @@
+package com.qmth.sop.business.templete.execute;
+
+import cn.hutool.core.date.DateUtil;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
+import com.qmth.sop.business.entity.BasicAttachment;
+import com.qmth.sop.business.entity.TBTask;
+import com.qmth.sop.business.service.TBTaskService;
+import com.qmth.sop.business.templete.export.AsyncExportTaskTemplete;
+import com.qmth.sop.business.templete.service.TaskLogicService;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.TaskResultEnum;
+import com.qmth.sop.common.enums.TaskStatusEnum;
+import com.qmth.sop.common.enums.TaskTypeEnum;
+import com.qmth.sop.common.util.Result;
+import com.qmth.sop.common.util.ResultUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.StringJoiner;
+
+/**
+ * @Description: 考勤打卡统计导出
+ * @Param:
+ * @return:
+ * @Author: dhshu
+ * @Date: 2023/8/7
+ */
+@Service
+public class AsyncDingCountExportService extends AsyncExportTaskTemplete {
+    private final static Logger log = LoggerFactory.getLogger(AsyncDingCountExportService.class);
+    public static final String OBJ_TITLE = "考勤打卡统计导出";
+
+    @Resource
+    TaskLogicService taskLogicService;
+
+    @Resource
+    TBTaskService tbTaskService;
+
+    @Override
+    public Result exportTask(Map<String, Object> map) throws Exception {
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        StringJoiner stringJoinerSummary = new StringJoiner("\n")
+                .add(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), BEGIN_TITLE, OBJ_TITLE));
+        tbTask.setStatus(TaskStatusEnum.RUNNING);
+        tbTask.setSummary(stringJoinerSummary.toString());
+        tbTaskService.updateById(tbTask);
+        try {
+            Map<String, Object> result = taskLogicService.executeExportDingCountLogic(map);
+            List<TBDingCountQueryResult> archivesImportDtoList = (List<TBDingCountQueryResult>) result.get(SystemConstant.EXCEL_DATA);
+            BasicAttachment basicAttachment = (BasicAttachment) result.get(SystemConstant.EXCEL_ATTACHMENT);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), FINISH_TITLE, !CollectionUtils.isEmpty(archivesImportDtoList) ? archivesImportDtoList.size() : 0, FINISH_SIZE));
+
+            tbTask.setImportFileName(TaskTypeEnum.MESSAGE_EXPORT.getTitle());
+            tbTask.setResultFilePath(basicAttachment.getPath());
+            tbTask.setResult(TaskResultEnum.SUCCESS);
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), EXCEPTION_TITLE, EXCEPTION_DATA, e.getMessage()));
+            tbTask.setResult(TaskResultEnum.ERROR);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {//生成txt文件
+            tbTask.setSummary(stringJoinerSummary.toString());
+            super.createTxt(tbTask);
+        }
+        return ResultUtil.ok();
+    }
+}

+ 8 - 0
sop-business/src/main/java/com/qmth/sop/business/templete/service/TaskLogicService.java

@@ -46,4 +46,12 @@ public interface TaskLogicService {
      * @throws Exception 异常
      */
     Map<String, Object> executeExportSysMessageLogic(Map<String, Object> map) throws Exception;
+    /**
+     * 考勤打卡统计导出
+     *
+     * @param map 数据源
+     * @return 结果
+     * @throws Exception 异常
+     */
+    Map<String, Object> executeExportDingCountLogic(Map<String, Object> map) throws Exception;
 }

+ 27 - 1
sop-business/src/main/java/com/qmth/sop/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -7,12 +7,14 @@ import com.qmth.sop.business.bean.dto.SysMessageExportDto;
 import com.qmth.sop.business.bean.dto.UserArchivesImportDto;
 import com.qmth.sop.business.bean.result.SysCustomResult;
 import com.qmth.sop.business.bean.result.SysMessageResult;
+import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
 import com.qmth.sop.business.entity.*;
 import com.qmth.sop.business.service.*;
 import com.qmth.sop.business.templete.service.TaskLogicService;
 import com.qmth.sop.business.util.ImportExportUtil;
 import com.qmth.sop.business.util.excel.BasicExcelListener;
 import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.FlowStatusEnum;
 import com.qmth.sop.common.enums.ProductTypeEnum;
 import com.qmth.sop.common.enums.UploadFileEnum;
 import com.qmth.sop.common.util.ServletUtil;
@@ -59,7 +61,8 @@ public class TaskLogicServiceImpl implements TaskLogicService {
 
     @Resource
     SysMessageService sysMessageService;
-
+    @Resource
+    TBDingService tbDingService;
 
     /**
      * 处理导入人员档案数据
@@ -211,6 +214,29 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         return map;
     }
 
+    @Override
+    public Map<String, Object> executeExportDingCountLogic(Map<String, Object> map) throws Exception {
+        File fileTemp = null;
+        try {
+            fileTemp = SystemConstant.getFileTempVar(SystemConstant.XLSX_PREFIX);
+
+            List<TBDingCountQueryResult> tbDingCountQueryResults = tbDingService.query((Long) map.get("serviceId"), (String) map.get("status"), (Long) map.get("createId"), (String) map.get("userName"), (Long) map.get("supplierId"), (String) map.get("String"), (String) map.get("sopNo"), (Long) map.get("days"));
+            tbDingCountQueryResults.forEach(e->{
+                e.setStatus(FlowStatusEnum.convertToEnum(e.getStatus()).getTitle());
+            });
+            EasyExcel.write(fileTemp, TBDingCountQueryResult.class).sheet("考勤打卡统计导出").doWrite(tbDingCountQueryResults);
+
+            BasicAttachment basicAttachment = basicAttachmentService.saveAttachment(fileTemp, UploadFileEnum.FILE);
+            map.computeIfAbsent(SystemConstant.EXCEL_DATA, v -> tbDingCountQueryResults);
+            map.computeIfAbsent(SystemConstant.EXCEL_ATTACHMENT, v -> basicAttachment);
+        } finally {
+            if (Objects.nonNull(fileTemp)) {
+                fileTemp.delete();
+            }
+        }
+        return map;
+    }
+
     /**
      * 处理导出人员档案数据
      *

+ 131 - 1
sop-business/src/main/resources/mapper/TBDingMapper.xml

@@ -2,4 +2,134 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.qmth.sop.business.mapper.TBDingMapper">
 
-</mapper>
+    <select id="query" resultType="com.qmth.sop.business.bean.result.TBDingCountQueryResult">
+        SELECT * from (
+        SELECT
+        bs.NAME service,
+        d.sop_no,
+        c.NAME custom,
+        ua.province,
+        ua.city,
+        crm.exam_start_time,
+        crm.exam_end_time,
+        u.real_name user_name,
+        ua.`code` user_no,
+        r.`name` role_name,
+        s.NAME supplier,
+        count( d.id ) attendance,
+        SUM( CASE WHEN d.date_type = 'WEEKDAY' THEN 1 ELSE 0 END ) weekdays,
+        SUM( CASE WHEN d.date_type = 'WEEKEND' THEN 1 ELSE 0 END ) weekends,
+        SUM( CASE WHEN d.date_type = 'LEGAL_HOLIDAYS' THEN 1 ELSE 0 END ) holidays,
+        SUM( CASE WHEN d.sign_out_time is not null and d.sign_in_time is not null   THEN TIMESTAMPDIFF(HOUR, DATE_FORMAT(FROM_UNIXTIME(d.sign_out_time), '%Y-%m-%d %H:%i:%s'), DATE_FORMAT(FROM_UNIXTIME(d.sign_in_time), '%Y-%m-%d %H:%i:%s')) ELSE 0 END ) work_hours,
+        DATEDIFF(DATE_FORMAT(FROM_UNIXTIME(crm.exam_start_time), '%Y-%m-%d'), DATE_FORMAT(FROM_UNIXTIME(crm.exam_end_time), '%Y-%m-%d'))-count( d.id )+1 violation_days,
+        f.`status`,
+        sub.real_name submitter,
+        f.create_time submission_time ,
+        d.service_id,
+        f.create_id,
+        s.id supplier_id
+
+        FROM
+        t_b_ding d
+        LEFT JOIN sys_user u ON u.id = d.user_id
+        LEFT JOIN t_b_user_archives ua ON u.mobile_number = ua.mobile_number
+        LEFT JOIN t_b_user_archives_supplier us ON us.user_archives_id = ua.id
+        LEFT JOIN t_b_service bs ON bs.id = d.service_id
+        LEFT JOIN t_b_sop_info sop ON sop.crm_no = d.crm_no
+        AND sop.sop_no = d.sop_no
+        LEFT JOIN t_b_engineer_allocation ea ON ea.crm_no = d.crm_no
+        AND ea.sop_no = d.sop_no
+        LEFT JOIN sys_role r ON ea.role_id = r.id
+        LEFT JOIN t_b_crm crm ON crm.crm_no = d.crm_no
+        LEFT JOIN sys_custom c ON c.id = sop.custom_id
+        LEFT JOIN t_f_flow_approve f ON f.flow_id = d.flow_id
+        LEFT JOIN sys_user sub ON sub.id = f.create_id
+        LEFT JOIN sys_supplier s ON s.id = us.supplier_id
+        GROUP BY
+        bs.NAME,
+        d.sop_no,
+        c.NAME,
+        ua.province,
+        ua.city,
+        crm.exam_start_time,
+        crm.exam_end_time,
+        u.real_name,
+        ua.`code`,
+        r.`name`,
+        s.NAME,
+        f.`status`,
+        f.create_id,
+        f.create_time,
+        d.service_id,
+        s.id  ) a
+
+        <where>
+            <if test="serviceId != null and serviceId != ''">
+                and a.service_id = #{serviceId}
+            </if>
+            <if test="status != null and status != ''">
+                and a.status = #{status}
+            </if>
+            <if test="createId != null and createId != ''">
+                and a.create_id = #{create_id}
+            </if>
+            <if test="userName != null and userName != ''">
+                and a.real_name like concat('%', #{userName} , '%')
+            </if>
+            <if test="supplierId != null and supplierId != ''">
+                and a.supplier_id = #{supplierId}
+            </if>
+            <if test="custom != null and custom != ''">
+                and a.name like concat('%', #{custom} , '%')
+            </if>
+            <if test="sopNo != null and sopNo != ''">
+                and a.sop_no like concat('%', #{sopNo} , '%')
+            </if>
+            <if test="days != null and days != '' ">
+                <![CDATA[
+               and a.days > #{days}
+               ]]>
+            </if>
+        </where>
+
+    </select>
+
+
+    <select id="count" resultType="com.qmth.sop.business.bean.result.TBDingCountResult">
+        SELECT
+        count( d.id ) total,
+        SUM( CASE WHEN f.`status`='FINISH' THEN 1 ELSE 0 END ) submitted,
+        SUM( CASE WHEN f.`status`!='FINISH' THEN 1 ELSE 0 END ) un_submitted,
+        SUM( CASE WHEN f.`status`='FINISH' THEN 1 ELSE 0 END ) all_days,
+        SUM( CASE WHEN f.`status`='FINISH'  THEN TIMESTAMPDIFF(HOUR, DATE_FORMAT(FROM_UNIXTIME(d.sign_out_time), '%Y-%m-%d %H:%i:%s'), DATE_FORMAT(FROM_UNIXTIME(d.sign_in_time), '%Y-%m-%d %H:%i:%s')) ELSE 0 END ) all_hours
+        FROM
+        t_b_ding d
+        LEFT JOIN sys_user u ON u.id = d.user_id
+        LEFT JOIN t_b_user_archives ua ON u.mobile_number = ua.mobile_number
+        LEFT JOIN t_b_user_archives_supplier us ON us.user_archives_id = ua.id
+        LEFT JOIN t_b_sop_info sop ON sop.crm_no = d.crm_no
+        AND sop.sop_no = d.sop_no
+        LEFT JOIN sys_custom c ON c.id = sop.custom_id
+        LEFT JOIN t_f_flow_approve f ON f.flow_id = d.flow_id
+        <where>
+            <if test="serviceId != null and serviceId != ''">
+                and d.service_id = #{serviceId}
+            </if>
+            <if test="createId != null and createId != ''">
+                and f.create_id = #{create_id}
+            </if>
+            <if test="userName != null and userName != ''">
+                and u.real_name like concat('%', #{userName} , '%')
+            </if>
+            <if test="supplierId != null and supplierId != ''">
+                and ud.supplier_id = #{supplierId}
+            </if>
+            <if test="custom != null and custom != ''">
+                and c.name like concat('%', #{custom} , '%')
+            </if>
+            <if test="sopNo != null and sopNo != ''">
+                and d.sop_no like concat('%', #{sopNo} , '%')
+            </if>
+        </where>
+    </select>
+</mapper>

+ 1 - 0
sop-common/src/main/java/com/qmth/sop/common/contant/SystemConstant.java

@@ -141,6 +141,7 @@ public class SystemConstant {
     public static final String PREFIX_URL_DELAY_WARN_DETAIL = "/admin/tb/delay/warn/detail";
     public static final String PREFIX_URL_VIOLATION = "/admin/tb/violation";
     public static final String PREFIX_URL_VIOLATION_DETAIL = "/admin/tb/violation/detail";
+    public static final String PREFIX_URL_DING = "/admin/tb/ding";
 
     /**
      * 缓存配置

+ 107 - 9
sop-server/src/main/java/com/qmth/sop/server/api/TBDingController.java

@@ -1,20 +1,118 @@
 package com.qmth.sop.server.api;
 
-
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
+import com.qmth.sop.business.bean.result.TBDingCountResult;
+import com.qmth.sop.business.entity.TBDing;
+import com.qmth.sop.business.entity.TBTask;
+import com.qmth.sop.business.service.TBDingService;
+import com.qmth.sop.business.service.TBTaskService;
+import com.qmth.sop.business.templete.execute.AsyncDingCountExportService;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.TaskTypeEnum;
+import com.qmth.sop.common.util.Result;
+import com.qmth.sop.common.util.ResultUtil;
+import io.swagger.annotations.*;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
-
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import java.util.Map;
+
 /**
- * <p>
- * 考勤打卡表 前端控制器
- * </p>
+ * 考勤打卡表 控制器
  *
- * @author wangliang
- * @since 2023-08-01
+ * @author: shudonghui
+ * @date: 2023-08-10 14:23:08
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.qmth.com.cn
  */
+@Api(tags = "考勤打卡表 Controller")
 @RestController
-@RequestMapping("/t-bding")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_DING)
+@Validated
 public class TBDingController {
 
-}
+
+    @Resource
+    TBDingService tBDingService;
+
+    @Resource
+    TBTaskService tbTaskService;
+    @Resource
+    AsyncDingCountExportService asyncDingCountExportService;
+
+    @Aac(auth = BOOL.FALSE)
+    @ApiOperation(value = "考勤打卡统计查询接口")
+    @RequestMapping(value = "/query", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "考勤打卡统计查询结果", response = TBDingCountQueryResult.class)})
+    public Result query(
+            @ApiParam(value = "服务单元", required = false) @RequestParam(required = false) Long serviceId,
+            @ApiParam(value = "提交状态", required = false) @RequestParam(required = false) String status,
+            @ApiParam(value = "提交人", required = false) @RequestParam(required = false) Long createId,
+            @ApiParam(value = "姓名(模糊查询)", required = false) @RequestParam(required = false) String userName,
+            @ApiParam(value = "供应商", required = false) @RequestParam(required = false) Long supplierId,
+            @ApiParam(value = "客户名称(模糊查询)", required = false) @RequestParam(required = false) String custom,
+            @ApiParam(value = "SOP流水号(模糊查询)", required = false) @RequestParam(required = false) String sopNo,
+            @ApiParam(value = "违规工时", required = false) @RequestParam(required = false) Long days,
+            @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+            @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        IPage<TBDingCountQueryResult> resultIPage = tBDingService.query(new Page<>(pageNumber, pageSize), serviceId, status, createId, userName, supplierId, custom, sopNo, days);
+
+        return ResultUtil.ok(resultIPage);
+    }
+
+
+    @Aac(auth = BOOL.FALSE)
+    @ApiOperation(value = "考勤打卡统计接口")
+    @RequestMapping(value = "/count", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "考勤打卡统计结果", response = TBDingCountResult.class)})
+    public Result count(@ApiParam(value = "服务单元", required = false) @RequestParam(required = false) Long serviceId,
+                        @ApiParam(value = "提交人", required = false) @RequestParam(required = false) Long createId,
+                        @ApiParam(value = "姓名(模糊查询)", required = false) @RequestParam(required = false) String userName,
+                        @ApiParam(value = "供应商", required = false) @RequestParam(required = false) Long supplierId,
+                        @ApiParam(value = "客户名称(模糊查询)", required = false) @RequestParam(required = false) String custom,
+                        @ApiParam(value = "SOP流水号(模糊查询)", required = false) @RequestParam(required = false) String sopNo
+                       ) {
+        TBDingCountResult result = tBDingService.count(serviceId, createId, userName, supplierId, custom, sopNo);
+
+        return ResultUtil.ok(result);
+    }
+
+    @Aac(auth = BOOL.FALSE)
+    @ApiOperation(value = "考勤打卡统计导出")
+    @RequestMapping(value = "/export", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
+    public Result export(@ApiParam(value = "服务单元", required = false) @RequestParam(required = false) Long serviceId,
+                         @ApiParam(value = "提交状态", required = false) @RequestParam(required = false) String status,
+                         @ApiParam(value = "提交人", required = false) @RequestParam(required = false) Long createId,
+                         @ApiParam(value = "姓名(模糊查询)", required = false) @RequestParam(required = false) String userName,
+                         @ApiParam(value = "供应商", required = false) @RequestParam(required = false) Long supplierId,
+                         @ApiParam(value = "客户名称(模糊查询)", required = false) @RequestParam(required = false) String custom,
+                         @ApiParam(value = "SOP流水号(模糊查询)", required = false) @RequestParam(required = false) String sopNo,
+                         @ApiParam(value = "违规工时", required = false) @RequestParam(required = false) Long days) throws Exception {
+        Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.DING_COUNT_EXPORT);
+        map.putIfAbsent("serviceId", serviceId);
+        map.putIfAbsent("status", status);
+        map.putIfAbsent("createId", createId);
+        map.putIfAbsent("userName", userName);
+        map.putIfAbsent("supplierId", supplierId);
+        map.putIfAbsent("custom", custom);
+        map.putIfAbsent("sopNo", sopNo);
+        map.putIfAbsent("days", days);
+        asyncDingCountExportService.exportTask(map);
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        return ResultUtil.ok(tbTask.getId());
+    }
+
+}