diff --git a/attendance-performance-manager-ui/admin/src/views/attendance/record/hik/list.vue b/attendance-performance-manager-ui/admin/src/views/attendance/record/hik/list.vue
index f39465c8e9f0070483c8eed07d692be7817e8dcb..39b61a0d985e722e38d5356d7d27834eb91cb707 100644
--- a/attendance-performance-manager-ui/admin/src/views/attendance/record/hik/list.vue
+++ b/attendance-performance-manager-ui/admin/src/views/attendance/record/hik/list.vue
@@ -95,7 +95,7 @@
                         </div>
 
                         <div class="mt10">
-                            <el-link :href="baseUrl+item.filePath" target="_blank" type="primary">閲嶆柊涓嬭浇</el-link>
+                            <el-link :href="item.filePath" target="_blank" type="primary">閲嶆柊涓嬭浇</el-link>
                         </div>
                     </div>
                     <div class="times mt10">
diff --git a/attendance-performance-manager-ui/admin/src/views/staff/list.vue b/attendance-performance-manager-ui/admin/src/views/staff/list.vue
index 4fc7cda6afe10cbc52e36e891570ead3b7ecf382..c8439b384de23eeebae199cea49e9591d63856b1 100644
--- a/attendance-performance-manager-ui/admin/src/views/staff/list.vue
+++ b/attendance-performance-manager-ui/admin/src/views/staff/list.vue
@@ -78,7 +78,7 @@
               </el-button>
               <el-dropdown-menu slot="dropdown">
                 <el-dropdown-item>
-                  <el-button type="text">鍚屾鏁版嵁</el-button>
+                  <el-button type="text" @click="syncPerson">鍚屾鏁版嵁</el-button>
                 </el-dropdown-item>
                 <el-dropdown-item>
                   <el-button type="text" @click="handleImport"
@@ -219,6 +219,14 @@ export default {
       );
       this.isdialog = true;
     },
+    /** 鍚屾 */
+    syncPerson() {
+      this.$post("/staff/syncPersons", {}).then((res) => {
+        if (res.code == 1) {
+            this.$message.success(res.msg)
+        }
+      });
+    },
     /** 瀵煎叆 */
     handleImport() {
       this.upload.title = "鍛樺伐瀵煎叆";
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/login/web/LoginController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/login/web/LoginController.java
index 4ef4f02522c454496d90c0608427052bcf909747..59445d68a970b465dd395eb7f21274ab5c4a3e6e 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/login/web/LoginController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/login/web/LoginController.java
@@ -1,5 +1,6 @@
 package com.mortals.xhx.base.login.web;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.IdUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.mortals.framework.ap.CookieService;
@@ -20,8 +21,16 @@ import com.mortals.xhx.base.system.resource.service.ResourceService;
 import com.mortals.xhx.base.system.user.model.UserEntity;
 import com.mortals.xhx.base.system.user.service.UserService;
 import com.mortals.xhx.base.system.valid.service.ValidCodeService;
+import com.mortals.xhx.common.code.GoWorkResultEnum;
+import com.mortals.xhx.common.code.OffWorkResultEnum;
 import com.mortals.xhx.common.key.RedisKey;
 import com.mortals.xhx.common.pdu.HomeStatInfo;
+import com.mortals.xhx.module.attendance.model.AttendanceRecordEntity;
+import com.mortals.xhx.module.attendance.model.AttendanceRecordQuery;
+import com.mortals.xhx.module.attendance.model.AttendanceVacationBalanceQuery;
+import com.mortals.xhx.module.attendance.model.AttendanceVacationRecordQuery;
+import com.mortals.xhx.module.attendance.service.AttendanceRecordService;
+import com.mortals.xhx.module.attendance.service.AttendanceVacationRecordService;
 import com.mortals.xhx.module.dept.model.DeptQuery;
 import com.mortals.xhx.module.dept.service.DeptService;
 import com.mortals.xhx.module.staff.model.StaffQuery;
@@ -61,6 +70,10 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
     private ICacheService cacheService;
     @Autowired
     private IAuthTokenService authTokenService;
+    @Autowired
+    private AttendanceRecordService recordService;
+    @Autowired
+    private AttendanceVacationRecordService vacationRecordService;
 
     @Autowired
     private StaffService staffService;
@@ -157,13 +170,54 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
         int totalDeptNum = deptService.count(new DeptQuery(), getContext());
         homeStatInfo.setTotalDeptNum(totalDeptNum);
 
-        //todo
-        homeStatInfo.setAttendRadio(new BigDecimal(98.00));
-        homeStatInfo.setLevealPersonNum(6);
-        homeStatInfo.setLatePersonNum(2);
-        homeStatInfo.setLeftEarlyPersonNum(1);
-        homeStatInfo.setMissCardPersonNum(23);
-        homeStatInfo.setAttendPersonNum(426);
+
+        AttendanceRecordQuery attendanceRecordQuery = new AttendanceRecordQuery();
+        attendanceRecordQuery.setAttendanceDateStart(DateUtil.today());
+        attendanceRecordQuery.setAttendanceDateEnd(DateUtil.today());
+        List<AttendanceRecordEntity> attendanceRecordEntities = recordService.find(attendanceRecordQuery);
+        //鎬绘墦鍗�
+        long total = attendanceRecordEntities.parallelStream().map(item -> item.getStaffId()).distinct().count();
+
+        //杩熷埌娆℃暟
+        long beLate = attendanceRecordEntities.parallelStream()
+                .flatMap(item -> item.getAttendanceRecordDetailList().stream())
+                .filter(f -> GoWorkResultEnum.杩熷埌.getValue() == f.getGoWorkResult() || OffWorkResultEnum.杩熷埌.getValue() == f.getOffWorkResult())
+                .count();
+
+        //鏃╅€€娆℃暟
+        long leaveEarly = attendanceRecordEntities.parallelStream()
+                .flatMap(item -> item.getAttendanceRecordDetailList().stream())
+                .filter(f -> GoWorkResultEnum.鏃╅€€.getValue() == f.getGoWorkResult() || OffWorkResultEnum.鏃╅€€.getValue() == f.getOffWorkResult())
+                .count();
+
+        //缂哄崱娆℃暟
+        long lackOfCards = attendanceRecordEntities.parallelStream()
+                .flatMap(item -> item.getAttendanceRecordDetailList().stream())
+                .filter(f -> GoWorkResultEnum.缂哄崱.getValue() == f.getGoWorkResult() || OffWorkResultEnum.缂哄崱.getValue() == f.getOffWorkResult())
+                .count();
+
+
+        AttendanceVacationRecordQuery vacationRecordQuery = new AttendanceVacationRecordQuery();
+        vacationRecordQuery.setCreateTimeStart(DateUtil.today());
+        vacationRecordQuery.setCreateTimeEnd(DateUtil.today());
+        int levealPersonNum = vacationRecordService.count(vacationRecordQuery, getContext());
+
+        //鏈€冨嫟
+        long noAtt=lackOfCards;
+        long att = total - noAtt;
+
+        if (att!=0L){
+            BigDecimal bigDecimal = new BigDecimal(att).divide(new BigDecimal(total)).multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_CEILING);
+            homeStatInfo.setAttendRadio(bigDecimal.toString()+"%");
+        }else{
+            homeStatInfo.setAttendRadio("0%");
+        }
+
+        homeStatInfo.setLevealPersonNum(levealPersonNum);
+        homeStatInfo.setLatePersonNum(beLate);
+        homeStatInfo.setLeftEarlyPersonNum(leaveEarly);
+        homeStatInfo.setMissCardPersonNum(lackOfCards);
+        homeStatInfo.setAttendPersonNum(total);
 
         data.put("homeStat", homeStatInfo);
         data.put("token", token);
@@ -179,29 +233,6 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
         return ret.toJSONString();
     }
 
-    private void generateBlackCookie(HttpServletRequest request, HttpServletResponse response, String loginName, Set<String> urls) {
-        try {
-            String cacheKey = RedisKey.KEY_MENU_CACHE + loginName;
-            String securityKey = GlobalSysInfo.getPropertyValue(SysConstains.PROP_COOKIE_SECURITY_KEY);
-            //搴斾负Cookie浼氳秴闀匡紝鎵€浠ユ敼涓轰粎瀛樺偍key灏嗗€兼斁鍏edis
-            //CookieService.setCookieForAuth(request, response, securityKey, null);
-            StringBuilder sb = new StringBuilder();
-            if (urls != null && urls.size() > 0) {
-                for (String url : urls) {
-                    int index = url.hashCode() & (Integer.MAX_VALUE - 1);
-                    sb.append(index).append(",");
-                }
-            }
-            String menuUrl = sb.toString();
-            menuUrl = AESUtil.encrypt(menuUrl, securityKey);
-            cacheService.set(cacheKey, menuUrl, 604800);
-            HttpUtil.setCookieValue(request, response, SysConstains.COOKIE_MENU, cacheKey, -1);
-
-        } catch (Throwable e) {
-
-        }
-    }
-
 
     private String generateMenuUrlCode(Set<String> urls) {
         try {
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/ApiWebPerformController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/ApiWebPerformController.java
index 6d58c4fb83f43c05683a2dc9b4be7707b8d9e55b..a9dff195df6af39a0ee2588e1bdec676e48961c8 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/ApiWebPerformController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/ApiWebPerformController.java
@@ -1,6 +1,7 @@
 package com.mortals.xhx.busiz.h5.web;
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.mortals.framework.annotation.UnAuth;
@@ -23,6 +24,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Date;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 @RestController
 @Slf4j
@@ -47,6 +51,10 @@ public class ApiWebPerformController extends AbstractBaseController<PerformReq>
     private StaffService staffService;
     @Autowired
     private PerformRulesCategoryService categoryService;
+    @Autowired
+    private PerformStaffConfService performStaffConfService;
+    @Autowired
+    private PerformStaffConfDetailService performStaffConfDetailService;
 
 
     /**
@@ -206,7 +214,7 @@ public class ApiWebPerformController extends AbstractBaseController<PerformReq>
         //閫氳繃鎵嬫満鍙风爜鏌ヨ鍛樺伐灞炴€�
         PerformRulesEntity rule = getRule(req.getRuleCode());
         StaffEntity staffEntity = getStaff(req.getPhone());
-
+        checkStaffAutoConf(staffEntity, rule);
         PerformAttendRecordEntity recordEntity = new PerformAttendRecordEntity();
         recordEntity.initAttrValue();
         recordEntity.setSubMethod(SubMethodEnum.绯荤粺鑷姩.getValue());
@@ -242,9 +250,8 @@ public class ApiWebPerformController extends AbstractBaseController<PerformReq>
         //璇勪环淇濆瓨
         StaffEntity staffEntity = getStaff(req.getPhone());
         PerformRulesEntity rule = getRule(req.getRuleCode());
-
+        checkStaffAutoConf(staffEntity, rule);
         PerformReviewRecordEntity recordEntity = new PerformReviewRecordEntity();
-
         recordEntity.initAttrValue();
         recordEntity.setSubMethod(SubMethodEnum.绯荤粺鑷姩.getValue());
         BeanUtils.copyProperties(req, recordEntity);
@@ -272,10 +279,33 @@ public class ApiWebPerformController extends AbstractBaseController<PerformReq>
 
     }
 
+    private void checkStaffAutoConf(StaffEntity staffEntity, PerformRulesEntity rule) {
+        Boolean rulePass = false;
+        //鏍¢獙褰撳墠鍛樺伐鏄惁瀛樺湪鑷姩瑙勫垯涓�
+        List<PerformStaffConfEntity> performStaffConfEntities = performStaffConfService.find(new PerformStaffConfQuery());
+        for (PerformStaffConfEntity performStaffConfEntity : performStaffConfEntities) {
+            String staffIds = performStaffConfEntity.getStaffIds();
+            Set<String> split = StrUtil.split(staffIds, ",").stream().collect(Collectors.toSet());
+            if (split.contains(staffEntity.getId().toString())) {
+                //鏌ヨ褰撳墠瑙勫垯
+                List<PerformStaffConfDetailEntity> staffConfDetailEntities = performStaffConfDetailService.find(new PerformStaffConfDetailQuery().staffConfId(performStaffConfEntity.getId()));
+                for (PerformStaffConfDetailEntity staffConfDetailEntity : staffConfDetailEntities) {
+                    if (staffConfDetailEntity.getRuleId() == rule.getId()){
+                        rulePass = true;
+                        break;
+                    }
+                }
+            }
+            if (rulePass) break;
+        }
+        if(rulePass) throw new AppException("褰撳墠鐢ㄦ埛涓庣哗鏁堣鍒欐湭閰嶇疆鑷姩鏍告煡锛岃鍦ㄥ悗鍙伴厤缃悗鍐嶆柊澧烇紒");
+    }
+
     private boolean complain(ComplainSaveReq req) throws AppException {
         //鎶曡瘔淇濆瓨
         StaffEntity staffEntity = getStaff(req.getPhone());
         PerformRulesEntity rule = getRule(req.getRuleCode());
+        checkStaffAutoConf(staffEntity, rule);
         PerformComplainRecordEntity recordEntity = new PerformComplainRecordEntity();
         recordEntity.initAttrValue();
         recordEntity.setSubMethod(SubMethodEnum.绯荤粺鑷姩.getValue());
@@ -307,6 +337,7 @@ public class ApiWebPerformController extends AbstractBaseController<PerformReq>
         //鍔炰欢淇濆瓨
         StaffEntity staffEntity = getStaff(req.getPhone());
         PerformRulesEntity rule = getRule(req.getRuleCode());
+        checkStaffAutoConf(staffEntity, rule);
         PerformGoworkRecordEntity recordEntity = new PerformGoworkRecordEntity();
         recordEntity.initAttrValue();
         recordEntity.setSubMethod(SubMethodEnum.绯荤粺鑷姩.getValue());
@@ -339,7 +370,7 @@ public class ApiWebPerformController extends AbstractBaseController<PerformReq>
         //鏁堣兘淇濆瓨
         StaffEntity staffEntity = getStaff(req.getPhone());
         PerformRulesEntity rule = getRule(req.getRuleCode());
-
+        checkStaffAutoConf(staffEntity, rule);
         PerformEffectRecordEntity recordEntity = new PerformEffectRecordEntity();
         recordEntity.initAttrValue();
         recordEntity.setSubMethod(SubMethodEnum.绯荤粺鑷姩.getValue());
@@ -372,6 +403,7 @@ public class ApiWebPerformController extends AbstractBaseController<PerformReq>
         //鍏跺畠淇濆瓨
         StaffEntity staffEntity = getStaff(req.getPhone());
         PerformRulesEntity rule = getRule(req.getRuleCode());
+        checkStaffAutoConf(staffEntity, rule);
         PerformOtherRecordEntity recordEntity = new PerformOtherRecordEntity();
         recordEntity.initAttrValue();
         recordEntity.setSubMethod(SubMethodEnum.绯荤粺鑷姩.getValue());
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/AppealApiController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/AppealApiController.java
index 0c8d6bb88d6067f56224dbbddaf19baa20966266..a11ddcf0910068c6041fb0ab6053fe5fd3c1e259 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/AppealApiController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/AppealApiController.java
@@ -14,13 +14,18 @@ import com.mortals.framework.model.Result;
 import com.mortals.xhx.busiz.h5.req.AppealReq;
 import com.mortals.xhx.busiz.h5.req.PerformReq;
 import com.mortals.xhx.busiz.h5.rsp.AppealStatInfo;
+import com.mortals.xhx.busiz.h5.rsp.PerformStatInfo;
 import com.mortals.xhx.common.code.*;
 import com.mortals.xhx.common.utils.BeanUtil;
+import com.mortals.xhx.module.check.dao.CheckAllRecordDao;
 import com.mortals.xhx.module.check.model.*;
 import com.mortals.xhx.module.check.service.*;
 import com.mortals.xhx.module.perform.model.PerformAttendAppealEntity;
 import com.mortals.xhx.module.perform.model.PerformAttendAppealQuery;
 import com.mortals.xhx.module.perform.service.PerformAttendAppealService;
+import com.mortals.xhx.module.staff.model.StaffPerformStatEntity;
+import com.mortals.xhx.module.staff.model.StaffPerformStatQuery;
+import com.mortals.xhx.module.staff.service.StaffPerformStatService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -30,10 +35,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 import static com.mortals.framework.ap.SysConstains.*;
 import static com.mortals.xhx.common.key.ErrorCode.ERROR_TOKEN_EXPIRED;
@@ -62,7 +64,10 @@ public class AppealApiController extends AbstractBaseController<PerformReq> {
     private CheckGoworkRecordService checkGoworkRecordService;
     @Autowired
     private CheckOtherRecordService checkOtherRecordService;
-
+    @Autowired
+    private CheckAllRecordDao checkAllRecordDao;
+    @Autowired
+    private StaffPerformStatService staffPerformStatService;
 
     @Autowired
     private PerformAttendAppealService appealService;
@@ -89,13 +94,44 @@ public class AppealApiController extends AbstractBaseController<PerformReq> {
         }
         log.info("銆恵}銆戙€愯姹備綋銆�--> 鐢ㄦ埛:{}", busiDesc, context.getUser().getRealName());
         try {
-            //todo 鏌ヨ褰撳墠鐧诲綍浜虹殑缁╂晥鍒嗘暟
+
+            CheckAllRecordQuery checkAllRecordQuery = new CheckAllRecordQuery();
+            checkAllRecordQuery.setSubAddType(SubAddTypeEnum.鎵i櫎.getValue());
+            checkAllRecordQuery.setStaffId(context.getUser().getCustomerId());
+            int totalTimes = checkAllRecordDao.getCount(checkAllRecordQuery);
+
+            checkAllRecordQuery.setCheckTimeStart(DateUtil.today());
+            checkAllRecordQuery.setCheckTimeEnd(DateUtil.today());
+            int todayTimes = checkAllRecordDao.getCount(checkAllRecordQuery);
+
+            StaffPerformStatQuery staffPerformStatQuery = new StaffPerformStatQuery();
+            staffPerformStatQuery.setStaffId(context.getUser().getCustomerId());
+            staffPerformStatQuery.setYear(DateUtil.year(new Date()));
+            staffPerformStatQuery.setMonth(DateUtil.month(new Date()) + 1);
+
+            List<StaffPerformStatEntity> staffPerformStatEntities = staffPerformStatService.find(staffPerformStatQuery);
+            BigDecimal totalScore = new BigDecimal(0.0);
+            if (ObjectUtils.isEmpty(staffPerformStatEntities)) {
+                totalScore = staffPerformStatEntities.stream().map(item -> item.getTotalSubScore()).reduce(BigDecimal.ZERO, BigDecimal::add);
+            }
+
+            staffPerformStatQuery.setDay(DateUtil.dayOfMonth(new Date()));
+            //浠婃棩寰楀垎
+            StaffPerformStatEntity staffPerformStatEntity = staffPerformStatService.selectOne(staffPerformStatQuery);
+
+            BigDecimal todayScore = new BigDecimal(0.0);
+            if (!ObjectUtils.isEmpty(staffPerformStatEntity)) {
+                todayScore = staffPerformStatEntity.getTotalSubScore();
+            }
+
             AppealStatInfo appealStatInfo = new AppealStatInfo();
-            appealStatInfo.setTotalScore(new BigDecimal("10.52").setScale(1,BigDecimal.ROUND_HALF_UP));
-            appealStatInfo.setTotalTimes(12);
-            appealStatInfo.setTodayScore(new BigDecimal("2.5").setScale(1,BigDecimal.ROUND_HALF_UP));
-            appealStatInfo.setTodayTimes(3);
+            appealStatInfo.setTotalScore(totalScore.setScale(1, BigDecimal.ROUND_HALF_UP));
+            appealStatInfo.setTotalTimes(totalTimes);
+            appealStatInfo.setTodayScore(todayScore.setScale(1, BigDecimal.ROUND_HALF_UP));
+            appealStatInfo.setTodayTimes(todayTimes);
             rest.setData(appealStatInfo);
+
+
             recordSysLog(request, busiDesc + " 銆愭垚鍔熴€�");
         } catch (Exception e) {
             log.error(busiDesc, e);
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/InspectApiController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/InspectApiController.java
index 5ee57925a01e083abf2a5d6292dfbf7bd62dbdd4..154637ca99e824d1f04f525cf9bd7fca36619470 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/InspectApiController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/InspectApiController.java
@@ -16,6 +16,11 @@ import com.mortals.xhx.busiz.h5.rsp.PerformDetailInfo;
 import com.mortals.xhx.busiz.h5.rsp.PerformInfo;
 import com.mortals.xhx.common.code.*;
 import com.mortals.xhx.common.utils.BeanUtil;
+import com.mortals.xhx.module.attendance.model.*;
+import com.mortals.xhx.module.attendance.service.AttendanceClassDetailService;
+import com.mortals.xhx.module.attendance.service.AttendanceClassService;
+import com.mortals.xhx.module.attendance.service.AttendanceGroupFixedworkService;
+import com.mortals.xhx.module.attendance.service.AttendanceGroupService;
 import com.mortals.xhx.module.check.dao.CheckAllRecordDao;
 import com.mortals.xhx.module.check.model.*;
 import com.mortals.xhx.module.check.model.vo.CheckAllRecordVo;
@@ -68,11 +73,8 @@ public class InspectApiController extends AbstractBaseController<PerformReq> {
     private PerformRulesService rulesService;
     @Autowired
     private StaffService staffService;
-
     @Autowired
     private CheckAllRecordService checkAllRecordService;
-
-
     @Autowired
     private CheckAttendRecordService checkAttendRecordService;
     @Autowired
@@ -85,10 +87,16 @@ public class InspectApiController extends AbstractBaseController<PerformReq> {
     private CheckGoworkRecordService checkGoworkRecordService;
     @Autowired
     private CheckOtherRecordService checkOtherRecordService;
-
     @Autowired
     private CheckAllRecordDao checkAllRecordDao;
-
+    @Autowired
+    private AttendanceGroupService groupService;
+    @Autowired
+    private AttendanceClassService classService;
+    @Autowired
+    private AttendanceClassDetailService classDetailService;
+    @Autowired
+    private AttendanceGroupFixedworkService fixedworkService;
 
     protected void init(Map<String, Object> model, Context context) {
         this.addDict(model, "checkStatus", CheckStatusEnum.getEnumMap());
@@ -97,6 +105,8 @@ public class InspectApiController extends AbstractBaseController<PerformReq> {
         this.addDict(model, "subAddType", SubAddTypeEnum.getEnumMap());
         this.addDict(model, "checkType", CheckTypeEnum.getEnumMap());
         this.addDict(model, "reviewResult", ReviewResultEnum.getEnumMap());
+        this.addDict(model, "irregularOtherType", IrregularOtherTypeEnum.getEnumMap());
+
     }
 
     /**
@@ -314,6 +324,8 @@ public class InspectApiController extends AbstractBaseController<PerformReq> {
         recordEntity.setSubMethod(SubMethodEnum.澶у巺宸℃煡.getValue());
         recordEntity.setErrorTime(new Date());
 
+        //鏍规嵁鑰冨嫟缁勬煡璇� 涓婁笅鐝�
+        buildGoOffWork(req, context, recordEntity);
 
         recordEntity.setCreateUserId(context.getUser().getId());
         recordEntity.setCreateTime(new Date());
@@ -323,6 +335,86 @@ public class InspectApiController extends AbstractBaseController<PerformReq> {
 
     }
 
+    private void buildGoOffWork(InspectSaveReq req, Context context, PerformAttendRecordEntity recordEntity) {
+        if(!ObjectUtils.isEmpty(req.getAttendanceGroupId())&&!ObjectUtils.isEmpty(req.getAttendanceDate())){
+            AttendanceGroupEntity attendanceGroupEntity = groupService.get(req.getAttendanceGroupId(), context);
+            if (!ObjectUtils.isEmpty(attendanceGroupEntity)) {
+                //鍒ゆ柇涓婁笅鐝椂闂�
+                if (TypeEnum.鍥哄畾鐝埗.getValue() == attendanceGroupEntity.getType()) {
+                    AttendanceGroupFixedworkEntity fixedworkEntity = fixedworkService.selectOne(new AttendanceGroupFixedworkQuery().groupId(attendanceGroupEntity.getId()));
+                    if (!ObjectUtils.isEmpty(fixedworkEntity)) {
+                        //鏌ョ湅褰撳墠鏃堕棿鏄槦鏈熷嚑
+                        int dayOfWeek = DateUtil.dayOfWeek(req.getAttendanceDate());
+                        switch (dayOfWeek) {
+                            case 1:
+                                String goOffWorkStr = getGoOffWorkStr(fixedworkEntity.getSundayClassId());
+                                recordEntity.setGoOffTimeStr(goOffWorkStr);
+                                break;
+                            case 2:
+                                goOffWorkStr = getGoOffWorkStr(fixedworkEntity.getMondayClassId());
+                                recordEntity.setGoOffTimeStr(goOffWorkStr);
+                                break;
+                            case 3:
+                                goOffWorkStr = getGoOffWorkStr(fixedworkEntity.getTuesdayClassId());
+                                recordEntity.setGoOffTimeStr(goOffWorkStr);
+                                break;
+                            case 4:
+                                goOffWorkStr = getGoOffWorkStr(fixedworkEntity.getWednesdayClassId());
+                                recordEntity.setGoOffTimeStr(goOffWorkStr);
+                                break;
+                            case 5:
+                                goOffWorkStr = getGoOffWorkStr(fixedworkEntity.getTuesdayClassId());
+                                recordEntity.setGoOffTimeStr(goOffWorkStr);
+                                break;
+                            case 6:
+                                goOffWorkStr = getGoOffWorkStr(fixedworkEntity.getFridayClassId());
+                                recordEntity.setGoOffTimeStr(goOffWorkStr);
+                                break;
+                            case 7:
+                                goOffWorkStr = getGoOffWorkStr(fixedworkEntity.getSundayClassId());
+                                recordEntity.setGoOffTimeStr(goOffWorkStr);
+                                break;
+                            default:
+                                recordEntity.setGoOffTimeStr("");
+                        }
+                    }
+                }
+                else if (TypeEnum.鑷敱宸ユ椂.getValue() == attendanceGroupEntity.getType()) {
+
+                } else if (TypeEnum.鎺掔彮鍒�.getValue() == attendanceGroupEntity.getType()) {
+
+                } else {
+
+                }
+            }
+        }
+    }
+
+
+    private String getGoOffWorkStr(Long sundayClassId) {
+        if (ObjectUtils.isEmpty(sundayClassId)) return "";
+
+        StringBuilder goOffWorkSb = new StringBuilder();
+        List<AttendanceClassDetailEntity> classDetailEntities = classDetailService.find(new AttendanceClassDetailQuery().classId(sundayClassId));
+        if (!ObjectUtils.isEmpty(classDetailEntities)) {
+            for (AttendanceClassDetailEntity classDetailEntity : classDetailEntities) {
+                String goWorkStr = "";
+                String offWorkStr = "";
+                if (!ObjectUtils.isEmpty(classDetailEntity.getGoWorkDate())) {
+                    goWorkStr = DateUtil.format(classDetailEntity.getGoWorkDate(),"HH:mm");
+                }
+                if (!ObjectUtils.isEmpty(classDetailEntity.getOffWorkDate())) {
+                    offWorkStr = DateUtil.format(classDetailEntity.getOffWorkDate(),"HH:mm");
+                }
+                goOffWorkSb.append(goWorkStr);
+                goOffWorkSb.append("~");
+                goOffWorkSb.append(offWorkStr);
+                goOffWorkSb.append(" \n");
+            }
+        }
+        return goOffWorkSb.toString();
+    }
+
 
     private boolean review(InspectSaveReq req, Context context) throws AppException {
         //璇勪环淇濆瓨
@@ -470,6 +562,7 @@ public class InspectApiController extends AbstractBaseController<PerformReq> {
         StaffEntity custStaff = getStaff(context.getUser().getCustomerId().toString());
         recordEntity.setDeductPerson(custStaff==null?"绯荤粺绠$悊鍛�":custStaff.getName());
 
+
         recordEntity.setDeptId(staffEntity.getDeptId());
         recordEntity.setDeptName(staffEntity.getDeptName());
         recordEntity.setSubAddType(rule.getSubAddType());
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/PerformApiController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/PerformApiController.java
index d2b8ea0d72ffaac90a79888a3b0750ed813c9111..de8e5cc0925bec23668fff38a0a91bf96ccfbbbd 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/PerformApiController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/busiz/h5/web/PerformApiController.java
@@ -401,7 +401,6 @@ public class PerformApiController extends AbstractBaseController<PerformReq> {
             }
 
             PerformAttendAppealEntity entity = appealService.selectOne(new PerformAttendAppealQuery().checkRecordId(performDetailInfo.getId()).performType(performReq.getPerformType()));
-
             log.info("entity:{}", JSONObject.toJSONString(entity));
 
             if (!ObjectUtils.isEmpty(entity)) {
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/common/code/AppealResultEnum.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/common/code/AppealResultEnum.java
index 0d63735889dc26321a1eafd94c2bd0bb7a7827aa..d175d006724e5b13cbec0fe532f06ac49894323e 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/common/code/AppealResultEnum.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/common/code/AppealResultEnum.java
@@ -9,6 +9,7 @@ import java.util.Map;
 * @author zxfei
 */
 public enum AppealResultEnum {
+    鐢宠瘔涓�(0, "鐢宠瘔涓�"),
     閫氳繃(1, "閫氳繃"),
     涓嶉€氳繃(2, "涓嶉€氳繃");
     private Integer value;
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/common/pdu/HomeStatInfo.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/common/pdu/HomeStatInfo.java
index 590b36f9b3f100ee8798cd9f1100cbe8098e66d7..be5659bbea59337b2aa6682904c56853924b4ed4 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/common/pdu/HomeStatInfo.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/common/pdu/HomeStatInfo.java
@@ -17,25 +17,25 @@ public class HomeStatInfo {
 
     private Integer totalDeptNum;
 
-    private Integer attendPersonNum;
+    private Long attendPersonNum=0L;
 
-    private BigDecimal attendRadio;
+    private String attendRadio;
     /**
      * 璇峰亣浜烘暟
      */
-    private Integer levealPersonNum;
+    private Integer levealPersonNum=0;
     /**
      * 杩熷埌浜烘暟
      */
-    private Integer latePersonNum;
+    private Long latePersonNum=0L;
     /**
      * 鏃╅€€浜烘暟
      */
-    private Integer leftEarlyPersonNum;
+    private Long leftEarlyPersonNum=0L;
     /**
      * 缂哄崱浜烘暟
      */
-    private Integer missCardPersonNum;
+    private Long missCardPersonNum=0L;
 
 
 }
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/daemon/task/SyncUserTaskImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/daemon/task/SyncUserTaskImpl.java
index 98c3497bd1be31bd062b29f1726740c021351e6a..d32f1ffde255613693934bb3a90f14efcabffbeb 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/daemon/task/SyncUserTaskImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/daemon/task/SyncUserTaskImpl.java
@@ -74,8 +74,6 @@ public class SyncUserTaskImpl implements ITaskExcuteService {
             for (PersonInfo personInfo : personInfoList) {
                 StaffEntity staffEntity = staffService.getExtCache(StrUtil.padPre(personInfo.getJobNo(), 8, "0"));
                 DeptEntity deptEntity = deptService.selectOne(new DeptQuery().deptCode(personInfo.getOrgIndexCode()));
-                // AttendanceVacationBalanceEntity balanceEntity = balanceService.selectOne(new AttendanceVacationBalanceQuery().staffId(staffEntity.getId()));
-                //  AttendanceStatEntity statEntity = attendanceStatService.selectOne(new AttendanceStatQuery().staffId(staffEntity.getId()));
                 //鍒ゆ柇鏈湴鏁版嵁鏄惁涓虹┖
                 if (ObjectUtils.isEmpty(staffEntity)) {
                     //鏂板鍛樺伐淇℃伅
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/AttendanceStatEntity.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/AttendanceStatEntity.java
index 5da417ebac985c1d5e47084f604c297149e2f9f3..f62694a66933fad29e829c720f177b94687976d3 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/AttendanceStatEntity.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/AttendanceStatEntity.java
@@ -255,11 +255,11 @@ public class AttendanceStatEntity extends AttendanceStatVo {
 
         this.windowCategory = "";
 
-        this.staffId = -1L;
+        this.staffId = null;
 
         this.staffName = "";
 
-        this.deptId = -1L;
+        this.deptId = null;
 
         this.deptName = "";
 
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/vo/AttendanceRecordVo.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/vo/AttendanceRecordVo.java
index 10e2f74038bbf12998637ec678f01a26dead4481..1a2e812f14c24ca410d27b98947084a979198680 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/vo/AttendanceRecordVo.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/vo/AttendanceRecordVo.java
@@ -54,5 +54,8 @@ public class AttendanceRecordVo extends BaseEntityLong {
      * 瀵煎嚭鍙傛暟閰嶇疆
      */
     private  List<String> properties;
+
+
+    private List<Long> idList;
 }
 
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceExportRecordController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceExportRecordController.java
index d377a433210a89705b8c60524b59717505c12b51..2ded8a966e1e68c6e023ed2493a0e2988f607f66 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceExportRecordController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceExportRecordController.java
@@ -50,13 +50,4 @@ public class AttendanceExportRecordController extends BaseCRUDJsonBodyMappingCon
         super.init(model, context);
     }
 
-    @Override
-    protected void doListBefore(AttendanceExportRecordEntity query, Map<String, Object> model, Context context) throws AppException {
-        if (ObjectUtils.isEmpty(query.getOrderColList())) {
-            query.setOrderColList(Arrays.asList(new OrderCol("createTime", OrderCol.DESCENDING),new OrderCol("staffName", OrderCol.DESCENDING)));
-        } else {
-            query.getOrderColList().add(new OrderCol("createTime", OrderCol.DESCENDING));
-        }
-
-    }
 }
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 71fb353ca7fd5d6fa1b0edcb547409d1b262cc3b..3632b3626148cc31178b370142aaf1a9764e0d9a 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
@@ -4,8 +4,10 @@ import com.alibaba.fastjson.JSONObject;
 import com.mortals.framework.common.Rest;
 import com.mortals.framework.exception.AppException;
 import com.mortals.framework.model.OrderCol;
+import com.mortals.framework.utils.ServletUtils;
 import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
 import com.mortals.xhx.base.system.param.service.ParamService;
+import com.mortals.xhx.base.system.upload.service.UploadService;
 import com.mortals.xhx.common.code.GoWorkResultEnum;
 import com.mortals.xhx.common.code.NormalEnum;
 import com.mortals.xhx.common.code.OffWorkResultEnum;
@@ -13,7 +15,9 @@ import com.mortals.xhx.common.code.YesNoEnum;
 import com.mortals.xhx.module.attendance.model.*;
 import com.mortals.xhx.module.attendance.model.vo.AttendStatInfo;
 import com.mortals.xhx.module.attendance.service.AttendanceClassService;
+import com.mortals.xhx.module.attendance.service.AttendanceExportRecordService;
 import com.mortals.xhx.module.attendance.service.AttendanceGroupService;
+import com.mortals.xhx.module.dept.model.DeptEntity;
 import com.mortals.xhx.module.dept.model.DeptQuery;
 import com.mortals.xhx.module.dept.service.DeptService;
 import com.mortals.xhx.module.perform.model.PerformAttendAppealEntity;
@@ -30,7 +34,10 @@ import org.springframework.web.bind.annotation.RestController;
 import com.mortals.framework.model.Context;
 
 import com.mortals.xhx.module.attendance.service.AttendanceRecordService;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -46,6 +53,8 @@ public class AttendanceRecordController extends BaseCRUDJsonBodyMappingControlle
 
     @Autowired
     private ParamService paramService;
+    @Autowired
+    private UploadService uploadService;
 
     @Autowired
     private AttendanceGroupService attendanceGroupService;
@@ -57,6 +66,12 @@ public class AttendanceRecordController extends BaseCRUDJsonBodyMappingControlle
     private AttendanceClassService attendanceClassService;
     @Autowired
     private StaffService staffService;
+    @Autowired
+    private AttendanceExportRecordService attendanceExportRecordService;
+    @Autowired
+    private AttendanceGroupService groupService;
+    @Autowired
+    private AttendanceClassService classService;
 
     public AttendanceRecordController() {
         super.setModuleDesc("鑰冨嫟鎵撳崱璁板綍淇℃伅");
@@ -82,40 +97,78 @@ public class AttendanceRecordController extends BaseCRUDJsonBodyMappingControlle
 
         for (AttendanceRecordEntity recordEntity : list) {
             List<AttendanceRecordDetailEntity> attendanceRecordDetailList = recordEntity.getAttendanceRecordDetailList();
-            if(!ObjectUtils.isEmpty(attendanceRecordDetailList)){
+            if (!ObjectUtils.isEmpty(attendanceRecordDetailList)) {
                 for (AttendanceRecordDetailEntity detailEntity : attendanceRecordDetailList) {
                     AttendanceRecordEntity attendanceRecord = new AttendanceRecordEntity();
                     attendanceRecord.initAttrValue();
-                    BeanUtils.copyProperties(recordEntity,attendanceRecord);
+                    BeanUtils.copyProperties(recordEntity, attendanceRecord);
                     attendanceRecord.setAttendanceRecordDetailEntity(detailEntity);
                     attendanceRecordEntities.add(attendanceRecord);
                 }
-            }else {
+            } else {
                 AttendanceRecordEntity attendanceRecord = new AttendanceRecordEntity();
                 attendanceRecord.initAttrValue();
-                BeanUtils.copyProperties(recordEntity,attendanceRecord);
+                BeanUtils.copyProperties(recordEntity, attendanceRecord);
                 attendanceRecordEntities.add(attendanceRecord);
             }
         }
 
-        if(!ObjectUtils.isEmpty(attendanceRecordEntities)){
+        if (!ObjectUtils.isEmpty(attendanceRecordEntities)) {
             list.clear();
             list.addAll(attendanceRecordEntities);
         }
     }
 
 
+    @Override
+    public void doExportFileAfter(byte[] data, AttendanceRecordEntity query, Context context) throws AppException {
+        InputStream inputStream = new ByteArrayInputStream(data);
+        MultipartFile file = ServletUtils.getMultipartFile(inputStream, "kaoqin.xlsx");
+        String filePath = uploadService.saveFileUpload(file, "file/fileupload", null);
+        AttendanceExportRecordEntity attendanceExportRecordEntity = new AttendanceExportRecordEntity();
+        attendanceExportRecordEntity.initAttrValue();
+        attendanceExportRecordEntity.setFilePath(filePath);
+        if (query.getIdList() != null) {
+            List<Long> idList = query.getIdList();
+            attendanceExportRecordEntity.setRecordIdList(idList.stream().map(i->i.toString()).collect(Collectors.joining(",")));
+        }
+        if (query.getAttendanceDateStart() != null) {
+            String attendanceDate = query.getAttendanceDateStart() + "~" + query.getAttendanceDateEnd();
+            attendanceExportRecordEntity.setAttendanceDate(attendanceDate);
+        }
+        if(!ObjectUtils.isEmpty(query.getAttendanceGroupId())){
+            AttendanceGroupEntity attendanceGroupEntity = groupService.get(query.getAttendanceGroupId());
+            attendanceExportRecordEntity.setGroupName(attendanceGroupEntity==null?"":attendanceGroupEntity.getGroupName());
+        }
+
+        if(!ObjectUtils.isEmpty(query.getDeptId())){
+            DeptEntity deptEntity = deptService.get(query.getDeptId(), context);
+            attendanceExportRecordEntity.setDeptName(deptEntity==null?"":deptEntity.getDeptName());
+        }
+
+        if(!ObjectUtils.isEmpty(query.getShiftsId())){
+            AttendanceClassEntity attendanceClassEntity = classService.get(query.getShiftsId(), context);
+            attendanceExportRecordEntity.setClassName(attendanceClassEntity==null?"":attendanceClassEntity.getClassName());
+        }
+        attendanceExportRecordEntity.setCreateUserId(context.getUser().getId());
+        attendanceExportRecordEntity.setCreateTime(new Date());
+        attendanceExportRecordEntity.setType(2);
+        attendanceExportRecordEntity.setExportOrImport(1);
+        attendanceExportRecordService.save(attendanceExportRecordEntity);
+    }
+
+
     @Override
     protected void doListBefore(AttendanceRecordEntity query, Map<String, Object> model, Context context) throws AppException {
-        if (query.getClassId()!=null){
+        if (query.getClassId() != null) {
             query.setShiftsId(query.getClassId());
         }
-        if (query.getGroupId()!=null){
+        if (query.getGroupId() != null) {
             query.setAttendanceGroupId(query.getGroupId());
         }
 
         if (ObjectUtils.isEmpty(query.getOrderColList())) {
-            query.setOrderColList(Arrays.asList(new OrderCol("attendanceDate", OrderCol.DESCENDING),new OrderCol("staffName", OrderCol.DESCENDING)));
+            query.setOrderColList(Arrays.asList(new OrderCol("attendanceDate", OrderCol.DESCENDING), new OrderCol("staffName", OrderCol.DESCENDING)));
         } else {
             query.getOrderColList().add(new OrderCol("attendanceDate", OrderCol.DESCENDING));
             query.getOrderColList().add(new OrderCol("staffName", OrderCol.DESCENDING));
@@ -240,7 +293,6 @@ public class AttendanceRecordController extends BaseCRUDJsonBodyMappingControlle
     }
 
 
-
     /**
      * 姣忔棩缁熻
      */
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceRecordHikController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceRecordHikController.java
index 1e4958d6852eabed16170bbeded22abcf060cd73..fb1121d193b63e560b7840a61cd55a7b5ffd8013 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceRecordHikController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceRecordHikController.java
@@ -10,9 +10,13 @@ import com.mortals.framework.utils.ServletUtils;
 import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
 import com.mortals.xhx.base.system.param.service.ParamService;
 import com.mortals.xhx.base.system.upload.service.UploadService;
+import com.mortals.xhx.module.attendance.model.AttendanceClassEntity;
 import com.mortals.xhx.module.attendance.model.AttendanceExportRecordEntity;
+import com.mortals.xhx.module.attendance.model.AttendanceGroupEntity;
 import com.mortals.xhx.module.attendance.model.AttendanceRecordHikEntity;
+import com.mortals.xhx.module.attendance.service.AttendanceClassService;
 import com.mortals.xhx.module.attendance.service.AttendanceExportRecordService;
+import com.mortals.xhx.module.attendance.service.AttendanceGroupService;
 import com.mortals.xhx.module.attendance.service.AttendanceRecordHikService;
 import com.mortals.xhx.module.dept.model.DeptEntity;
 import com.mortals.xhx.module.dept.model.DeptQuery;
@@ -32,6 +36,7 @@ import org.springframework.web.multipart.MultipartFile;
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 娴峰悍鑰冨嫟鎵撳崱璁板綍姹囨€讳俊鎭�
@@ -55,6 +60,10 @@ public class AttendanceRecordHikController extends BaseCRUDJsonBodyMappingContro
     private AttendanceExportRecordService attendanceExportRecordService;
     @Autowired
     private AttendanceRecordHikService hikService;
+    @Autowired
+    private AttendanceGroupService groupService;
+    @Autowired
+    private AttendanceClassService classService;
 
     public AttendanceRecordHikController() {
         super.setModuleDesc("娴峰悍鑰冨嫟鎵撳崱璁板綍姹囨€讳俊鎭�");
@@ -170,20 +179,28 @@ public class AttendanceRecordHikController extends BaseCRUDJsonBodyMappingContro
         attendanceExportRecordEntity.setFilePath(filePath);
         if (query.getIdList() != null) {
             List<Long> idList = query.getIdList();
-            String recordIdList = "";
-            for (Long aLong : idList) {
-                if (recordIdList.equals("")) {
-                    recordIdList = recordIdList + aLong;
-                } else {
-                    recordIdList = recordIdList + "銆�" + aLong;
-                }
-            }
-            attendanceExportRecordEntity.setRecordIdList(recordIdList);
+            attendanceExportRecordEntity.setRecordIdList(idList.stream().map(i->i.toString()).collect(Collectors.joining(",")));
         }
         if (query.getAttendanceDateStart() != null) {
             String attendanceDate = query.getAttendanceDateStart() + "~" + query.getAttendanceDateEnd();
             attendanceExportRecordEntity.setAttendanceDate(attendanceDate);
         }
+
+        if(!ObjectUtils.isEmpty(query.getAttendanceGroupId())){
+            AttendanceGroupEntity attendanceGroupEntity = groupService.get(query.getAttendanceGroupId());
+            attendanceExportRecordEntity.setGroupName(attendanceGroupEntity==null?"":attendanceGroupEntity.getGroupName());
+        }
+
+        if(!ObjectUtils.isEmpty(query.getDeptId())){
+            DeptEntity deptEntity = deptService.get(query.getDeptId(), context);
+            attendanceExportRecordEntity.setDeptName(deptEntity==null?"":deptEntity.getDeptName());
+        }
+
+        if(!ObjectUtils.isEmpty(query.getShiftsId())){
+            AttendanceClassEntity attendanceClassEntity = classService.get(query.getShiftsId(), context);
+            attendanceExportRecordEntity.setClassName(attendanceClassEntity==null?"":attendanceClassEntity.getClassName());
+        }
+
         attendanceExportRecordEntity.setCreateUserId(context.getUser().getId());
         attendanceExportRecordEntity.setCreateTime(new Date());
         attendanceExportRecordEntity.setType(1);
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/model/PerformAttendAppealEntity.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/model/PerformAttendAppealEntity.java
index bee03c2cd576362f023930572b30f45bc3ba062e..036b33049e889a9f86da2956f9c65a781f956119 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/model/PerformAttendAppealEntity.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/model/PerformAttendAppealEntity.java
@@ -323,7 +323,7 @@ public class PerformAttendAppealEntity extends PerformAttendAppealVo {
 
         this.appealTime = null;
 
-        this.appealResult = null;
+        this.appealResult = 0;
 
         this.remark = "";
 
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformAttendAppealServiceImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformAttendAppealServiceImpl.java
index 54a70d4091efd1953a35359d21e912f5a4515b89..55a5ae1d5d4e5ea93fede9a4df83c4eda88878ba 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformAttendAppealServiceImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformAttendAppealServiceImpl.java
@@ -57,10 +57,8 @@ public class PerformAttendAppealServiceImpl extends AbstractCRUDServiceImpl<Perf
     private CheckGoworkRecordService checkGoworkRecordService;
     @Autowired
     private CheckOtherRecordService checkOtherRecordService;
-
     @Autowired
     private PerformAttendAppealFilesService performAttendAppealFilesService;
-
     @Autowired
     private IDingPersonService dingPersonService;
     @Autowired
@@ -248,6 +246,21 @@ public class PerformAttendAppealServiceImpl extends AbstractCRUDServiceImpl<Perf
     }
 
 
+    @Override
+    protected void saveBefore(PerformAttendAppealEntity entity, Context context) throws AppException {
+        //鏍¢獙鏄惁瀛樺湪宸茬粡閫氳繃鐨勭敵璇�
+
+        PerformAttendAppealQuery appealQuery = new PerformAttendAppealQuery();
+        appealQuery.setCheckRecordId(entity.getCheckRecordId());
+        appealQuery.setPerformType(entity.getPerformType());
+        appealQuery.setAppealResult(AppealResultEnum.閫氳繃.getValue());
+        int count = this.count(appealQuery, context);
+        if(count>0){
+            throw  new AppException("宸插瓨鍦ㄧ浉鍚岀殑閫氳繃鐢宠瘔锛屼笉瑕侀噸澶嶇敵璇夛紒");
+        }
+
+    }
+
     @Override
     protected void saveAfter(PerformAttendAppealEntity entity, Context context) throws AppException {
         if (!ObjectUtils.isEmpty(entity.getPerformAttendAppealFilesList())) {
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformAttendRecordServiceImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformAttendRecordServiceImpl.java
index 66ad3df8eccb144baa83a4a94086f17ae68f87a9..b13d52c59c8da386057730a6f5b5fdc7d9bdb27f 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformAttendRecordServiceImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformAttendRecordServiceImpl.java
@@ -86,8 +86,9 @@ public class PerformAttendRecordServiceImpl extends AbstractCRUDServiceImpl<Perf
         }
         entity.setErrorResult(entity.getRuleName());
         entity.setDeductTime(new Date());
-        entity.setDeductPerson(context == null ? "" : context.getUser() == null ? "" : context.getUser().getRealName());
-
+        if(ObjectUtils.isEmpty(entity.getDeductPerson())){
+            entity.setDeductPerson(context == null ? "" : context.getUser() == null ? "" : context.getUser().getRealName());
+        }
         if (!ObjectUtils.isEmpty(entity.getAttendanceGroupId())) {
             AttendanceGroupEntity attendanceGroupEntity = attendanceGroupService.get(entity.getAttendanceGroupId());
             entity.setAttendanceGroupName(attendanceGroupEntity == null ? "" : attendanceGroupEntity.getGroupName());
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformComplainRecordServiceImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformComplainRecordServiceImpl.java
index 9b546ba275eb13ead2e16e45c552ce36a325a8f7..2e054711428890c38ddde0bebce83756cc2503d7 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformComplainRecordServiceImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformComplainRecordServiceImpl.java
@@ -67,8 +67,9 @@ public class PerformComplainRecordServiceImpl extends AbstractCRUDServiceImpl<Pe
         }
 
         entity.setDeductTime(new Date());
-        entity.setDeductPerson(context == null ? "" : context.getUser() == null ? "" : context.getUser().getRealName());
-
+        if(ObjectUtils.isEmpty(entity.getDeductPerson())){
+            entity.setDeductPerson(context == null ? "" : context.getUser() == null ? "" : context.getUser().getRealName());
+        }
     }
 
     @Override
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformEffectRecordServiceImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformEffectRecordServiceImpl.java
index a57f63a80973afe3a6ad63dff765d511b5b5f328..8bb50ec233e24803e8d84108c0cee323ac6746ce 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformEffectRecordServiceImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformEffectRecordServiceImpl.java
@@ -66,8 +66,9 @@ public class PerformEffectRecordServiceImpl extends AbstractCRUDServiceImpl<Perf
             entity.setDeptName(staffCache == null ? "" : staffCache.getDeptName());
         }
         entity.setDeductTime(new Date());
-        entity.setDeductPerson(context == null ? "" : context.getUser() == null ? "" : context.getUser().getRealName());
-
+        if(ObjectUtils.isEmpty(entity.getDeductPerson())){
+            entity.setDeductPerson(context == null ? "" : context.getUser() == null ? "" : context.getUser().getRealName());
+        }
     }
 
     @Override
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformGoworkRecordServiceImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformGoworkRecordServiceImpl.java
index 06479cc699ce64202b018c0e5abb6a3ef3885dd0..32afbcd57a6fc3f1232be309d1ce588702b01d01 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformGoworkRecordServiceImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformGoworkRecordServiceImpl.java
@@ -65,8 +65,9 @@ public class PerformGoworkRecordServiceImpl extends AbstractCRUDServiceImpl<Perf
             entity.setDeptName(staffCache == null ? "" : staffCache.getDeptName());
         }
         entity.setDeductTime(new Date());
-        entity.setDeductPerson(context == null ? "" : context.getUser() == null ? "" : context.getUser().getRealName());
-
+        if(ObjectUtils.isEmpty(entity.getDeductPerson())){
+            entity.setDeductPerson(context == null ? "" : context.getUser() == null ? "" : context.getUser().getRealName());
+        }
     }
 
     @Override
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformOtherRecordServiceImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformOtherRecordServiceImpl.java
index 41b73c774ed47513d8fe0597945f6e757b5f2e52..d3a960f1440d133893060e207997cfdc66c8c792 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformOtherRecordServiceImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformOtherRecordServiceImpl.java
@@ -57,6 +57,7 @@ public class PerformOtherRecordServiceImpl extends AbstractCRUDServiceImpl<Perfo
         if (!ObjectUtils.isEmpty(entity.getRuleId())) {
             PerformRulesEntity rulesEntity = rulesService.getCache(entity.getRuleId().toString());
             entity.setRuleName(rulesEntity.getName());
+            entity.setRuleDesc(rulesEntity.getContent());
             entity.setSubAddType(rulesEntity == null ? 1 : rulesEntity.getSubAddType());
         }
         if (!ObjectUtils.isEmpty(entity.getStaffId())) {
@@ -66,7 +67,10 @@ public class PerformOtherRecordServiceImpl extends AbstractCRUDServiceImpl<Perfo
         }
 
         entity.setDeductTime(new Date());
-        entity.setDeductPerson(context == null ? "" : context.getUser() == null ? "" : context.getUser().getRealName());
+
+        if(ObjectUtils.isEmpty(entity.getDeductPerson())){
+            entity.setDeductPerson(context == null ? "" : context.getUser() == null ? "" : context.getUser().getRealName());
+        }
 
     }
 
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformReviewRecordServiceImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformReviewRecordServiceImpl.java
index 9a45ec5d40bf4572cbe4a33f8e3a4ee2498c5232..8d9504c578eb17a5222808e558e51871d483a613 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformReviewRecordServiceImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/perform/service/impl/PerformReviewRecordServiceImpl.java
@@ -66,8 +66,9 @@ public class PerformReviewRecordServiceImpl extends AbstractCRUDServiceImpl<Perf
             entity.setDeptName(staffCache == null ? "" : staffCache.getDeptName());
         }
         entity.setDeductTime(new Date());
-        entity.setDeductPerson(context == null ? "" : context.getUser() == null ? "" : context.getUser().getRealName());
-
+        if(ObjectUtils.isEmpty(entity.getDeductPerson())){
+            entity.setDeductPerson(context == null ? "" : context.getUser() == null ? "" : context.getUser().getRealName());
+        }
     }
 
     @Override
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/service/StaffService.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/service/StaffService.java
index 132f14b14907015b8ba96f9d25afc0b210b696e1..7686b6d84ebbc4c35d5f708cfa36458415e9a73f 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/service/StaffService.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/service/StaffService.java
@@ -1,5 +1,6 @@
 package com.mortals.xhx.module.staff.service;
 
+import com.mortals.framework.common.Rest;
 import com.mortals.framework.model.Context;
 import com.mortals.framework.service.ICRUDCacheService;
 import com.mortals.xhx.module.staff.model.StaffEntity;
@@ -21,4 +22,12 @@ public interface StaffService extends ICRUDCacheService<StaffEntity,Long> {
     StaffInfoVo queryAll(Context context);
     //缁熻鎵€鏈夊湪鑱屽憳宸�
     int queryAllPerson();
+
+    /**
+     * 鍚屾浜哄憳淇℃伅
+     * @param context
+     * @return
+     */
+    Rest<Void> syncPersons(Context context);
+
 }
\ No newline at end of file
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/service/impl/StaffServiceImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/service/impl/StaffServiceImpl.java
index 855063ab6ebacd81229b49cf8fc2f92827c984ce..7d2f2e0c0ef139540878cdb3b3cb6e4c3768a5ff 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/service/impl/StaffServiceImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/service/impl/StaffServiceImpl.java
@@ -1,6 +1,8 @@
 package com.mortals.xhx.module.staff.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import com.mortals.framework.common.Rest;
 import com.mortals.framework.exception.AppException;
 import com.mortals.framework.model.Context;
 import com.mortals.framework.service.impl.AbstractCRUDCacheServiceImpl;
@@ -10,7 +12,19 @@ import com.mortals.xhx.base.system.role.service.RoleUserService;
 import com.mortals.xhx.base.system.user.model.UserEntity;
 import com.mortals.xhx.base.system.user.service.UserService;
 import com.mortals.xhx.common.code.*;
+import com.mortals.xhx.module.attendance.model.AttendanceStatEntity;
+import com.mortals.xhx.module.attendance.model.AttendanceStatQuery;
+import com.mortals.xhx.module.attendance.model.AttendanceVacationBalanceEntity;
+import com.mortals.xhx.module.attendance.model.AttendanceVacationBalanceQuery;
+import com.mortals.xhx.module.attendance.service.AttendanceStatService;
+import com.mortals.xhx.module.attendance.service.AttendanceVacationBalanceService;
+import com.mortals.xhx.module.dept.model.DeptEntity;
+import com.mortals.xhx.module.dept.model.DeptQuery;
 import com.mortals.xhx.module.dept.service.DeptService;
+import com.mortals.xhx.module.hik.person.model.req.person.PersonReq;
+import com.mortals.xhx.module.hik.person.model.rsp.person.PersonDataInfo;
+import com.mortals.xhx.module.hik.person.model.rsp.person.PersonInfo;
+import com.mortals.xhx.module.hik.person.service.IHikPersonService;
 import com.mortals.xhx.module.staff.dao.StaffDao;
 import com.mortals.xhx.module.staff.dao.ibatis.StaffDaoImpl;
 import com.mortals.xhx.module.staff.dao.ibatis.StaffLeaveDaoImpl;
@@ -18,6 +32,7 @@ import com.mortals.xhx.module.staff.model.StaffEntity;
 import com.mortals.xhx.module.staff.model.StaffQuery;
 import com.mortals.xhx.module.staff.model.vo.StaffInfoVo;
 import com.mortals.xhx.module.staff.service.StaffService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.ObjectUtils;
@@ -36,6 +51,7 @@ import java.util.stream.Collectors;
  * @date 2023-04-07
  */
 @Service("staffService")
+@Slf4j
 public class StaffServiceImpl extends AbstractCRUDCacheServiceImpl<StaffDao, StaffEntity, Long> implements StaffService {
 
     @Autowired
@@ -46,6 +62,15 @@ public class StaffServiceImpl extends AbstractCRUDCacheServiceImpl<StaffDao, Sta
     @Autowired
     private RoleUserService roleUserService;
 
+    @Autowired
+    private IHikPersonService hikPersonService;
+
+    @Autowired
+    private AttendanceStatService attendanceStatService;
+
+    @Autowired
+    private AttendanceVacationBalanceService balanceService;
+
     @Override
     protected String getExtKey(StaffEntity data) {
         //宸ュ彿浣滀负redis 鎵╁睍key
@@ -57,10 +82,13 @@ public class StaffServiceImpl extends AbstractCRUDCacheServiceImpl<StaffDao, Sta
     protected void saveBefore(StaffEntity entity, Context context) throws AppException {
         int count = this.count(new StaffQuery().workNum(entity.getWorkNum()), context);
         if (count > 0) {
-            throw new AppException("宸ュ彿閲嶅锛�");
+            throw new AppException("宸ュ彿閲嶅锛佸伐鍙�:" + entity.getWorkNum());
         }
     }
 
+
+
+
     @Override
     public StaffInfoVo queryAll(Context context) {
         StaffInfoVo staffInfoVo = new StaffInfoVo();
@@ -94,12 +122,102 @@ public class StaffServiceImpl extends AbstractCRUDCacheServiceImpl<StaffDao, Sta
         return staffEntities.size();
     }
 
+    @Override
+    public Rest<Void> syncPersons(Context context) {
+        log.info("鍚屾浜哄憳锛�");
+
+        PersonReq personReq = new PersonReq();
+        personReq.setPageNo(1);
+        personReq.setPageSize(1000);
+        Rest<PersonDataInfo> personRest = hikPersonService.getPersonList(personReq);
+        if (personRest.getCode() == YesNoEnum.YES.getValue()) {
+            List<PersonInfo> personInfoList = personRest.getData().getList();
+            for (PersonInfo personInfo : personInfoList) {
+                StaffEntity staffEntity = this.getExtCache(StrUtil.padPre(personInfo.getJobNo(), 8, "0"));
+                DeptEntity deptEntity = deptService.selectOne(new DeptQuery().deptCode(personInfo.getOrgIndexCode()));
+                //鍒ゆ柇鏈湴鏁版嵁鏄惁涓虹┖
+                if (ObjectUtils.isEmpty(staffEntity)) {
+                    //鏂板鍛樺伐淇℃伅
+                    staffEntity = new StaffEntity();
+                    staffEntity.initAttrValue();
+                    if (!ObjectUtils.isEmpty(deptEntity)) {
+                        staffEntity.setDeptId(deptEntity.getId());
+                    }
+                    staffEntity.setName(personInfo.getPersonName());
+                    staffEntity.setRemarkId(personInfo.getPersonId());
+                    staffEntity.setPicUri(personInfo.getPersonPhoto().getPicUri());
+                    staffEntity.setServerIndexCode(personInfo.getPersonPhoto().getServerIndexCode());
+                    staffEntity.setDeptName(personInfo.getOrgName());
+                    staffEntity.setGender(personInfo.getGender());
+                    staffEntity.setWorkNum(personInfo.getJobNo());
+                    staffEntity.setPhoneNumber(personInfo.getPhoneNo());
+                    staffEntity.setCreateUserId(1L);
+                    staffEntity.setCreateTime(new Date());
+                    this.save(staffEntity);
+
+                } else {
+                    //鏇存柊
+                    if (!ObjectUtils.isEmpty(deptEntity)) {
+                        staffEntity.setDeptId(deptEntity.getId());
+                    }
+                    staffEntity.setName(personInfo.getPersonName());
+                    staffEntity.setRemarkId(personInfo.getPersonId());
+                    staffEntity.setPicUri(personInfo.getPersonPhoto().getPicUri());
+                    staffEntity.setServerIndexCode(personInfo.getPersonPhoto().getServerIndexCode());
+                    staffEntity.setDeptName(personInfo.getOrgName());
+                    staffEntity.setGender(personInfo.getGender());
+                    staffEntity.setWorkNum(personInfo.getJobNo());
+                    staffEntity.setPhoneNumber(personInfo.getPhoneNo());
+                    staffEntity.setUpdateUserId(1L);
+                    staffEntity.setUpdateTime(new Date());
+                    this.update(staffEntity);
+                }
+            }
+        }
+
+        return Rest.ok();
+    }
+
 
     @Override
     protected void saveAfter(StaffEntity entity, Context context) throws AppException {
+        super.saveAfter(entity, context);
+        //鍒濆鍖�
+        int count = balanceService.count(new AttendanceVacationBalanceQuery().staffId(entity.getId()), context);
+        if(count==0){
+            AttendanceVacationBalanceEntity balanceEntity = new AttendanceVacationBalanceEntity();
+            balanceEntity.initAttrValue();
+            balanceEntity.setStaffId(entity.getId());
+            balanceEntity.setStaffName(entity.getName());
+            balanceEntity.setDeptId(entity.getDeptId());
+            balanceEntity.setDeptName(entity.getDeptName());
+            balanceEntity.setCreateUserId(1L);
+            balanceEntity.setCreateTime(new Date());
+            balanceService.save(balanceEntity);
+        }
+        AttendanceStatQuery attendanceStatQuery = new AttendanceStatQuery();
+        attendanceStatQuery.setYear(DateUtil.year(new Date()));
+        attendanceStatQuery.setMonth(DateUtil.month(new Date())+1);
+        attendanceStatQuery.setDay(DateUtil.dayOfMonth(new Date()));
+        attendanceStatQuery.setStaffId(entity.getId());
+        int count1 = attendanceStatService.count(attendanceStatQuery, context);
+        if(count1==0){
+            AttendanceStatEntity attendanceStatEntity = new AttendanceStatEntity();
+            attendanceStatEntity.initAttrValue();
+            attendanceStatEntity.setStaffId(entity.getId());
+            attendanceStatEntity.setStaffName(entity.getName());
+            attendanceStatEntity.setDeptId(entity.getDeptId());
+            attendanceStatEntity.setDeptName(entity.getDeptName());
+            attendanceStatEntity.setPhoneNumer(entity.getPhoneNumber());
+            attendanceStatEntity.setYear(DateUtil.year(new Date()));
+            attendanceStatEntity.setMonth(DateUtil.month(new Date())+1);
+            attendanceStatEntity.setDay(DateUtil.dayOfMonth(new Date()));
+            attendanceStatEntity.setCreateUserId(1L);
+            attendanceStatEntity.setCreateTime(new Date());
+            attendanceStatService.save(attendanceStatEntity);
+        }
         try {
             UserEntity userEntity = new UserEntity();
-
             if (ObjectUtils.isEmpty(entity.getLoginName())) {
                 //濮撳悕鍔犲伐鍙蜂綔涓虹櫥褰曞悕
                 entity.setLoginName(entity.getName() + entity.getWorkNum());
@@ -130,9 +248,9 @@ public class StaffServiceImpl extends AbstractCRUDCacheServiceImpl<StaffDao, Sta
             }
 
         } catch (Exception e) {
-            throw new RuntimeException(e);
+           log.error("淇濆瓨绯荤粺鐢ㄦ埛寮傚父!",e);
         }
-        super.saveAfter(entity, context);
+
     }
 
 
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/web/StaffController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/web/StaffController.java
index 0ac8c63d5b09915d457aa782c2c6541b5562fd2d..3d49ab3964634738fb33143b4e1afcc91a10d8e0 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/web/StaffController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/module/staff/web/StaffController.java
@@ -1,9 +1,13 @@
 package com.mortals.xhx.module.staff.web;
 
+import com.alibaba.fastjson.JSONObject;
+import com.mortals.framework.common.Rest;
 import com.mortals.framework.exception.AppException;
 import com.mortals.framework.model.Context;
 import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
 import com.mortals.xhx.base.system.param.service.ParamService;
+import com.mortals.xhx.common.code.YesNoEnum;
+import com.mortals.xhx.module.attendance.model.vo.AttendStatInfo;
 import com.mortals.xhx.module.dept.model.DeptEntity;
 import com.mortals.xhx.module.dept.model.DeptQuery;
 import com.mortals.xhx.module.dept.model.DeptTreeSelect;
@@ -16,6 +20,7 @@ import com.mortals.xhx.module.staff.model.vo.HolidayListVo;
 import com.mortals.xhx.module.staff.model.vo.StaffInfoVo;
 import com.mortals.xhx.module.staff.service.StaffService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -109,6 +114,29 @@ public class StaffController extends BaseCRUDJsonBodyMappingController<StaffServ
         return super.saveAfter(entity, model, context);
     }
 
+    /**
+     * 鍚屾鏇存柊浜哄憳
+     */
+    @PostMapping(value = "syncPersons")
+    public String syncPersons() {
+        JSONObject jsonObject = new JSONObject();
+        String busiDesc = this.getModuleDesc() + "鍚屾";
+        try {
+            Rest<Void> rest = this.service.syncPersons(getContext());
+            if (rest.getCode() == YesNoEnum.NO.getValue()) {
+                throw new AppException("鍚屾寮傚父锛�");
+            }
+            recordSysLog(request, busiDesc + " 銆愭垚鍔熴€�");
+            jsonObject.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
+            jsonObject.put(KEY_RESULT_MSG, busiDesc + " 銆愭垚鍔熴€�");
+        } catch (Exception e) {
+            log.error("鍚屾浜哄憳", e);
+            jsonObject.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
+            jsonObject.put(KEY_RESULT_MSG, super.convertException(e));
+        }
+        return jsonObject.toJSONString();
+    }
+
     @Override
     public String delete(Long[] id) {
         return super.delete(id);