diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/record/error/list.vue b/attendance-performance-manager-ui/admin/src/views/attendance/record/error/list.vue
index 2e636aad01263e5073851d92ee87d66fd3f0f3a1..c6c9842b4276c458ace34384fa7c8741aa3ef105 100644
--- a/attendance-performance-manager-ui/admin/src/views/attendance/record/error/list.vue
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/record/error/list.vue
@@ -54,7 +54,7 @@
                     }
                 })
                 this.$nextTick(() => {
-                  this.selection = arr.map(item => item.id)  
+                  this.selection = arr.map(item => item.id)
                 })
                 if(arr.length < 1){
                     this.$message.error('璇疯嚦灏戦€夋嫨涓€鏉″鐞�')
@@ -100,12 +100,12 @@
                             label: "鍏ㄩ儴鑰冨嫟缁�",
                             fuzzy: false
                         },
-                        {
+/*                        {
                             name: "classId",
                             type: "select",
                             label: "鍏ㄩ儴鐝",
                             fuzzy: false
-                        },
+                        },*/
                         {
                             name: "errorStatus",
                             type: "select",
@@ -149,8 +149,8 @@
                         {label: "鍛樺伐濮撳悕", prop: "staffName",fixed:'left',width:100},
                         {label: "宸ュ彿", prop: "workNum"},
                         {label: "閮ㄩ棬", prop: "deptName"},
-                        {label: "鑰冨嫟缁�", prop: "deptName"},
-                        {label: "鐝", prop: "shiftsName"},
+                        {label: "鑰冨嫟缁�", prop: "attendanceGroupName"},
+                      /*  {label: "鐝", prop: "shiftsName"},*/
                         {label: "寮傚父鐘舵€�", prop: "errorStatus",formatter: this.formattereErrorStatus},
                         {label: "寮傚父鏃堕棿", prop: "errorDateTime", formatter: this.formatterDate},
                         {label: "澶勭悊缁撴灉", prop: "processResult", formatter: this.formatters},
@@ -175,7 +175,7 @@
                                 }else{
                                     return (
                                         <span>
-                                            
+
                                             <el-button type="text" size='mini' onClick={() => {
                                                 this.reCancle(row)
                                             }}>鎾ら攢</el-button>
@@ -192,4 +192,4 @@
             }
         }
     }
-</script>
\ No newline at end of file
+</script>
diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/record/list.vue b/attendance-performance-manager-ui/admin/src/views/attendance/record/list.vue
index 81ec4d08bd06c01ad815325169c8306ac60bf1ec..ba45569b54b6b83c6a2cf2f8c6f0370e62641984 100644
--- a/attendance-performance-manager-ui/admin/src/views/attendance/record/list.vue
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/record/list.vue
@@ -498,12 +498,11 @@ export default {
           { label: "鍛樺伐宸ュ彿", prop: "workNum" },
           {
             label: "鑰冨嫟缁�",
-            prop: "attendanceGroupName",
-            formatter: this.formatters,
+            prop: "attendanceGroupName"
           },
-          { label: "閮ㄩ棬", prop: "deptName", formatter: this.formatters },
-          { label: "鑱屼綅", prop: "positionName", formatter: this.formatters },
-          { label: "鐝", prop: "shiftsName", formatter: this.formatters },
+          { label: "閮ㄩ棬", prop: "deptName" },
+          { label: "鑱屼綅", prop: "positionName"},
+          { label: "鐝", prop: "classId", formatter: this.formatter },
           {
             label: "绛惧埌缁撴灉",
             prop: "signInResult",
diff --git a/attendance-performance-manager-ui/admin/vue.config.js b/attendance-performance-manager-ui/admin/vue.config.js
index b6ab791e4089fa5a330860442c62369cd0509817..029c521073cca3bae911a32b53717ea5a427b05c 100644
--- a/attendance-performance-manager-ui/admin/vue.config.js
+++ b/attendance-performance-manager-ui/admin/vue.config.js
@@ -17,9 +17,9 @@ module.exports = {
 		hot: true,//鑷姩淇濆瓨
 		proxy: {
 			'/attendance': {
-				target: 'http://192.168.0.98:11039',
+				//target: 'http://192.168.0.98:11039',
 				//  target: 'http://112.19.80.237:11039',
-				//  target: 'http://localhost:17500',
+				  target: 'http://localhost:17500',
 				changeOrigin: true,
 				secure: false,
 				cookieDomainRewrite: 'localhost',
diff --git a/attendance-performance-manager/pom.xml b/attendance-performance-manager/pom.xml
index 4a0d088a22ab6bc86d8caa20f2776ab2be2d9fc2..21190e922ee2ef131559302805dc85a6415c35ba 100644
--- a/attendance-performance-manager/pom.xml
+++ b/attendance-performance-manager/pom.xml
@@ -84,6 +84,39 @@
 				<skipUi>false</skipUi>
 			</properties>
 		</profile>
+
+		<profile>
+			<id>product</id>
+			<properties>
+				<profiles.active>product</profiles.active>
+				<profiles.server.port>17500</profiles.server.port>
+				<profiles.server.path>/attendance</profiles.server.path>
+				<profiles.publish.path>/home/publish</profiles.publish.path>
+				<profiles.nacos.server-addr>127.0.0.1:8848</profiles.nacos.server-addr>
+				<profiles.nacos.group>DEFAULT_GROUP</profiles.nacos.group>
+				<profiles.nacos.namespace>smart-gov</profiles.nacos.namespace>
+				<profiles.log.path>/home/mortals/app/logs</profiles.log.path>
+				<profiles.log.level>INFO</profiles.log.level>
+				<profiles.sms.smsSendUrl>http://127.0.0.1:8089/api/index/index</profiles.sms.smsSendUrl>
+				<profiles.sms.apiId>k6BVS1PEbyzcJAE4</profiles.sms.apiId>
+				<profiles.hik.host>8.136.255.30:8001</profiles.hik.host>
+				<profiles.hik.protocol>http://</profiles.hik.protocol>
+				<profiles.hik.appKey>25128371</profiles.hik.appKey>
+				<profiles.hik.appSecret>2m9RcPJOKq5j2QPQM4v5</profiles.hik.appSecret>
+
+				<profiles.dingtalk.domain>https://oapi.dingtalk.com</profiles.dingtalk.domain>
+				<profiles.dingtalk.oaUrl>api.dingtalk.com</profiles.dingtalk.oaUrl>
+				<profiles.dingtalk.agentId>2652674890</profiles.dingtalk.agentId>
+				<profiles.dingtalk.appKey>dingpqzradgfr4efdi2j</profiles.dingtalk.appKey>
+				<profiles.dingtalk.appSecret>bF2WALmo5_Wuj3hg5gXeWqezrYnZChUJ88HjzNWpkA9ivdOxfBDGOGYcfVRfB3vd</profiles.dingtalk.appSecret>
+				<profiles.dingtalk.aesKey>1QcPYuSpAc98OS3qQwwx5HPH85CZDidxF95yBGad2fJ</profiles.dingtalk.aesKey>
+				<profiles.dingtalk.token>m3WeuVx5kcTY76kh22uWZOTSu0XjvcwNhd</profiles.dingtalk.token>
+				<profiles.dingtalk.opUserId>manager8325</profiles.dingtalk.opUserId>
+				<profiles.webUrl>http://8.136.255.30:21039/attendance</profiles.webUrl>
+				<package.environment>build</package.environment>
+				<skipUi>false</skipUi>
+			</properties>
+		</profile>
 		<profile>
 			<id>yibin</id>
 			<properties>
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/model/UserEntity.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/model/UserEntity.java
index 4fd8839cba054d9b058c9ffb7cef8a67794f3e16..dd0cc3f785615f95725a425ecbd8ebcddc492168 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/model/UserEntity.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/model/UserEntity.java
@@ -1,4 +1,5 @@
 package com.mortals.xhx.base.system.user.model;
+import com.mortals.framework.annotation.desensitization.MobileDesensitize;
 import com.mortals.framework.ap.SysConstains;
 import com.mortals.framework.service.IUser;
 import com.mortals.xhx.base.system.user.model.vo.UserVo;
@@ -34,6 +35,7 @@ public class UserEntity extends UserVo implements IUser {
     /**
      * 鐢ㄦ埛鎵嬫満鍙�
      */
+    @MobileDesensitize
     private String mobile;
     /**
      * 鐢ㄦ埛鑱旂郴鐢佃瘽
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/api/DingMessageController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/api/DingMessageController.java
index f04a42cc455a2c805aedae495c65b38d8ac8c8b1..a860063bcf005e10fde3b5604bcef0fe6bc1d81d 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/api/DingMessageController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/dingmsg/api/DingMessageController.java
@@ -141,16 +141,16 @@ public class DingMessageController {
 
 
 
-                                if(result.getTasks().size() >0 ){
-                                    if(result.getTasks().get(0).getCreateTime() != null && result.getTasks().get(0).getFinishTime() != null){
-                                        Date startTime = dateFormat(result.getTasks().get(0).getCreateTime(),"yyyy-MM-dd'T'HH:mm'Z'",false);
-
-                                        Date endTime = dateFormat(result.getTasks().get(0).getFinishTime(),"yyyy-MM-dd'T'HH:mm'Z'",false);
-                                        leaveRecordEntity.setStartTime(startTime);
-                                        leaveRecordEntity.setEndTime(endTime);
-                                        leaveRecordEntity.setDuration((int) ((endTime.getTime() - startTime.getTime())/1000));
-                                    }
-                                }
+//                                if(result.getTasks().size() >0 ){
+//                                    if(result.getTasks().get(0).getCreateTime() != null && result.getTasks().get(0).getFinishTime() != null){
+//                                        Date startTime = dateFormat(result.getTasks().get(0).getCreateTime(),"yyyy-MM-dd'T'HH:mm'Z'",false);
+//
+//                                        Date endTime = dateFormat(result.getTasks().get(0).getFinishTime(),"yyyy-MM-dd'T'HH:mm'Z'",false);
+//                                        leaveRecordEntity.setStartTime(startTime);
+//                                        leaveRecordEntity.setEndTime(endTime);
+//                                        leaveRecordEntity.setDuration((int) ((endTime.getTime() - startTime.getTime())/1000));
+//                                    }
+//                                }
 
                                 String leave_code = LeaveRulesEnum.浜嬪亣.getLeave_code();
                                 String leave_name = "浜嬪亣";
@@ -169,7 +169,7 @@ public class DingMessageController {
                                             switch (jsonArray.get(3).toString()){
                                                 case "halfDay":
                                                 case "day":
-                                                    leaveRecordEntity.setDuration((int) (Float.parseFloat(jsonArray.get(2).toString())*60*60*24)); //灏忔椂杞崲鎴愮
+                                                    leaveRecordEntity.setDuration((int) (Float.parseFloat(jsonArray.get(2).toString())*60*60*24)); //澶╄浆鎹㈡垚绉�
                                                     break;
                                                 default:  //闄や簡鎸夊ぉ鍜屽崐澶╄绠楃殑鍋囨湡  鍏朵綑閮芥槸鎸夊皬鏃惰繑鍥�
                                                     leaveRecordEntity.setDuration((int) (Float.parseFloat(jsonArray.get(2).toString())*60*60)); //灏忔椂杞崲鎴愮
@@ -281,21 +281,24 @@ public class DingMessageController {
 
 
                                 if(result.getResult().compareToIgnoreCase("AGREE") == 0){
-                                    if(result.getTasks().size() > 1){
-                                        if(result.getTasks().get(1).getStatus().compareToIgnoreCase("CANCELED") != 0){
-                                            leaveRecordEntity.setAuditResult(4);  //鎾ら攢瀹℃壒瀹屾垚
-                                        }else {
-                                            leaveRecordEntity.setAuditResult(1);
-                                        }
-                                    }
-                                }else if(result.equals("")){  //鎾ら攢鍋囨湡瀹℃壒涓璻esult浼氫负绌�  鎾ら攢瀹℃壒閫氳繃鍚巖esult涓篈GREE
+//                                    if(result.getTasks().size() > 1){
+//                                        if(result.getTasks().get(1).getStatus().compareToIgnoreCase("CANCELED") == 0){
+//                                            leaveRecordEntity.setAuditResult(4);  //鎾ら攢瀹℃壒瀹屾垚
+//                                        }else {
+//                                            leaveRecordEntity.setAuditResult(1);
+//                                        }
+//                                    }
+                                    leaveRecordEntity.setAuditResult(1);
+                                }
+                                else if(result.equals("")){  //鎾ら攢鍋囨湡瀹℃壒涓璻esult浼氫负绌�  鎾ら攢瀹℃壒閫氳繃鍚巖esult涓篈GREE
                                     if(result.getTasks().size() > 1){
                                         log.info("status"+result.getTasks().get(1).getStatus());
                                         if(result.getTasks().get(1).getStatus().compareToIgnoreCase("CANCELED") != 0){
                                             leaveRecordEntity.setAuditResult(3);  //鎾ら攢瀹℃壒涓�
                                         }
                                     }
-                                }else {
+                                }
+                                else {
                                     leaveRecordEntity.setAuditResult(2);  //璇峰亣瀹℃壒涓�
                                 }
 
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/AttendanceRecordEntity.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/AttendanceRecordEntity.java
index 8268f301575d2ba2681053b48024772e39073168..368dc525cf7c64c659e47e90ed322cc1adc41396 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/AttendanceRecordEntity.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/AttendanceRecordEntity.java
@@ -14,7 +14,7 @@ import lombok.Data;
  * 鑰冨嫟鎵撳崱璁板綍淇℃伅瀹炰綋瀵硅薄
  *
  * @author zxfei
- * @date 2023-07-27
+ * @date 2023-08-03
  */
 @Data
 public class AttendanceRecordEntity extends AttendanceRecordVo {
@@ -61,15 +61,6 @@ public class AttendanceRecordEntity extends AttendanceRecordVo {
      */
     @Excel(name = "鎵€灞炶€冨嫟缁勫悕绉�")
     private String attendanceGroupName;
-    /**
-     * 鐝ID
-     */
-    private Long shiftsId;
-    /**
-     * 鐝鍚嶇О
-     */
-    @Excel(name = "鐝鍚嶇О")
-    private String shiftsName;
     /**
      * 鎵撳崱鏃ユ湡
      */
@@ -82,12 +73,12 @@ public class AttendanceRecordEntity extends AttendanceRecordVo {
     /**
      * 绛惧埌缁撴灉(0.鍚�,1.鏄�)
      */
-    @Excel(name = "绛惧埌缁撴灉", readConverterExp = "0=寮傚父,1=姝e父")
+    @Excel(name = "绛惧埌缁撴灉", readConverterExp = "0=鍚�,1=鏄�")
     private Integer signInResult;
     /**
      * 绛鹃€€缁撴灉(0.鍚�,1.鏄�)
      */
-    @Excel(name = "绛鹃€€缁撴灉", readConverterExp = "0=寮傚父,1=姝e父")
+    @Excel(name = "绛鹃€€缁撴灉", readConverterExp = "0=鍚�,1=鏄�")
     private Integer signOutResult;
     /**
      * 鑰冨嫟绫诲瀷
@@ -96,8 +87,16 @@ public class AttendanceRecordEntity extends AttendanceRecordVo {
     /**
      * 鎵撳崱缁撴灉(0.鍚�,1.鏄�)
      */
-    @Excel(name = "鎵撳崱缁撴灉", readConverterExp = "0=寮傚父,1=姝e父")
+    @Excel(name = "鎵撳崱缁撴灉", readConverterExp = "0=鍚�,1=鏄�")
     private Integer punchResult;
+    /**
+     * 鐝ID
+     */
+    private Long classId;
+    /**
+     * 鐝鍚嶇О
+     */
+    private String className;
     @Override
     public int hashCode() {
         return this.getId().hashCode();
@@ -124,13 +123,13 @@ public class AttendanceRecordEntity extends AttendanceRecordVo {
         this.positionName = "";
         this.attendanceGroupId = 0L;
         this.attendanceGroupName = "";
-        this.shiftsId = 0L;
-        this.shiftsName = "";
         this.attendanceDate = new Date();
         this.remark = "";
         this.signInResult = 0;
         this.signOutResult = 0;
         this.attendType = "";
         this.punchResult = 0;
+        this.classId = 0L;
+        this.className = "";
     }
 }
\ No newline at end of file
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/AttendanceRecordQuery.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/AttendanceRecordQuery.java
index dc377539bab429a47cca1187f411e7139041dcf8..735953050e51cfc43e2fe9c0f53549fdb5df9265 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/AttendanceRecordQuery.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/AttendanceRecordQuery.java
@@ -7,7 +7,7 @@ import com.mortals.xhx.module.attendance.model.AttendanceRecordEntity;
  * 鑰冨嫟鎵撳崱璁板綍淇℃伅鏌ヨ瀵硅薄
  *
  * @author zxfei
- * @date 2023-07-18
+ * @date 2023-08-03
  */
 public class AttendanceRecordQuery extends AttendanceRecordEntity {
     /** 寮€濮� 搴忓彿锛屼富閿紝鑷闀� */
@@ -110,26 +110,6 @@ public class AttendanceRecordQuery extends AttendanceRecordEntity {
 
     /** 鎵€灞炶€冨嫟缁勫悕绉版帓闄ゅ垪琛� */
     private List <String> attendanceGroupNameNotList;
-    /** 寮€濮� 鐝ID */
-    private Long shiftsIdStart;
-
-    /** 缁撴潫 鐝ID */
-    private Long shiftsIdEnd;
-
-    /** 澧炲姞 鐝ID */
-    private Long shiftsIdIncrement;
-
-    /** 鐝ID鍒楄〃 */
-    private List <Long> shiftsIdList;
-
-    /** 鐝ID鎺掗櫎鍒楄〃 */
-    private List <Long> shiftsIdNotList;
-
-    /** 鐝鍚嶇О */
-    private List<String> shiftsNameList;
-
-    /** 鐝鍚嶇О鎺掗櫎鍒楄〃 */
-    private List <String> shiftsNameNotList;
     /** 寮€濮� 鎵撳崱鏃ユ湡 */
     private String attendanceDateStart;
 
@@ -233,6 +213,26 @@ public class AttendanceRecordQuery extends AttendanceRecordEntity {
     /** 鎵撳崱缁撴灉(0.鍚�,1.鏄�)鎺掗櫎鍒楄〃 */
     private List <Integer> punchResultNotList;
 
+    /** 寮€濮� 鐝ID */
+    private Long classIdStart;
+
+    /** 缁撴潫 鐝ID */
+    private Long classIdEnd;
+
+    /** 澧炲姞 鐝ID */
+    private Long classIdIncrement;
+
+    /** 鐝ID鍒楄〃 */
+    private List <Long> classIdList;
+
+    /** 鐝ID鎺掗櫎鍒楄〃 */
+    private List <Long> classIdNotList;
+
+    /** 鐝鍚嶇О */
+    private List<String> classNameList;
+
+    /** 鐝鍚嶇О鎺掗櫎鍒楄〃 */
+    private List <String> classNameNotList;
     /** OR鏉′欢闆嗗悎锛屽垪琛ㄩ」涔嬮棿鏄疧R锛岄」鍐呭涔嬮棿鏄疉ND锛屽锛�(list[0].1 and list[0].2) or (list[1].3 and list[1].4) */
     private List<AttendanceRecordQuery> orConditionList;
 
@@ -806,119 +806,6 @@ public class AttendanceRecordQuery extends AttendanceRecordEntity {
         this.attendanceGroupNameNotList = attendanceGroupNameNotList;
     }
 
-    /**
-     * 鑾峰彇 寮€濮� 鐝ID
-     * @return shiftsIdStart
-     */
-    public Long getShiftsIdStart(){
-        return this.shiftsIdStart;
-    }
-
-    /**
-     * 璁剧疆 寮€濮� 鐝ID
-     * @param shiftsIdStart
-     */
-    public void setShiftsIdStart(Long shiftsIdStart){
-        this.shiftsIdStart = shiftsIdStart;
-    }
-
-    /**
-     * 鑾峰彇 缁撴潫 鐝ID
-     * @return $shiftsIdEnd
-     */
-    public Long getShiftsIdEnd(){
-        return this.shiftsIdEnd;
-    }
-
-    /**
-     * 璁剧疆 缁撴潫 鐝ID
-     * @param shiftsIdEnd
-     */
-    public void setShiftsIdEnd(Long shiftsIdEnd){
-        this.shiftsIdEnd = shiftsIdEnd;
-    }
-
-    /**
-     * 鑾峰彇 澧炲姞 鐝ID
-     * @return shiftsIdIncrement
-     */
-    public Long getShiftsIdIncrement(){
-        return this.shiftsIdIncrement;
-    }
-
-    /**
-     * 璁剧疆 澧炲姞 鐝ID
-     * @param shiftsIdIncrement
-     */
-    public void setShiftsIdIncrement(Long shiftsIdIncrement){
-        this.shiftsIdIncrement = shiftsIdIncrement;
-    }
-
-    /**
-     * 鑾峰彇 鐝ID
-     * @return shiftsIdList
-     */
-    public List<Long> getShiftsIdList(){
-        return this.shiftsIdList;
-    }
-
-    /**
-     * 璁剧疆 鐝ID
-     * @param shiftsIdList
-     */
-    public void setShiftsIdList(List<Long> shiftsIdList){
-        this.shiftsIdList = shiftsIdList;
-    }
-
-    /**
-     * 鑾峰彇 鐝ID
-     * @return shiftsIdNotList
-     */
-    public List<Long> getShiftsIdNotList(){
-        return this.shiftsIdNotList;
-    }
-
-    /**
-     * 璁剧疆 鐝ID
-     * @param shiftsIdNotList
-     */
-    public void setShiftsIdNotList(List<Long> shiftsIdNotList){
-        this.shiftsIdNotList = shiftsIdNotList;
-    }
-
-
-    /**
-     * 鑾峰彇 鐝鍚嶇О
-     * @return shiftsNameList
-     */
-    public List<String> getShiftsNameList(){
-        return this.shiftsNameList;
-    }
-
-    /**
-     * 璁剧疆 鐝鍚嶇О
-     * @param shiftsNameList
-     */
-    public void setShiftsNameList(List<String> shiftsNameList){
-        this.shiftsNameList = shiftsNameList;
-    }
-
-    /**
-     * 鑾峰彇 鐝鍚嶇О
-     * @return shiftsNameNotList
-     */
-    public List<String> getShiftsNameNotList(){
-        return this.shiftsNameNotList;
-    }
-
-    /**
-     * 璁剧疆 鐝鍚嶇О
-     * @param shiftsNameNotList
-     */
-    public void setShiftsNameNotList(List<String> shiftsNameNotList){
-        this.shiftsNameNotList = shiftsNameNotList;
-    }
-
     /**
      * 鑾峰彇 寮€濮� 鎵撳崱鏃ユ湡
      * @return attendanceDateStart
@@ -1484,6 +1371,119 @@ public class AttendanceRecordQuery extends AttendanceRecordEntity {
     }
 
 
+    /**
+     * 鑾峰彇 寮€濮� 鐝ID
+     * @return classIdStart
+     */
+    public Long getClassIdStart(){
+        return this.classIdStart;
+    }
+
+    /**
+     * 璁剧疆 寮€濮� 鐝ID
+     * @param classIdStart
+     */
+    public void setClassIdStart(Long classIdStart){
+        this.classIdStart = classIdStart;
+    }
+
+    /**
+     * 鑾峰彇 缁撴潫 鐝ID
+     * @return $classIdEnd
+     */
+    public Long getClassIdEnd(){
+        return this.classIdEnd;
+    }
+
+    /**
+     * 璁剧疆 缁撴潫 鐝ID
+     * @param classIdEnd
+     */
+    public void setClassIdEnd(Long classIdEnd){
+        this.classIdEnd = classIdEnd;
+    }
+
+    /**
+     * 鑾峰彇 澧炲姞 鐝ID
+     * @return classIdIncrement
+     */
+    public Long getClassIdIncrement(){
+        return this.classIdIncrement;
+    }
+
+    /**
+     * 璁剧疆 澧炲姞 鐝ID
+     * @param classIdIncrement
+     */
+    public void setClassIdIncrement(Long classIdIncrement){
+        this.classIdIncrement = classIdIncrement;
+    }
+
+    /**
+     * 鑾峰彇 鐝ID
+     * @return classIdList
+     */
+    public List<Long> getClassIdList(){
+        return this.classIdList;
+    }
+
+    /**
+     * 璁剧疆 鐝ID
+     * @param classIdList
+     */
+    public void setClassIdList(List<Long> classIdList){
+        this.classIdList = classIdList;
+    }
+
+    /**
+     * 鑾峰彇 鐝ID
+     * @return classIdNotList
+     */
+    public List<Long> getClassIdNotList(){
+        return this.classIdNotList;
+    }
+
+    /**
+     * 璁剧疆 鐝ID
+     * @param classIdNotList
+     */
+    public void setClassIdNotList(List<Long> classIdNotList){
+        this.classIdNotList = classIdNotList;
+    }
+
+
+    /**
+     * 鑾峰彇 鐝鍚嶇О
+     * @return classNameList
+     */
+    public List<String> getClassNameList(){
+        return this.classNameList;
+    }
+
+    /**
+     * 璁剧疆 鐝鍚嶇О
+     * @param classNameList
+     */
+    public void setClassNameList(List<String> classNameList){
+        this.classNameList = classNameList;
+    }
+
+    /**
+     * 鑾峰彇 鐝鍚嶇О
+     * @return classNameNotList
+     */
+    public List<String> getClassNameNotList(){
+        return this.classNameNotList;
+    }
+
+    /**
+     * 璁剧疆 鐝鍚嶇О
+     * @param classNameNotList
+     */
+    public void setClassNameNotList(List<String> classNameNotList){
+        this.classNameNotList = classNameNotList;
+    }
+
     /**
      * 璁剧疆  搴忓彿锛屼富閿紝鑷闀�
      * @param id
@@ -1849,79 +1849,6 @@ public class AttendanceRecordQuery extends AttendanceRecordEntity {
         return this;
     }
 
-    /**
-     * 璁剧疆  鐝ID
-     * @param shiftsId
-     */
-    public AttendanceRecordQuery shiftsId(Long shiftsId){
-        setShiftsId(shiftsId);
-        return this;
-    }
-
-    /**
-     * 璁剧疆 寮€濮� 鐝ID
-     * @param shiftsIdStart
-     */
-    public AttendanceRecordQuery shiftsIdStart(Long shiftsIdStart){
-        this.shiftsIdStart = shiftsIdStart;
-        return this;
-    }
-
-    /**
-     * 璁剧疆 缁撴潫 鐝ID
-     * @param shiftsIdEnd
-     */
-    public AttendanceRecordQuery shiftsIdEnd(Long shiftsIdEnd){
-        this.shiftsIdEnd = shiftsIdEnd;
-        return this;
-    }
-
-    /**
-     * 璁剧疆 澧炲姞 鐝ID
-     * @param shiftsIdIncrement
-     */
-    public AttendanceRecordQuery shiftsIdIncrement(Long shiftsIdIncrement){
-        this.shiftsIdIncrement = shiftsIdIncrement;
-        return this;
-    }
-
-    /**
-     * 璁剧疆 鐝ID
-     * @param shiftsIdList
-     */
-    public AttendanceRecordQuery shiftsIdList(List<Long> shiftsIdList){
-        this.shiftsIdList = shiftsIdList;
-        return this;
-    }
-
-    /**
-     * 璁剧疆 鐝ID
-     * @param shiftsIdNotList
-     */
-    public AttendanceRecordQuery shiftsIdNotList(List<Long> shiftsIdNotList){
-        this.shiftsIdNotList = shiftsIdNotList;
-        return this;
-    }
-
-
-    /**
-     * 璁剧疆 鐝鍚嶇О
-     * @param shiftsName
-     */
-    public AttendanceRecordQuery shiftsName(String shiftsName){
-        setShiftsName(shiftsName);
-        return this;
-    }
-
-    /**
-     * 璁剧疆 鐝鍚嶇О
-     * @param shiftsNameList
-     */
-    public AttendanceRecordQuery shiftsNameList(List<String> shiftsNameList){
-        this.shiftsNameList = shiftsNameList;
-        return this;
-    }
-
 
 
     /**
@@ -2233,6 +2160,79 @@ public class AttendanceRecordQuery extends AttendanceRecordEntity {
         return this;
     }
 
+    /**
+     * 璁剧疆  鐝ID
+     * @param classId
+     */
+    public AttendanceRecordQuery classId(Long classId){
+        setClassId(classId);
+        return this;
+    }
+
+    /**
+     * 璁剧疆 寮€濮� 鐝ID
+     * @param classIdStart
+     */
+    public AttendanceRecordQuery classIdStart(Long classIdStart){
+        this.classIdStart = classIdStart;
+        return this;
+    }
+
+    /**
+     * 璁剧疆 缁撴潫 鐝ID
+     * @param classIdEnd
+     */
+    public AttendanceRecordQuery classIdEnd(Long classIdEnd){
+        this.classIdEnd = classIdEnd;
+        return this;
+    }
+
+    /**
+     * 璁剧疆 澧炲姞 鐝ID
+     * @param classIdIncrement
+     */
+    public AttendanceRecordQuery classIdIncrement(Long classIdIncrement){
+        this.classIdIncrement = classIdIncrement;
+        return this;
+    }
+
+    /**
+     * 璁剧疆 鐝ID
+     * @param classIdList
+     */
+    public AttendanceRecordQuery classIdList(List<Long> classIdList){
+        this.classIdList = classIdList;
+        return this;
+    }
+
+    /**
+     * 璁剧疆 鐝ID
+     * @param classIdNotList
+     */
+    public AttendanceRecordQuery classIdNotList(List<Long> classIdNotList){
+        this.classIdNotList = classIdNotList;
+        return this;
+    }
+
+
+    /**
+     * 璁剧疆 鐝鍚嶇О
+     * @param className
+     */
+    public AttendanceRecordQuery className(String className){
+        setClassName(className);
+        return this;
+    }
+
+    /**
+     * 璁剧疆 鐝鍚嶇О
+     * @param classNameList
+     */
+    public AttendanceRecordQuery classNameList(List<String> classNameList){
+        this.classNameList = classNameList;
+        return this;
+    }
+
     /**
      * 鑾峰彇 OR鏉′欢闆嗗悎锛屽垪琛ㄩ」涔嬮棿鏄疧R锛岄」鍐呭涔嬮棿鏄疉ND锛屽锛�(list[0].1 and list[0].2) or (list[1].3 and list[1].4)
      * @return orConditionList
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceRecordErrorServiceImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceRecordErrorServiceImpl.java
index 02fe0c064ac947d8d05687c503154f015fd9fcd4..17243007faff6b89e0240d3bf1a7a06ce01aea14 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceRecordErrorServiceImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceRecordErrorServiceImpl.java
@@ -39,28 +39,24 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
     protected void findAfter(AttendanceRecordErrorEntity params, PageInfo pageInfo, Context context, List<AttendanceRecordErrorEntity> list) throws AppException {
 
         list.forEach(item -> {
-            AttendanceClassEntity attendanceClassEntity = attendanceClassService.get(item.getShiftsId(), context);
+            AttendanceClassDetailEntity attendanceClassDetailEntity = classDetailService.get(item.getShiftsId(), context);
 
-            if(!ObjectUtils.isEmpty(attendanceClassEntity)&&!ObjectUtils.isEmpty(attendanceClassEntity.getAttendanceClassDetailList())){
-                for (AttendanceClassDetailEntity attendanceClassDetailEntity : attendanceClassEntity.getAttendanceClassDetailList()) {
-                    if (!ObjectUtils.isEmpty(attendanceClassDetailEntity)) {
-                        String str = DateUtil.formatTime(item.getGoOffDateTime());
-                        String goStr = DateUtil.formatTime(attendanceClassDetailEntity.getGoWorkDate());
-                        String offStr = DateUtil.formatTime(attendanceClassDetailEntity.getOffWorkDate());
+            if (!ObjectUtils.isEmpty(attendanceClassDetailEntity)) {
+                String str = DateUtil.formatTime(item.getGoOffDateTime());
+                String goStr = DateUtil.formatTime(attendanceClassDetailEntity.getGoWorkDate());
+                String offStr = DateUtil.formatTime(attendanceClassDetailEntity.getOffWorkDate());
 
-                        if (!ObjectUtils.isEmpty(str)&&str.equals(goStr)) {
-                            item.setGoOrOff("涓婄彮");
-                        }
-                        if (!ObjectUtils.isEmpty(str)&&str.equals(offStr)) {
-                            item.setGoOrOff("涓嬬彮");
-                        }
-                        if (ObjectUtils.isEmpty(item.getGoOrOff())) {
-                            item.setGoOrOff("涓婄彮");
-                        }
-                    }
+                if (!ObjectUtils.isEmpty(str) && str.equals(goStr)) {
+                    item.setGoOrOff("涓婄彮");
                 }
-            }else {
-                item.setGoOrOff("涓婄彮");
+                if (!ObjectUtils.isEmpty(str) && str.equals(offStr)) {
+                    item.setGoOrOff("涓嬬彮");
+                }
+                if (ObjectUtils.isEmpty(item.getGoOrOff())) {
+                    item.setGoOrOff("");
+                }
+            } else {
+                item.setGoOrOff("");
             }
         });
     }
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceRecordHikServiceImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceRecordHikServiceImpl.java
index da4037e60978222619bb2dbbbf4393efe139fbfe..02ea5a6ef2e2fc04171695a2756021467ac5a059 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceRecordHikServiceImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceRecordHikServiceImpl.java
@@ -127,6 +127,7 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
                     commonData.setContext(context);
                     commonData.setAttendanceGroupEntity(attendanceGroupEntity);
                     commonData.setAttendanceRecordEntity(attendanceRecordEntity);
+                    commonData.setAttendanceDate(attendanceRecordEntity.getAttendanceDate());
                     commonData.setDetailEntityList(detailEntityList);
                     commonData.setStaffId(attendanceRecordEntity.getStaffId());
                     commonData.setDateStr(dateStr);
@@ -149,6 +150,7 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
                         commonData.setAttendanceGroupEntity(attendanceGroupEntity);
                         commonData.setAttendanceRecordEntity(attendanceRecordEntity);
                         commonData.setDetailEntityList(detailEntityList);
+                        commonData.setAttendanceDate(attendanceRecordEntity.getAttendanceDate());
                         commonData.setStaffId(attendanceRecordEntity.getStaffId());
                         commonData.setDateStr(dateStr);
                         workAbstract.doHandleWork(commonData);
@@ -194,7 +196,7 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
                     //鍒ゆ柇鏄惁瀛樺湪璁板綍 濡傛灉瀛樺湪 鍒欐洿鏂�  缁村害   staffId  attendanceDate shiftsId attendanceGroupId
                     AttendanceRecordQuery query = new AttendanceRecordQuery();
                     query.setStaffId(attendanceRecordEntity.getStaffId());
-                    query.setShiftsId(attendanceRecordEntity.getShiftsId());
+                    query.setClassId(attendanceRecordEntity.getClassId());
                     query.setAttendanceGroupId(attendanceRecordEntity.getAttendanceGroupId());
                     query.setAttendanceDate(attendanceRecordEntity.getAttendanceDate());
 
@@ -297,8 +299,8 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
                 }
                 if (!ObjectUtils.isEmpty(detailEntityList)) {
                     AttendanceClassDetailEntity attendanceClassDetailEntity = attendanceClassDetailService.get(detailEntityList.get(0).getShiftsId(), context);
-                    attendanceRecordEntity.setShiftsId(attendanceClassDetailEntity == null ? 0L : attendanceClassDetailEntity.getClassId());
-                    attendanceRecordEntity.setShiftsName(attendanceClassDetailEntity == null ? "" : attendanceClassDetailEntity.getClassName());
+                    attendanceRecordEntity.setClassId(attendanceClassDetailEntity == null ? 0L : attendanceClassDetailEntity.getClassId());
+                    attendanceRecordEntity.setClassName(attendanceClassDetailEntity == null ? "" : attendanceClassDetailEntity.getClassName());
                 }
                 //鐢熸垚寮傚父璁板綍
                 genErrorAttendRecord(context, dateStr, attendanceRecordEntity, detailEntityList);
@@ -339,7 +341,7 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
                     //鍒ゆ柇鏄惁瀛樺湪璁板綍 濡傛灉瀛樺湪 鍒欐洿鏂�  缁村害   staffId  attendanceDate shiftsId attendanceGroupId
                     AttendanceRecordQuery query = new AttendanceRecordQuery();
                     query.setStaffId(attendanceRecordEntity.getStaffId());
-                    query.setShiftsId(attendanceRecordEntity.getShiftsId());
+                    query.setClassId(attendanceRecordEntity.getClassId());
                     query.setAttendanceGroupId(attendanceRecordEntity.getAttendanceGroupId());
                     query.setAttendanceDate(attendanceRecordEntity.getAttendanceDate());
 
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/work/FixWorkOtherAttendance.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/work/FixWorkOtherAttendance.java
index 0f7d5a352ac0ba6a878160497682f5ded02e607c..866cb3f855c769bdde6d9c89615802ee58adfe7f 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/work/FixWorkOtherAttendance.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/work/FixWorkOtherAttendance.java
@@ -228,8 +228,8 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
         }
         if (!ObjectUtils.isEmpty(commonData.getDetailEntityList())) {
             AttendanceClassDetailEntity attendanceClassDetailEntity = attendanceClassDetailService.get(commonData.getDetailEntityList().get(0).getShiftsId());
-            commonData.getAttendanceRecordEntity().setShiftsId(attendanceClassDetailEntity == null ? 0L : attendanceClassDetailEntity.getClassId());
-            commonData.getAttendanceRecordEntity().setShiftsName(attendanceClassDetailEntity == null ? "" : attendanceClassDetailEntity.getClassName());
+            commonData.getAttendanceRecordEntity().setClassId(attendanceClassDetailEntity == null ? 0L : attendanceClassDetailEntity.getClassId());
+            commonData.getAttendanceRecordEntity().setClassName(attendanceClassDetailEntity == null ? "" : attendanceClassDetailEntity.getClassName());
         }
         //鐢熸垚寮傚父璁板綍
         genErrorAttendRecord(commonData.getContext(), commonData.getDateStr(), commonData.getAttendanceRecordEntity(), commonData.getDetailEntityList());
@@ -249,7 +249,9 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
             AttendanceRecordErrorEntity errorEntity = new AttendanceRecordErrorEntity();
             errorEntity.initAttrValue();
             BeanUtils.copyProperties(attendanceRecordEntity, errorEntity, new String[]{"id"});
-            errorEntity.setGoOffDateTime(errorEntity.getErrorDateTime());
+
+            errorEntity.setShiftsId(recordDetailEntity.getShiftsId());
+            errorEntity.setShiftsName(recordDetailEntity.getShiftsName());
             errorEntity.setProcessStatus(YesNoEnum.NO.getValue());
             errorEntity.setCreateTime(new Date());
             errorEntity.setCreateUserId(context.getUser().getId());
@@ -257,7 +259,7 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
             //鍒ゆ柇涓婄彮
             if (GoWorkResultEnum.姝e父.getValue() != goWorkResult) {
                 Date goWorkDate = attendanceClassDetailEntity.getGoWorkDate();
-                errorEntity.setGoOffDateTime(goWorkDate);
+                errorEntity.setGoOffDateTime(DateUtil.parseDateTime(dateStr + " " + DateUtil.formatTime(goWorkDate)).toJdkDate());
                 if (!ObjectUtils.isEmpty(recordDetailEntity.getGoWorkDate())) {
                     errorEntity.setErrorDateTime(recordDetailEntity.getGoWorkDate());
                     errorEntity.setActualAttendanceDateTime(recordDetailEntity.getGoWorkDate());
@@ -280,7 +282,7 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
             //鍒ゆ柇涓嬬彮
             if (OffWorkResultEnum.姝e父.getValue() != offWorkResult) {
                 Date offWorkDate = attendanceClassDetailEntity.getOffWorkDate();
-                errorEntity.setGoOffDateTime(offWorkDate);
+                errorEntity.setGoOffDateTime(DateUtil.parseDateTime(dateStr + " " + DateUtil.formatTime(offWorkDate)).toJdkDate());
                 if (!ObjectUtils.isEmpty(recordDetailEntity.getGoWorkDate())) {
                     errorEntity.setErrorDateTime(recordDetailEntity.getGoWorkDate());
                     errorEntity.setActualAttendanceDateTime(recordDetailEntity.getGoWorkDate());
@@ -296,13 +298,26 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
                 if (OffWorkResultEnum.杩熷埌.getValue() == recordDetailEntity.getOffWorkResult()) {
                     errorEntity.setErrorStatus(ErrorStatusEnum.杩熷埌.getValue());
                 }
+                errorEntity.setActualAttendanceDateTime(attendanceRecordEntity.getAttendanceDate());
                 errorEntityList.add(errorEntity);
             }
-
         }
 
         if (!ObjectUtils.isEmpty(errorEntityList)) {
-            errorService.save(errorEntityList, context);
+            for (AttendanceRecordErrorEntity errorEntity : errorEntityList) {
+                //鏌ョ湅鏄惁瀛樺湪鐩稿悓鐨勫紓甯歌褰曪紝濡傛灉瀛樺湪 鍒欎笉娣诲姞
+                AttendanceRecordErrorQuery errorQuery = new AttendanceRecordErrorQuery();
+                errorQuery.setShiftsId(errorEntity.getShiftsId());
+                errorQuery.setGoOffDateTime(errorEntity.getErrorDateTime());
+                errorQuery.setStaffId(errorEntity.getStaffId());
+
+                int count = errorService.count(errorQuery, context);
+                if (count == 0) {
+                    errorService.save(errorEntity, context);
+                } else {
+                    log.info("宸茬粡瀛樺湪鐩稿悓鐨勫紓甯歌褰曪紝涓嶅仛淇濆瓨锛�");
+                }
+            }
         }
     }
 }
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceRecordController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceRecordController.java
index 3632b3626148cc31178b370142aaf1a9764e0d9a..716ba8fbd10a8aa5983d596a54bc1be4a4786fca 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceRecordController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceRecordController.java
@@ -146,8 +146,8 @@ public class AttendanceRecordController extends BaseCRUDJsonBodyMappingControlle
             attendanceExportRecordEntity.setDeptName(deptEntity==null?"":deptEntity.getDeptName());
         }
 
-        if(!ObjectUtils.isEmpty(query.getShiftsId())){
-            AttendanceClassEntity attendanceClassEntity = classService.get(query.getShiftsId(), context);
+        if(!ObjectUtils.isEmpty(query.getClassId())){
+            AttendanceClassEntity attendanceClassEntity = classService.get(query.getClassId(), context);
             attendanceExportRecordEntity.setClassName(attendanceClassEntity==null?"":attendanceClassEntity.getClassName());
         }
         attendanceExportRecordEntity.setCreateUserId(context.getUser().getId());
@@ -161,7 +161,7 @@ public class AttendanceRecordController extends BaseCRUDJsonBodyMappingControlle
     @Override
     protected void doListBefore(AttendanceRecordEntity query, Map<String, Object> model, Context context) throws AppException {
         if (query.getClassId() != null) {
-            query.setShiftsId(query.getClassId());
+            query.setClassId(query.getClassId());
         }
         if (query.getGroupId() != null) {
             query.setAttendanceGroupId(query.getGroupId());
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/feedback/web/FeedbackFileController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/feedback/web/FeedbackFileController.java
index 5a4f67f556bf1fafc91cd35a1cbf3a6f541ee15f..2337dd10c215371db99c006d0460f02416c0e207 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/feedback/web/FeedbackFileController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/feedback/web/FeedbackFileController.java
@@ -1,4 +1,6 @@
 package com.mortals.xhx.module.feedback.web;
+import com.mortals.framework.exception.AppException;
+import com.mortals.framework.model.OrderCol;
 import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
 import com.mortals.xhx.base.system.param.service.ParamService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -46,5 +48,8 @@ public class FeedbackFileController extends BaseCRUDJsonBodyMappingController<Fe
         super.init(model, context);
     }
 
-
+    @Override
+    protected void doListBefore(FeedbackFileEntity query, Map<String, Object> model, Context context) throws AppException {
+        query.setOrderColList(Arrays.asList(new OrderCol("createTime")));
+    }
 }
\ No newline at end of file
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/model/StaffEntity.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/model/StaffEntity.java
index f494ea4fa77570b4d8e50758590bf7fc56d5be93..ccaad5977b364c4a6299333dc456c9782e0a9143 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/model/StaffEntity.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/model/StaffEntity.java
@@ -5,6 +5,8 @@ import java.util.List;
 import java.util.ArrayList;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.mortals.framework.annotation.Excel;
+import com.mortals.framework.annotation.desensitization.IdCardDesensitize;
+import com.mortals.framework.annotation.desensitization.MobileDesensitize;
 import com.mortals.framework.model.BaseEntityLong;
 import com.mortals.xhx.module.staff.model.vo.StaffVo;
 import lombok.Data;
@@ -40,11 +42,13 @@ public class StaffEntity extends StaffVo {
      * 鑱旂郴鐢佃瘽
      */
     @Excel(name = "鑱旂郴鐢佃瘽")
+    @MobileDesensitize
     private String phoneNumber;
     /**
      * 韬唤璇佸彿鐮�
      */
     @Excel(name = "韬唤璇佸彿鐮�")
+    @IdCardDesensitize
     private String idCard;
     /**
      * 宸ュ彿
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/model/vo/StaffVo.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/model/vo/StaffVo.java
index 11d93cc571aa89993702259d369cf6d245cfd654..2ce88aeb6a11d1d443c12420297229320e3bb4fd 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/model/vo/StaffVo.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/model/vo/StaffVo.java
@@ -1,4 +1,7 @@
 package com.mortals.xhx.module.staff.model.vo;
+import com.mortals.framework.annotation.Excel;
+import com.mortals.framework.annotation.desensitization.IdCardDesensitize;
+import com.mortals.framework.annotation.desensitization.MobileDesensitize;
 import com.mortals.framework.model.BaseEntityLong;
 import lombok.Data;
 
@@ -12,6 +15,17 @@ import java.util.List;
 @Data
 public class StaffVo extends BaseEntityLong {
 
+    /**
+     * 鑱旂郴鐢佃瘽
+     */
+    @MobileDesensitize
+    private String phoneNumber;
+    /**
+     * 韬唤璇佸彿鐮�
+     */
+    @IdCardDesensitize
+    private String idCard;
+
     private List <Long> idList;
 
     private List<HolidayListVo> holidayLists;
diff --git a/attendance-performance-manager/src/main/resources/sqlmap/module/attendance/AttendanceRecordMapper.xml b/attendance-performance-manager/src/main/resources/sqlmap/module/attendance/AttendanceRecordMapper.xml
index 5e7267d7f02ab4c2643cf451483b0578f3479b96..726b3acb3a6023945891af332d6e3cfc00c94dbf 100644
--- a/attendance-performance-manager/src/main/resources/sqlmap/module/attendance/AttendanceRecordMapper.xml
+++ b/attendance-performance-manager/src/main/resources/sqlmap/module/attendance/AttendanceRecordMapper.xml
@@ -15,8 +15,6 @@
         <result property="positionName" column="positionName" />
         <result property="attendanceGroupId" column="attendanceGroupId" />
         <result property="attendanceGroupName" column="attendanceGroupName" />
-        <result property="shiftsId" column="shiftsId" />
-        <result property="shiftsName" column="shiftsName" />
         <result property="attendanceDate" column="attendanceDate" />
         <result property="remark" column="remark" />
         <result property="createUserId" column="createUserId" />
@@ -27,6 +25,8 @@
         <result property="signOutResult" column="signOutResult" />
         <result property="attendType" column="attendType" />
         <result property="punchResult" column="punchResult" />
+        <result property="classId" column="classId" />
+        <result property="className" column="className" />
 
     </resultMap>
 
@@ -64,12 +64,6 @@
             <if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('attendanceGroupName') or colPickMode == 1 and data.containsKey('attendanceGroupName')))">
                 a.attendanceGroupName,
             </if>
-            <if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('shiftsId') or colPickMode == 1 and data.containsKey('shiftsId')))">
-                a.shiftsId,
-            </if>
-            <if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('shiftsName') or colPickMode == 1 and data.containsKey('shiftsName')))">
-                a.shiftsName,
-            </if>
             <if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('attendanceDate') or colPickMode == 1 and data.containsKey('attendanceDate')))">
                 a.attendanceDate,
             </if>
@@ -100,23 +94,29 @@
             <if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('punchResult') or colPickMode == 1 and data.containsKey('punchResult')))">
                 a.punchResult,
             </if>
+            <if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('classId') or colPickMode == 1 and data.containsKey('classId')))">
+                a.classId,
+            </if>
+            <if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('className') or colPickMode == 1 and data.containsKey('className')))">
+                a.className,
+            </if>
         </trim>
     </sql>
     <!-- 鏂板 鍖哄垎涓婚敭鑷鍔犺繕鏄笟鍔℃彃鍏� -->
     <insert id="insert" parameterType="AttendanceRecordEntity"  useGeneratedKeys="true" keyProperty="id">
         insert into mortals_xhx_attendance_record
-        (staffId,staffName,workNum,deptId,deptName,positionId,positionName,attendanceGroupId,attendanceGroupName,shiftsId,shiftsName,attendanceDate,remark,createUserId,createTime,updateUserId,updateTime,signInResult,signOutResult,attendType,punchResult)
+        (staffId,staffName,workNum,deptId,deptName,positionId,positionName,attendanceGroupId,attendanceGroupName,attendanceDate,remark,createUserId,createTime,updateUserId,updateTime,signInResult,signOutResult,attendType,punchResult,classId,className)
         VALUES
-        (#{staffId},#{staffName},#{workNum},#{deptId},#{deptName},#{positionId},#{positionName},#{attendanceGroupId},#{attendanceGroupName},#{shiftsId},#{shiftsName},#{attendanceDate},#{remark},#{createUserId},#{createTime},#{updateUserId},#{updateTime},#{signInResult},#{signOutResult},#{attendType},#{punchResult})
+        (#{staffId},#{staffName},#{workNum},#{deptId},#{deptName},#{positionId},#{positionName},#{attendanceGroupId},#{attendanceGroupName},#{attendanceDate},#{remark},#{createUserId},#{createTime},#{updateUserId},#{updateTime},#{signInResult},#{signOutResult},#{attendType},#{punchResult},#{classId},#{className})
     </insert>
 
     <!-- 鎵归噺鏂板 -->
     <insert id="insertBatch" parameterType="paramDto">
         insert into mortals_xhx_attendance_record
-        (staffId,staffName,workNum,deptId,deptName,positionId,positionName,attendanceGroupId,attendanceGroupName,shiftsId,shiftsName,attendanceDate,remark,createUserId,createTime,updateUserId,updateTime,signInResult,signOutResult,attendType,punchResult)
+        (staffId,staffName,workNum,deptId,deptName,positionId,positionName,attendanceGroupId,attendanceGroupName,attendanceDate,remark,createUserId,createTime,updateUserId,updateTime,signInResult,signOutResult,attendType,punchResult,classId,className)
         VALUES
         <foreach collection="data.dataList" item="item" index="index" separator="," >
-            (#{item.staffId},#{item.staffName},#{item.workNum},#{item.deptId},#{item.deptName},#{item.positionId},#{item.positionName},#{item.attendanceGroupId},#{item.attendanceGroupName},#{item.shiftsId},#{item.shiftsName},#{item.attendanceDate},#{item.remark},#{item.createUserId},#{item.createTime},#{item.updateUserId},#{item.updateTime},#{item.signInResult},#{item.signOutResult},#{item.attendType},#{item.punchResult})
+            (#{item.staffId},#{item.staffName},#{item.workNum},#{item.deptId},#{item.deptName},#{item.positionId},#{item.positionName},#{item.attendanceGroupId},#{item.attendanceGroupName},#{item.attendanceDate},#{item.remark},#{item.createUserId},#{item.createTime},#{item.updateUserId},#{item.updateTime},#{item.signInResult},#{item.signOutResult},#{item.attendType},#{item.punchResult},#{item.classId},#{item.className})
         </foreach>
     </insert>
 
@@ -165,15 +165,6 @@
             <if test="(colPickMode==0 and data.containsKey('attendanceGroupName')) or (colPickMode==1 and !data.containsKey('attendanceGroupName'))">
                 a.attendanceGroupName=#{data.attendanceGroupName},
             </if>
-            <if test="(colPickMode==0 and data.containsKey('shiftsId')) or (colPickMode==1 and !data.containsKey('shiftsId'))">
-                a.shiftsId=#{data.shiftsId},
-            </if>
-            <if test="(colPickMode==0 and data.containsKey('shiftsIdIncrement')) or (colPickMode==1 and !data.containsKey('shiftsIdIncrement'))">
-                a.shiftsId=ifnull(a.shiftsId,0) + #{data.shiftsIdIncrement},
-            </if>
-            <if test="(colPickMode==0 and data.containsKey('shiftsName')) or (colPickMode==1 and !data.containsKey('shiftsName'))">
-                a.shiftsName=#{data.shiftsName},
-            </if>
             <if test="(colPickMode==0 and data.containsKey('attendanceDate')) or (colPickMode==1 and !data.containsKey('attendanceDate'))">
                 a.attendanceDate=#{data.attendanceDate},
             </if>
@@ -219,6 +210,15 @@
             <if test="(colPickMode==0 and data.containsKey('punchResultIncrement')) or (colPickMode==1 and !data.containsKey('punchResultIncrement'))">
                 a.punchResult=ifnull(a.punchResult,0) + #{data.punchResultIncrement},
             </if>
+            <if test="(colPickMode==0 and data.containsKey('classId')) or (colPickMode==1 and !data.containsKey('classId'))">
+                a.classId=#{data.classId},
+            </if>
+            <if test="(colPickMode==0 and data.containsKey('classIdIncrement')) or (colPickMode==1 and !data.containsKey('classIdIncrement'))">
+                a.classId=ifnull(a.classId,0) + #{data.classIdIncrement},
+            </if>
+            <if test="(colPickMode==0 and data.containsKey('className')) or (colPickMode==1 and !data.containsKey('className'))">
+                a.className=#{data.className},
+            </if>
         </trim>
         <trim suffixOverrides="where" suffix="">
             where
@@ -314,25 +314,6 @@
                     </if>
                 </foreach>
             </trim>
-            <trim prefix="shiftsId=(case" suffix="ELSE shiftsId end),">
-                <foreach collection="data.dataList" item="item" index="index" separator="" >
-                    <choose>
-                        <when test="(colPickMode==0 and item.containsKey('shiftsId')) or (colPickMode==1 and !item.containsKey('shiftsId'))">
-                            when a.id=#{item.id} then #{item.shiftsId}
-                        </when>
-                        <when test="(colPickMode==0 and item.containsKey('shiftsIdIncrement')) or (colPickMode==1 and !item.containsKey('shiftsIdIncrement'))">
-                            when a.id=#{item.id} then ifnull(a.shiftsId,0) + #{item.shiftsIdIncrement}
-                        </when>
-                    </choose>
-                </foreach>
-            </trim>
-            <trim prefix="shiftsName=(case" suffix="ELSE shiftsName end),">
-                <foreach collection="data.dataList" item="item" index="index" separator="" >
-                    <if test="(colPickMode==0 and item.containsKey('shiftsName')) or (colPickMode==1 and !item.containsKey('shiftsName'))">
-                        when a.id=#{item.id} then #{item.shiftsName}
-                    </if>
-                </foreach>
-            </trim>
             <trim prefix="attendanceDate=(case" suffix="ELSE attendanceDate end),">
                 <foreach collection="data.dataList" item="item" index="index" separator="" >
                     <if test="(colPickMode==0 and item.containsKey('attendanceDate')) or (colPickMode==1 and !item.containsKey('attendanceDate'))">
@@ -428,6 +409,25 @@
                     </choose>
                 </foreach>
             </trim>
+            <trim prefix="classId=(case" suffix="ELSE classId end),">
+                <foreach collection="data.dataList" item="item" index="index" separator="" >
+                    <choose>
+                        <when test="(colPickMode==0 and item.containsKey('classId')) or (colPickMode==1 and !item.containsKey('classId'))">
+                            when a.id=#{item.id} then #{item.classId}
+                        </when>
+                        <when test="(colPickMode==0 and item.containsKey('classIdIncrement')) or (colPickMode==1 and !item.containsKey('classIdIncrement'))">
+                            when a.id=#{item.id} then ifnull(a.classId,0) + #{item.classIdIncrement}
+                        </when>
+                    </choose>
+                </foreach>
+            </trim>
+            <trim prefix="className=(case" suffix="ELSE className end),">
+                <foreach collection="data.dataList" item="item" index="index" separator="" >
+                    <if test="(colPickMode==0 and item.containsKey('className')) or (colPickMode==1 and !item.containsKey('className'))">
+                        when a.id=#{item.id} then #{item.className}
+                    </if>
+                </foreach>
+            </trim>
         </trim>
         where id in
         <foreach collection="data.dataList" item="item" index="index" open="(" separator="," close=")">
@@ -784,54 +784,6 @@
                 #{item}
             </foreach>
         </if>
-        <if test="conditionParamRef.containsKey('shiftsId')">
-            <if test="conditionParamRef.shiftsId != null ">
-                ${_conditionType_} a.shiftsId = #{${_conditionParam_}.shiftsId}
-            </if>
-            <if test="conditionParamRef.shiftsId == null">
-                ${_conditionType_} a.shiftsId is null
-            </if>
-        </if>
-        <if test="conditionParamRef.containsKey('shiftsIdList') and conditionParamRef.shiftsIdList.size() > 0">
-            ${_conditionType_} a.shiftsId in
-            <foreach collection="conditionParamRef.shiftsIdList" open="(" close=")" index="index" item="item" separator=",">
-                #{item}
-            </foreach>
-        </if>
-        <if test="conditionParamRef.containsKey('shiftsIdNotList') and conditionParamRef.shiftsIdNotList.size() > 0">
-            ${_conditionType_} a.shiftsId not in
-            <foreach collection="conditionParamRef.shiftsIdNotList" open="(" close=")" index="index" item="item" separator=",">
-                #{item}
-            </foreach>
-        </if>
-        <if test="conditionParamRef.containsKey('shiftsIdStart') and conditionParamRef.shiftsIdStart != null">
-            ${_conditionType_} a.shiftsId <![CDATA[ >= ]]> #{${_conditionParam_}.shiftsIdStart}
-        </if>
-        <if test="conditionParamRef.containsKey('shiftsIdEnd') and conditionParamRef.shiftsIdEnd != null">
-            ${_conditionType_} a.shiftsId <![CDATA[ <= ]]> #{${_conditionParam_}.shiftsIdEnd}
-        </if>
-
-
-        <if test="conditionParamRef.containsKey('shiftsName')">
-            <if test="conditionParamRef.shiftsName != null and conditionParamRef.shiftsName != ''">
-                ${_conditionType_} a.shiftsName like #{${_conditionParam_}.shiftsName}
-            </if>
-            <if test="conditionParamRef.shiftsName == null">
-                ${_conditionType_} a.shiftsName is null
-            </if>
-        </if>
-        <if test="conditionParamRef.containsKey('shiftsNameList') and conditionParamRef.shiftsNameList.size() > 0">
-            ${_conditionType_} a.shiftsName in
-            <foreach collection="conditionParamRef.shiftsNameList" open="(" close=")" index="index" item="item" separator=",">
-                #{item}
-            </foreach>
-        </if>
-        <if test="conditionParamRef.containsKey('shiftsNameNotList') and conditionParamRef.shiftsNameNotList.size() > 0">
-            ${_conditionType_} a.shiftsName not in
-            <foreach collection="conditionParamRef.shiftsNameNotList" open="(" close=")" index="index" item="item" separator=",">
-                #{item}
-            </foreach>
-        </if>
 
         <if test="conditionParamRef.containsKey('attendanceDate')">
             <if test="conditionParamRef.attendanceDate != null ">
@@ -1054,6 +1006,54 @@
             ${_conditionType_} a.punchResult <![CDATA[ <= ]]> #{${_conditionParam_}.punchResultEnd}
         </if>
 
+        <if test="conditionParamRef.containsKey('classId')">
+            <if test="conditionParamRef.classId != null ">
+                ${_conditionType_} a.classId = #{${_conditionParam_}.classId}
+            </if>
+            <if test="conditionParamRef.classId == null">
+                ${_conditionType_} a.classId is null
+            </if>
+        </if>
+        <if test="conditionParamRef.containsKey('classIdList') and conditionParamRef.classIdList.size() > 0">
+            ${_conditionType_} a.classId in
+            <foreach collection="conditionParamRef.classIdList" open="(" close=")" index="index" item="item" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="conditionParamRef.containsKey('classIdNotList') and conditionParamRef.classIdNotList.size() > 0">
+            ${_conditionType_} a.classId not in
+            <foreach collection="conditionParamRef.classIdNotList" open="(" close=")" index="index" item="item" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="conditionParamRef.containsKey('classIdStart') and conditionParamRef.classIdStart != null">
+            ${_conditionType_} a.classId <![CDATA[ >= ]]> #{${_conditionParam_}.classIdStart}
+        </if>
+        <if test="conditionParamRef.containsKey('classIdEnd') and conditionParamRef.classIdEnd != null">
+            ${_conditionType_} a.classId <![CDATA[ <= ]]> #{${_conditionParam_}.classIdEnd}
+        </if>
+
+
+        <if test="conditionParamRef.containsKey('className')">
+            <if test="conditionParamRef.className != null and conditionParamRef.className != ''">
+                ${_conditionType_} a.className like #{${_conditionParam_}.className}
+            </if>
+            <if test="conditionParamRef.className == null">
+                ${_conditionType_} a.className is null
+            </if>
+        </if>
+        <if test="conditionParamRef.containsKey('classNameList') and conditionParamRef.classNameList.size() > 0">
+            ${_conditionType_} a.className in
+            <foreach collection="conditionParamRef.classNameList" open="(" close=")" index="index" item="item" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="conditionParamRef.containsKey('classNameNotList') and conditionParamRef.classNameNotList.size() > 0">
+            ${_conditionType_} a.className not in
+            <foreach collection="conditionParamRef.classNameNotList" open="(" close=")" index="index" item="item" separator=",">
+                #{item}
+            </foreach>
+        </if>
     </sql>
     <sql id="_orderCols_">
         <if test="orderColList != null and !orderColList.isEmpty()">
@@ -1117,16 +1117,6 @@
                     <if test='orderCol.attendanceGroupName != null and "DESC".equalsIgnoreCase(orderCol.attendanceGroupName)'>DESC</if>
                     ,
                 </if>
-                <if test="orderCol.containsKey('shiftsId')">
-                    a.shiftsId
-                    <if test='orderCol.shiftsId != null and "DESC".equalsIgnoreCase(orderCol.shiftsId)'>DESC</if>
-                    ,
-                </if>
-                <if test="orderCol.containsKey('shiftsName')">
-                    a.shiftsName
-                    <if test='orderCol.shiftsName != null and "DESC".equalsIgnoreCase(orderCol.shiftsName)'>DESC</if>
-                    ,
-                </if>
                 <if test="orderCol.containsKey('attendanceDate')">
                     a.attendanceDate
                     <if test='orderCol.attendanceDate != null and "DESC".equalsIgnoreCase(orderCol.attendanceDate)'>DESC</if>
@@ -1177,6 +1167,16 @@
                     <if test='orderCol.punchResult != null and "DESC".equalsIgnoreCase(orderCol.punchResult)'>DESC</if>
                     ,
                 </if>
+                <if test="orderCol.containsKey('classId')">
+                    a.classId
+                    <if test='orderCol.classId != null and "DESC".equalsIgnoreCase(orderCol.classId)'>DESC</if>
+                    ,
+                </if>
+                <if test="orderCol.containsKey('className')">
+                    a.className
+                    <if test='orderCol.className != null and "DESC".equalsIgnoreCase(orderCol.className)'>DESC</if>
+                    ,
+                </if>
             </trim>
         </if>
     </sql>
diff --git a/db/add.sql b/db/add.sql
index b379920d59ea4a658f013592d09fbdd77bd98932..c7e6e9f57f645848fb8aefcd63c70df37c33f730 100644
--- a/db/add.sql
+++ b/db/add.sql
@@ -821,3 +821,34 @@ ALTER TABLE mortals_xhx_check_other_record ADD COLUMN  `auditStatus` tinyint(1)
 
 
 ALTER TABLE mortals_xhx_perform_attend_appeal ADD COLUMN  `windowNum` varchar(255)  DEFAULT ''    COMMENT '绐楀彛缂栧彿';
+
+
+-- ----------------------------
+-- 鑰冨嫟鎵撳崱璁板綍淇℃伅琛�
+-- ----------------------------
+DROP TABLE IF EXISTS `mortals_xhx_attendance_record`;
+CREATE TABLE mortals_xhx_attendance_record(
+    `id` bigint(20)   AUTO_INCREMENT   COMMENT '搴忓彿锛屼富閿紝鑷闀�',
+    `staffId` bigint(20)      COMMENT '鍛樺伐ID',
+    `staffName` varchar(64) NOT NULL     COMMENT '鍛樺伐濮撳悕',
+    `workNum` varchar(128)      COMMENT '宸ュ彿',
+    `deptId` bigint(20)      COMMENT '鎵€灞為儴闂�',
+    `deptName` varchar(128)      COMMENT '鎵€灞為儴闂ㄥ悕绉�',
+    `positionId` bigint(20)      COMMENT '鑱屼綅ID',
+    `positionName` varchar(128)      COMMENT '鑱屼綅鍚嶇О',
+    `attendanceGroupId` bigint(20)      COMMENT '鎵€灞炶€冨嫟缁処D',
+    `attendanceGroupName` varchar(128)      COMMENT '鎵€灞炶€冨嫟缁勫悕绉�',
+    `attendanceDate` datetime      COMMENT '鎵撳崱鏃ユ湡',
+    `remark` varchar(255)      COMMENT '澶囨敞',
+    `createUserId` bigint(20) NOT NULL     COMMENT '鍒涘缓鐢ㄦ埛',
+    `createTime` datetime NOT NULL     COMMENT '鍒涘缓鏃堕棿',
+    `updateUserId` bigint(20)      COMMENT '鏇存柊鐢ㄦ埛',
+    `updateTime` datetime      COMMENT '鏇存柊鏃堕棿',
+    `signInResult` tinyint(2)    DEFAULT '0'  COMMENT '绛惧埌缁撴灉(0.鍚�,1.鏄�)',
+    `signOutResult` tinyint(2)    DEFAULT '0'  COMMENT '绛鹃€€缁撴灉(0.鍚�,1.鏄�)',
+    `attendType` varchar(128)    DEFAULT ''  COMMENT '鑰冨嫟绫诲瀷',
+    `punchResult` tinyint(2)    DEFAULT '0'  COMMENT '鎵撳崱缁撴灉(0.鍚�,1.鏄�)',
+    `classId` bigint(20)      COMMENT '鐝ID',
+    `className` varchar(128)      COMMENT '鐝鍚嶇О',
+PRIMARY KEY  (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='鑰冨嫟鎵撳崱璁板綍淇℃伅';
diff --git "a/doc/\350\200\203\345\213\244\347\273\251\346\225\210\347\256\241\347\220\206\347\263\273\347\273\237.docx" "b/doc/\350\200\203\345\213\244\347\273\251\346\225\210\347\256\241\347\220\206\347\263\273\347\273\237.docx"
index f21813340e5f395ce0707f44fe85d8638f65cd73..34a087d54c7e66a4ec8166a447f45d77346060fa 100644
Binary files "a/doc/\350\200\203\345\213\244\347\273\251\346\225\210\347\256\241\347\220\206\347\263\273\347\273\237.docx" and "b/doc/\350\200\203\345\213\244\347\273\251\346\225\210\347\256\241\347\220\206\347\263\273\347\273\237.docx" differ