Kaynağa Gözat

考勤明细查询

shudonghui 1 yıl önce
ebeveyn
işleme
7ebf06df60
16 değiştirilmiş dosya ile 654 ekleme ve 40 silme
  1. 63 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/TBDingAttendanceCountResult.java
  2. 177 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/TBDingAttendanceResult.java
  3. 8 0
      sop-business/src/main/java/com/qmth/sop/business/mapper/TBDingMapper.java
  4. 0 7
      sop-business/src/main/java/com/qmth/sop/business/service/SysMessageService.java
  5. 10 1
      sop-business/src/main/java/com/qmth/sop/business/service/TBDingService.java
  6. 0 25
      sop-business/src/main/java/com/qmth/sop/business/service/impl/SysMessageServiceImpl.java
  7. 20 0
      sop-business/src/main/java/com/qmth/sop/business/service/impl/TBDingServiceImpl.java
  8. 80 0
      sop-business/src/main/java/com/qmth/sop/business/templete/execute/AsyncDingAttendanceExportService.java
  9. 9 0
      sop-business/src/main/java/com/qmth/sop/business/templete/service/TaskLogicService.java
  10. 26 0
      sop-business/src/main/java/com/qmth/sop/business/templete/service/impl/TaskLogicServiceImpl.java
  11. 11 1
      sop-business/src/main/resources/db/log/shudonghui_update_log.sql
  12. 129 0
      sop-business/src/main/resources/mapper/TBDingMapper.xml
  13. 30 0
      sop-common/src/main/java/com/qmth/sop/common/enums/DingResultEnum.java
  14. 5 0
      sop-common/src/main/java/com/qmth/sop/common/enums/InOutTypeEnum.java
  15. 3 1
      sop-common/src/main/java/com/qmth/sop/common/enums/TaskTypeEnum.java
  16. 83 5
      sop-server/src/main/java/com/qmth/sop/server/api/TBDingController.java

+ 63 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/TBDingAttendanceCountResult.java

@@ -0,0 +1,63 @@
+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 = "TBDingAttendanceCountResult", description = "考勤打卡统计查询")
+public class TBDingAttendanceCountResult implements Serializable {
+
+    @ApiModelProperty(value = "考勤总计")
+    Long total;
+    @ApiModelProperty(value = "异常考勤")
+    Long abnormal;
+    @ApiModelProperty(value = "交累计人天")
+    Long allDays;
+    @ApiModelProperty(value = "交累计工时")
+    Long allHours;
+
+    public Long getTotal() {
+        return total;
+    }
+
+    public void setTotal(Long total) {
+        this.total = total;
+    }
+
+    public Long getAbnormal() {
+        return abnormal;
+    }
+
+    public void setAbnormal(Long abnormal) {
+        this.abnormal = abnormal;
+    }
+
+    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;
+    }
+}

+ 177 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/TBDingAttendanceResult.java

@@ -0,0 +1,177 @@
+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 com.qmth.sop.common.enums.DingResultEnum;
+import com.qmth.sop.common.enums.InOutTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author dhshu
+ * @since 2023-08-01
+ */
+@ApiModel(value = "TBDingAttendanceResult对象", description = "考勤打卡统计查询")
+@ColumnWidth(value = 30)
+@HeadStyle(fillForegroundColor = 11)
+@HeadFontStyle(color = 1)
+public class TBDingAttendanceResult 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 userName;
+    @ApiModelProperty(value = "项目角色")
+    @ExcelProperty(value = "项目角色")
+    private String roleName;
+    @ApiModelProperty(value = "供应商")
+    @ExcelProperty(value = "供应商")
+    private String supplier;
+
+    @ApiModelProperty(value = "考勤日期")
+    @ExcelProperty(value = "考勤日期")
+    private String signDate;
+
+    @ApiModelProperty(value = "考勤类型")
+    @ExcelProperty(value = "考勤类型")
+    private InOutTypeEnum type;
+
+    @ApiModelProperty(value = "打卡时间")
+    @ExcelProperty(value = "打卡时间")
+    private Long signTime;
+
+    @ApiModelProperty(value = "打卡地址")
+    @ExcelProperty(value = "打卡地址")
+    private String address;
+
+    @ApiModelProperty(value = "考勤结果")
+    @ExcelProperty(value = "考勤结果")
+    private DingResultEnum 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 getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    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 getSignDate() {
+        return signDate;
+    }
+
+    public void setSignDate(String signDate) {
+        this.signDate = signDate;
+    }
+
+    public InOutTypeEnum getType() {
+        return type;
+    }
+
+    public void setType(InOutTypeEnum type) {
+        this.type = type;
+    }
+
+    public Long getSignTime() {
+        return signTime;
+    }
+
+    public void setSignTime(Long signTime) {
+        this.signTime = signTime;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public DingResultEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(DingResultEnum status) {
+        this.status = status;
+    }
+}

+ 8 - 0
sop-business/src/main/java/com/qmth/sop/business/mapper/TBDingMapper.java

@@ -2,6 +2,8 @@ package com.qmth.sop.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qmth.sop.business.bean.result.TBDingAttendanceCountResult;
+import com.qmth.sop.business.bean.result.TBDingAttendanceResult;
 import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
 import com.qmth.sop.business.bean.result.TBDingCountResult;
 import com.qmth.sop.business.entity.TBDing;
@@ -33,4 +35,10 @@ public interface TBDingMapper extends BaseMapper<TBDing> {
     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);
+
+    IPage<TBDingAttendanceResult> attendanceQuery(IPage<Map> iPage, @Param("serviceId") Long serviceId , @Param("userName") String userName, @Param("startTime") Long startTime, @Param("endTime") Long endTime, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo, @Param("type") String type, @Param("status") String status, @Param("abnormal") Long abnormal);
+
+    TBDingAttendanceCountResult attendanceCount(@Param("serviceId") Long serviceId , @Param("userName") String userName , @Param("startTime") Long startTime, @Param("endTime") Long endTime, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo);
+
+    List<TBDingAttendanceResult> attendanceQuery(@Param("serviceId") Long serviceId , @Param("userName") String userName, @Param("startTime") Long startTime, @Param("endTime") Long endTime, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo, @Param("type") String type, @Param("status") String status, @Param("abnormal") Long abnormal);
 }

+ 0 - 7
sop-business/src/main/java/com/qmth/sop/business/service/SysMessageService.java

@@ -41,13 +41,6 @@ public interface SysMessageService extends IService<SysMessage> {
 
     void publishByNotice(SysNotice sysNotice);
 
-    /**
-     * 保存任务提醒
-     *
-     * @param tsJobRemind
-     */
-    void publishByTSJobRemind(TSJobRemind tsJobRemind);
-
     /**
      * 保存消息
      *

+ 10 - 1
sop-business/src/main/java/com/qmth/sop/business/service/TBDingService.java

@@ -1,11 +1,14 @@
 package com.qmth.sop.business.service;
 
 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.TBDingAttendanceCountResult;
+import com.qmth.sop.business.bean.result.TBDingAttendanceResult;
 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.common.enums.DingResultEnum;
+import com.qmth.sop.common.enums.InOutTypeEnum;
 
 import java.util.List;
 import java.util.Map;
@@ -31,4 +34,10 @@ public interface TBDingService extends IService<TBDing>{
     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);
+
+    IPage<TBDingAttendanceResult> attendanceQuery(IPage<Map> iPage, Long serviceId, String userName, Long startTime, Long endTime, Long supplierId, String custom, String sopNo, InOutTypeEnum type, DingResultEnum status, Long abnormal);
+
+    TBDingAttendanceCountResult attendanceCount(Long serviceId, String userName, Long startTime, Long endTime, Long supplierId, String custom, String sopNo);
+
+    List<TBDingAttendanceResult> attendanceQuery(Long serviceId, String userName, Long startTime, Long endTime, Long supplierId, String custom, String sopNo, InOutTypeEnum type, DingResultEnum status, Long abnormal);
 }

+ 0 - 25
sop-business/src/main/java/com/qmth/sop/business/service/impl/SysMessageServiceImpl.java

@@ -81,17 +81,6 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
         }
     }
 
-    @Override
-    @Transactional
-    public void publishByTSJobRemind(TSJobRemind tsJobRemind) {
-        if (tsJobRemind.getType() == JobQuartzTypeEnum.NOTICE) {
-            List<SysUser> sysUsers = sysUserService.listEnable();
-            sysUsers.forEach(s -> insertMessage(tsJobRemind, s.getId()));
-        } else if (tsJobRemind.getType() == JobQuartzTypeEnum.FLOW) {
-            insertMessage(tsJobRemind, tsJobRemind.getReceiveUserId());
-        }
-    }
-
     /**
      * 保存消息
      *
@@ -118,20 +107,6 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
         this.save(sysMessage);
     }
 
-    private void insertMessage(TSJobRemind tsJobRemind, Long s) {
-        SysMessage sysMessage = new SysMessage();
-        sysMessage.setCrmNo(null);
-        sysMessage.setFormUserId(tsJobRemind.getCreateId());
-        sysMessage.setNoticeId(tsJobRemind.getId());
-        sysMessage.setReceiveUserId(s);
-        sysMessage.setSendTime(System.currentTimeMillis());
-        sysMessage.setStatus(false);
-        sysMessage.setContent(tsJobRemind.getObjName());
-        sysMessage.setType(tsJobRemind.getRemindType().equals(JobTypeEnum.AFTER) ? MessageTypeEnum.AFTER : MessageTypeEnum.BEFORE);
-        sysMessage.setCode(tsJobRemind.getCode());
-        this.save(sysMessage);
-    }
-
     @Override
     @Transactional
     public boolean read(long id) {

+ 20 - 0
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBDingServiceImpl.java

@@ -2,15 +2,20 @@ 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.TBDingAttendanceCountResult;
+import com.qmth.sop.business.bean.result.TBDingAttendanceResult;
 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.qmth.sop.common.enums.DingResultEnum;
+import com.qmth.sop.common.enums.InOutTypeEnum;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * 考勤打卡表 服务实现.
@@ -46,4 +51,19 @@ public class TBDingServiceImpl extends ServiceImpl<TBDingMapper, TBDing> impleme
     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);
     }
+
+    @Override
+    public IPage<TBDingAttendanceResult> attendanceQuery(IPage<Map> iPage, Long serviceId, String userName, Long startTime, Long endTime, Long supplierId, String custom, String sopNo, InOutTypeEnum type, DingResultEnum status, Long abnormal) {
+        return this.baseMapper.attendanceQuery(iPage,serviceId,userName,startTime,endTime, supplierId, custom, sopNo, Objects.nonNull(type)?type.name():null,Objects.nonNull(status)?status.name():null,abnormal);
+    }
+
+    @Override
+    public TBDingAttendanceCountResult attendanceCount(Long serviceId, String userName, Long startTime, Long endTime, Long supplierId, String custom, String sopNo) {
+        return this.baseMapper.attendanceCount(serviceId,userName,startTime,endTime, supplierId, custom, sopNo);
+    }
+
+    @Override
+    public List<TBDingAttendanceResult> attendanceQuery(Long serviceId, String userName, Long startTime, Long endTime, Long supplierId, String custom, String sopNo, InOutTypeEnum type, DingResultEnum status, Long abnormal) {
+        return this.baseMapper.attendanceQuery(serviceId,userName,startTime,endTime, supplierId, custom, sopNo, Objects.nonNull(type)?type.name():null,Objects.nonNull(status)?status.name():null,abnormal);
+    }
 }

+ 80 - 0
sop-business/src/main/java/com/qmth/sop/business/templete/execute/AsyncDingAttendanceExportService.java

@@ -0,0 +1,80 @@
+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.TBDingAttendanceResult;
+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 AsyncDingAttendanceExportService extends AsyncExportTaskTemplete {
+    private final static Logger log = LoggerFactory.getLogger(AsyncDingAttendanceExportService.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.executeExportDingAttendanceLogic(map);
+            List<TBDingAttendanceResult> archivesImportDtoList = (List<TBDingAttendanceResult>) 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();
+    }
+}

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

@@ -54,4 +54,13 @@ public interface TaskLogicService {
      * @throws Exception 异常
      */
     Map<String, Object> executeExportDingCountLogic(Map<String, Object> map) throws Exception;
+
+    /**
+     * 考勤明细导出
+     *
+     * @param map 数据源
+     * @return 结果
+     * @throws Exception 异常
+     */
+    Map<String, Object> executeExportDingAttendanceLogic(Map<String, Object> map)throws Exception;
 }

+ 26 - 0
sop-business/src/main/java/com/qmth/sop/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -2,12 +2,15 @@ package com.qmth.sop.business.templete.service.impl;
 
 import com.alibaba.excel.EasyExcel;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.sop.business.bean.dto.CustomImportDto;
 import com.qmth.sop.business.bean.dto.SysMessageExportDto;
 import com.qmth.sop.business.bean.dto.UserArchivesImportDto;
 import com.qmth.sop.business.bean.params.UserArchivesParam;
 import com.qmth.sop.business.bean.query.UserArchivesQuery;
 import com.qmth.sop.business.bean.result.SysMessageResult;
+import com.qmth.sop.business.bean.result.TBDingAttendanceResult;
 import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
 import com.qmth.sop.business.entity.*;
 import com.qmth.sop.business.service.*;
@@ -327,6 +330,29 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         return map;
     }
 
+    @Override
+    public Map<String, Object> executeExportDingAttendanceLogic(Map<String, Object> map) throws Exception {
+        File fileTemp = null;
+        try {
+            fileTemp = SystemConstant.getFileTempVar(SystemConstant.XLSX_PREFIX);
+            List<TBDingAttendanceResult> tbDingAttendanceResults = tbDingService.attendanceQuery((Long) map.get("serviceId"), (String) map.get("userName"), (Long) map.get("startTime"), (Long) map.get("endTime"), (Long) map.get("supplierId"), (String) map.get("custom"), (String) map.get("sopNo"), (InOutTypeEnum) map.get("type"), (DingResultEnum) map.get("status"), (Long) map.get("abnormal"));
+
+//            tbDingAttendanceResults.forEach(e -> {
+//                //e.setStatus(FlowStatusEnum.convertToEnum(e.getStatus()).getTitle());
+//            });
+            EasyExcel.write(fileTemp, TBDingCountQueryResult.class).sheet("考勤明细导出").doWrite(tbDingAttendanceResults);
+
+            BasicAttachment basicAttachment = basicAttachmentService.saveAttachment(fileTemp, UploadFileEnum.FILE);
+            map.computeIfAbsent(SystemConstant.EXCEL_DATA, v -> tbDingAttendanceResults);
+            map.computeIfAbsent(SystemConstant.EXCEL_ATTACHMENT, v -> basicAttachment);
+        } finally {
+            if (Objects.nonNull(fileTemp)) {
+                fileTemp.delete();
+            }
+        }
+        return map;
+    }
+
     /**
      * 处理导出人员档案数据
      *

+ 11 - 1
sop-business/src/main/resources/db/log/shudonghui_update_log.sql

@@ -216,4 +216,14 @@ VALUES(1040, '获取产品信息列表接口', '/api/admin/tb/product/list', 'UR
 
 
 ---2023.8.18
-DROP TABLE IF EXISTS `sys_custom_role`;
+DROP TABLE IF EXISTS `sys_custom_role`;
+
+
+
+---2023.8.22
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES (1041, '考勤明细查询', '/api/admin/tb/ding/attendance/count', 'URL', 1044, 1, 'AUTH', NULL, 1, 1, 0);
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES (1042, '考勤明细查询', '/api/admin/tb/ding/attendance/export', 'URL', 1044, 1, 'AUTH', NULL, 1, 1, 0);
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES (1043, '考勤明细查询', '/api/admin/tb/ding/attendance/query', 'URL', 1044, 1, 'AUTH', NULL, 1, 1, 0);
+INSERT INTO `sys_privilege` ( `id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display` )
+VALUES
+    ( 1044, '考勤明细查询', 'dingDetail', 'MENU', 24, 1, NULL, '1041,1042,1043', 1, 0, 1 );

+ 129 - 0
sop-business/src/main/resources/mapper/TBDingMapper.xml

@@ -132,4 +132,133 @@
             </if>
         </where>
     </select>
+
+    <select id="attendanceQuery" resultType="com.qmth.sop.business.bean.result.TBDingAttendanceResult">
+        SELECT * from (
+        SELECT
+        bs.NAME service,
+        c.NAME custom,
+        ua.province,
+        ua.city,
+        u.real_name user_name,
+        ua.`code` user_no,
+        r.`name` role_name,
+        s.NAME supplier,
+        d.sign_date,
+        d.type,
+        d.sign_time,
+        CASE WHEN d.sign_time IS NOT NULL THEN 'NORMAL' ELSE 'abnormal' END STATUS,
+        c.address,
+        d.service_id,
+        s.id supplier_id ,
+        d.user_id
+        FROM
+        (
+        SELECT d.*,d.sign_in_time sign_time,'IN' AS type FROM t_b_ding d UNION ALL
+        SELECT d.*,d.sign_out_time sign_time,'OUT' AS type FROM t_b_ding d
+        ) 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 sys_supplier s ON s.id = us.supplier_id
+
+        ) a
+        <where>
+            <if test="serviceId != null and serviceId != ''">
+                and a.service_id = #{serviceId}
+            </if>
+            <if test="userName != null and userName != ''">
+                and a.real_name like concat('%', #{userName} , '%')
+            </if>
+            <if test="startTime != null and startTime != '' ">
+                <![CDATA[
+               and a.sign_date >= #{startTime}
+               ]]>
+            </if>
+            <if test="endTime != null and endTime != ''">
+                <![CDATA[
+                and a.sign_date <= #{endTime}
+                ]]>
+            </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="type != null and type != ''">
+                and a.type = #{type}
+            </if>
+            <if test="status != null and status != ''">
+                and a.status = #{status}
+            </if>
+
+<!--           @Param("abnormal") Long abnormal-->
+<!--            <if test="days != null and days != '' ">-->
+<!--                <![CDATA[-->
+<!--               and a.days > #{days}-->
+<!--               ]]>-->
+<!--            </if>-->
+        </where>
+
+    </select>
+
+    <select id="attendanceCount" resultType="com.qmth.sop.business.bean.result.TBDingAttendanceCountResult">
+        SELECT
+        count( d.id ) total,
+        SUM( CASE WHEN f.`status`!='FINISH' THEN 1 ELSE 0 END ) abnormal,
+        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="userName != null and userName != ''">
+                and u.real_name like concat('%', #{userName} , '%')
+            </if>
+            <if test="startTime != null and startTime != '' ">
+                <![CDATA[
+               and d.sign_date >= #{startTime}
+               ]]>
+            </if>
+            <if test="endTime != null and endTime != ''">
+                <![CDATA[
+                and d.sign_date <= #{endTime}
+                ]]>
+            </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>

+ 30 - 0
sop-common/src/main/java/com/qmth/sop/common/enums/DingResultEnum.java

@@ -0,0 +1,30 @@
+package com.qmth.sop.common.enums;
+
+/**
+ * @Description: 考勤状态enum
+ * @Param:
+ * @return:
+ * @Author: dhshu
+ * @Date: 20223/8/22
+ */
+public enum DingResultEnum {
+
+    NORMAL("正常"),
+
+    ABNORMAL("异常");
+
+    private String title;
+
+    private DingResultEnum(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    @Override
+    public String toString() {
+        return title;
+    }
+}

+ 5 - 0
sop-common/src/main/java/com/qmth/sop/common/enums/InOutTypeEnum.java

@@ -22,4 +22,9 @@ public enum InOutTypeEnum {
     public String getTitle() {
         return title;
     }
+
+    @Override
+    public String toString() {
+        return title;
+    }
 }

+ 3 - 1
sop-common/src/main/java/com/qmth/sop/common/enums/TaskTypeEnum.java

@@ -19,7 +19,9 @@ public enum TaskTypeEnum {
 
     MESSAGE_EXPORT("回执明细导出"),
 
-    DING_COUNT_EXPORT("考勤打卡统计导出");
+    DING_COUNT_EXPORT("考勤打卡统计导出"),
+
+    DING_ATTENDANCE_EXPORT("考勤明细导出");
 
     private String title;
 

+ 83 - 5
sop-server/src/main/java/com/qmth/sop/server/api/TBDingController.java

@@ -2,14 +2,20 @@ 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.constant.ApiConstant;
+import com.qmth.sop.business.bean.result.TBDingAttendanceCountResult;
+import com.qmth.sop.business.bean.result.TBDingAttendanceResult;
 import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
 import com.qmth.sop.business.bean.result.TBDingCountResult;
 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.AsyncDingAttendanceExportService;
 import com.qmth.sop.business.templete.execute.AsyncDingCountExportService;
 import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.DingResultEnum;
+import com.qmth.sop.common.enums.InOutTypeEnum;
 import com.qmth.sop.common.enums.TaskTypeEnum;
 import com.qmth.sop.common.util.Result;
 import com.qmth.sop.common.util.ResultUtil;
@@ -47,10 +53,13 @@ public class TBDingController {
     @Resource
     AsyncDingCountExportService asyncDingCountExportService;
 
+    @Resource
+    AsyncDingAttendanceExportService asyncDingAttendanceExportService;
+
 
-    @ApiOperation(value = "考勤打卡统计查询接口")
+    @ApiOperation(value = "工时统计统计查询接口")
     @RequestMapping(value = "/query", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "考勤打卡统计查询结果", response = TBDingCountQueryResult.class)})
+    @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,
@@ -68,9 +77,9 @@ public class TBDingController {
     }
 
 
-    @ApiOperation(value = "考勤打卡统计接口")
+    @ApiOperation(value = "工时统计统计接口")
     @RequestMapping(value = "/count", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "考勤打卡统计结果", response = TBDingCountResult.class)})
+    @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,
@@ -84,7 +93,7 @@ public class TBDingController {
     }
 
 
-    @ApiOperation(value = "考勤打卡统计导出")
+    @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,
@@ -109,4 +118,73 @@ public class TBDingController {
         return ResultUtil.ok(tbTask.getId());
     }
 
+   
+    @ApiOperation(value = "考勤明细查询接口")
+    @RequestMapping(value = "/attendance/query", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "考勤明细查询结果", response = TBDingAttendanceResult.class)})
+    public Result attendanceQuery(
+            @ApiParam(value = "服务单元", required = false) @RequestParam(required = false) Long serviceId,
+            @ApiParam(value = "姓名(模糊查询)", required = false) @RequestParam(required = false) String userName,
+            @ApiParam(value = "考勤日期开始", required = false) @RequestParam(required = false) Long startTime,
+            @ApiParam(value = "考勤日期结束", required = false) @RequestParam(required = false) Long endTime,
+            @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) InOutTypeEnum type,
+            @ApiParam(value = "考勤结果", required = false) @RequestParam(required = false) DingResultEnum status,
+//            @ApiParam(value = "考勤异常数(未实现)", required = false) @RequestParam(required = false) Long abnormal,
+            @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<TBDingAttendanceResult> resultIPage = tBDingService.attendanceQuery(new Page<>(pageNumber, pageSize), serviceId,userName,startTime,endTime, supplierId, custom, sopNo, type,status,0l);
+
+        return ResultUtil.ok(resultIPage);
+    }
+
+   
+    @ApiOperation(value = "考勤明细统计接口")
+    @RequestMapping(value = "/attendance/count", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "考勤明细统计结果", response = TBDingAttendanceCountResult.class)})
+    public Result attendanceCount(@ApiParam(value = "服务单元", required = false) @RequestParam(required = false) Long serviceId,
+                                  @ApiParam(value = "姓名(模糊查询)", required = false) @RequestParam(required = false) String userName,
+                                  @ApiParam(value = "考勤日期开始", required = false) @RequestParam(required = false) Long startTime,
+                                  @ApiParam(value = "考勤日期结束", required = false) @RequestParam(required = false) Long endTime,
+                                  @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
+    ) {
+        TBDingAttendanceCountResult result = tBDingService.attendanceCount(serviceId,userName,startTime,endTime, supplierId, custom, sopNo);
+
+        return ResultUtil.ok(result);
+    }
+
+   
+    @ApiOperation(value = "考勤明细导出")
+    @RequestMapping(value = "/attendance/export", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
+    public Result attendanceExport(@ApiParam(value = "服务单元", required = false) @RequestParam(required = false) Long serviceId,
+                                   @ApiParam(value = "姓名(模糊查询)", required = false) @RequestParam(required = false) String userName,
+                                   @ApiParam(value = "考勤日期开始", required = false) @RequestParam(required = false) Long startTime,
+                                   @ApiParam(value = "考勤日期结束", required = false) @RequestParam(required = false) Long endTime,
+                                   @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) String type,
+                                   @ApiParam(value = "考勤结果", required = false) @RequestParam(required = false) String status,
+                                   @ApiParam(value = "考勤异常数", required = false) @RequestParam(required = false) Long abnormal) throws Exception {
+        Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.DING_ATTENDANCE_EXPORT);
+        map.putIfAbsent("serviceId", serviceId);
+        map.putIfAbsent("userName", userName);
+        map.putIfAbsent("startTime", startTime);
+        map.putIfAbsent("endTime", endTime);
+        map.putIfAbsent("supplierId", supplierId);
+        map.putIfAbsent("custom", custom);
+        map.putIfAbsent("sopNo", sopNo);
+        map.putIfAbsent("type", type);
+        map.putIfAbsent("status", status);
+        map.putIfAbsent("abnormal", abnormal);
+        asyncDingAttendanceExportService.exportTask(map);
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        return ResultUtil.ok(tbTask.getId());
+    }
+
 }