夏文涛 5 mesiacov pred
rodič
commit
c7c76046b0

+ 4 - 0
src/main/java/com/template/api/SmartUserControllerAPI.java

@@ -133,6 +133,10 @@ public interface SmartUserControllerAPI {
     @ApiOperation(value = "编辑用户人脸数据", notes = "编辑用户人脸数据", httpMethod = "POST")
     @ApiOperation(value = "编辑用户人脸数据", notes = "编辑用户人脸数据", httpMethod = "POST")
     CommonResult updateSmartUserImageById(@Validated @RequestBody updateSmartUserImageRequest ra, BindingResult bindingResult) throws Exception;
     CommonResult updateSmartUserImageById(@Validated @RequestBody updateSmartUserImageRequest ra, BindingResult bindingResult) throws Exception;
 
 
+    @PostMapping(value = "/updateSmartUserTimeById")
+    @ApiOperation(value = "编辑用户人脸数据", notes = "编辑用户人脸数据", httpMethod = "POST")
+    CommonResult updateSmartUserTimeById() throws Exception;
+
     @GetMapping(value = "/queryPageSmartUser")
     @GetMapping(value = "/queryPageSmartUser")
     @ApiOperation(value = "用户分页数据", notes = "用户分页数据", httpMethod = "GET")
     @ApiOperation(value = "用户分页数据", notes = "用户分页数据", httpMethod = "GET")
     CommonResult queryPageSmartUser(@RequestParam int currentPage, @RequestParam int pageCount, Integer departmentId, String name,Integer ifGraduate, @RequestHeader("user_head") String userhead);
     CommonResult queryPageSmartUser(@RequestParam int currentPage, @RequestParam int pageCount, Integer departmentId, String name,Integer ifGraduate, @RequestHeader("user_head") String userhead);

+ 205 - 0
src/main/java/com/template/common/utils/RedPacket.java

@@ -0,0 +1,205 @@
+package com.template.common.utils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.sql.SQLOutput;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * @Author: xwt
+ * @Date: 2025/12/30 星期二 9:28
+ * @Description: com.template.common.utils
+ * @Version: 1.0
+ */
+public class RedPacket {
+    /**
+     * 生成随机红包
+     * @param totalAmount 总金额(单位:元)
+     * @param peopleCounts 人数
+     * @return 每人分得的金额列表(单位:元)
+     */
+    public static List<Double> generateRedPacket(double totalAmount, List<String> peopleCounts) {
+        if (totalAmount <= 0 || peopleCounts.size() <= 0) {
+            throw new IllegalArgumentException("金额和人数必须大于0");
+        }
+        if (totalAmount < peopleCounts.size() * 0.01) {
+            throw new IllegalArgumentException("金额不足以分配给所有人");
+        }
+
+        List<Double> result = new ArrayList<>();
+        Random random = new Random();
+
+        // 转换为分,避免浮点数精度问题
+        int remainingAmount = (int)(totalAmount * 100);
+        int remainingPeople = peopleCounts.size();
+
+        for (int i = 0; i < peopleCounts.size() - 1; i++) {
+            // 确保每个人至少能分到0.01元
+            // 随机范围:[1, 剩余金额/剩余人数 * 2]
+            int max = remainingAmount / remainingPeople * 2;
+            int amount = random.nextInt(max - 1) + 1;
+
+            // 确保不会因为随机导致后面的人无法分配
+            amount = Math.max(1, Math.min(amount, remainingAmount - remainingPeople + 1));
+
+            result.add(amount / 100.0);
+            remainingAmount -= amount;
+            remainingPeople--;
+        }
+
+        // 最后一个人获得剩余所有金额
+        result.add(remainingAmount / 100.0);
+
+        return result;
+    }
+
+    /**
+     * 使用BigDecimal精确计算的版本
+     */
+    public static List<BigDecimal> generateRedPacketPrecise(BigDecimal totalAmount, List<String> peopleCounts) {
+        if (totalAmount.compareTo(BigDecimal.ZERO) <= 0 || peopleCounts.size() <= 0) {
+            throw new IllegalArgumentException("金额和人数必须大于0");
+        }
+
+        BigDecimal minAmount = new BigDecimal("0.01");
+        if (totalAmount.compareTo(minAmount.multiply(new BigDecimal(peopleCounts.size()))) < 0) {
+            throw new IllegalArgumentException("金额不足以分配给所有人");
+        }
+
+        List<BigDecimal> result = new ArrayList<>();
+        Random random = new Random();
+
+        BigDecimal remainingAmount = totalAmount;
+        int remainingPeople = peopleCounts.size();
+
+        for (int i = 0; i < peopleCounts.size() - 1; i++) {
+            // 计算最大可分配金额:剩余金额除以剩余人数乘以2
+            BigDecimal avg = remainingAmount.divide(new BigDecimal(remainingPeople), 10, RoundingMode.HALF_UP);
+            BigDecimal max = avg.multiply(new BigDecimal(2));
+
+            // 生成随机金额(0.01 ~ max)
+            BigDecimal randomValue = new BigDecimal(random.nextDouble())
+                    .multiply(max.subtract(minAmount))
+                    .add(minAmount);
+
+            // 保留两位小数
+            randomValue = randomValue.setScale(2, RoundingMode.HALF_UP);
+
+            // 确保剩余金额足够分配
+            BigDecimal minRequired = minAmount.multiply(new BigDecimal(remainingPeople - 1));
+            if (remainingAmount.subtract(randomValue).compareTo(minRequired) < 0) {
+                randomValue = remainingAmount.subtract(minRequired);
+            }
+
+            result.add(randomValue);
+            remainingAmount = remainingAmount.subtract(randomValue);
+            remainingPeople--;
+        }
+
+        // 最后一个人获得剩余金额
+        result.add(remainingAmount.setScale(2, RoundingMode.HALF_UP));
+
+        return result;
+    }
+
+    /**
+     * 简单的二倍均值法
+     */
+    public static List<Double> simpleRedPacket(double totalAmount, List<String> peopleCounts) {
+        List<Double> result = new ArrayList<>();
+        Random random = new Random();
+        double remaining = totalAmount;
+
+        for (int i = 0; i < peopleCounts.size() - 1; i++) {
+            // 二倍均值法:随机范围在 [0.01, 剩余金额/剩余人数 * 2 - 0.01]
+            double max = remaining / (peopleCounts.size() - i) * 2;
+            double money = random.nextDouble() * max;
+
+            // 确保不低于0.01元
+            money = Math.max(0.01, money);
+            money = Math.floor(money * 100) / 100.0;
+
+            result.add(money);
+            remaining -= money;
+        }
+
+        // 最后一个人
+        remaining = Math.round(remaining * 100) / 100.0;
+        result.add(remaining);
+
+        return result;
+    }
+
+    public static void main(String[] args) throws InterruptedException {
+        double totalAmount = 188.0;
+        List<String> peopleCount = new ArrayList<>();
+        peopleCount.add("阿吉");
+        peopleCount.add(".");
+        peopleCount.add("打工人阿阿阿作");
+        peopleCount.add("哥布林斯莱耶");
+        peopleCount.add("阿吉一天不\uD83E\uDD8C积阳德二天不\uD83E\uDD8C积积阳阳德 ");
+        peopleCount.add("管理在此谁敢造次");
+        peopleCount.add("くろいまと");
+        peopleCount.add("长沙陈奕迅");
+        peopleCount.add("旧雨");
+        peopleCount.add("阿1");
+
+        //System.out.println("=== 方法一:整数分计算 ===");
+        List<Double> redPacket1 = generateRedPacket(totalAmount, peopleCount);
+        printResult(redPacket1, totalAmount, peopleCount);
+
+//        System.out.println("\n=== 方法二:BigDecimal精确计算 ===");
+//        List<BigDecimal> redPacket2 = generateRedPacketPrecise(new BigDecimal("188.00"), peopleCount);
+//        printResult(redPacket2, new BigDecimal("188.00"), peopleCount);
+//
+//        System.out.println("\n=== 方法三:简单的二倍均值法 ===");
+//        List<Double> redPacket3 = simpleRedPacket(totalAmount, peopleCount);
+//        printResult(redPacket3, totalAmount, peopleCount);
+    }
+
+    private static void printResult(List<Double> amounts, double totalAmount,List<String> people) throws InterruptedException {
+        double sum = 0;
+        System.out.println("以下为2026年新年红包名单:");
+        for (int i = 0; i < people.size(); i++) {
+            Thread.sleep(1000);
+            System.out.print("*");
+            Thread.sleep(1000);
+            System.out.print("*");
+            Thread.sleep(1000);
+            System.out.print("*");
+            Thread.sleep(1000);
+            System.out.print("*");
+            Thread.sleep(1000);
+            System.out.print("*");
+            Thread.sleep(1000);
+            System.out.print("*");
+            Thread.sleep(2000);
+            System.out.println("");
+            String name = people.get(i)+": %.2f元\n";
+            System.out.printf(name,  amounts.get(i));
+            sum += amounts.get(i);
+            Thread.sleep(2000);
+        }
+        System.out.printf("总计: %.2f元 (预期: %.2f元)\n", sum, totalAmount);
+        System.out.printf("最大金额: %.2f元, 最小金额: %.2f元\n",
+                amounts.stream().max(Double::compare).orElse(0.0),
+                amounts.stream().min(Double::compare).orElse(0.0));
+    }
+
+    private static void printResult(List<BigDecimal> amounts, BigDecimal totalAmount,List<String> people) {
+        BigDecimal sum = BigDecimal.ZERO;
+        System.out.println("以下为2026年新年红包名单:");
+        for (int i = 0; i < people.size(); i++) {
+            String name = people.get(i)+": %.2f元\n";
+            System.out.printf(name, amounts.get(i));
+            sum = sum.add(amounts.get(i));
+        }
+        System.out.printf("总计: %.2f元 (预期: %.2f元)\n", sum, totalAmount);
+
+        BigDecimal max = amounts.stream().max(BigDecimal::compareTo).orElse(BigDecimal.ZERO);
+        BigDecimal min = amounts.stream().min(BigDecimal::compareTo).orElse(BigDecimal.ZERO);
+        System.out.printf("最大金额: %.2f元, 最小金额: %.2f元\n", max, min);
+    }
+}

+ 0 - 1
src/main/java/com/template/controller/HikvisionController.java

@@ -136,7 +136,6 @@ public class HikvisionController implements HikvisionAPI {
 // 获取推送人
 // 获取推送人
             List<SmartUser> smartUserList = smartUserService.getListPush();
             List<SmartUser> smartUserList = smartUserService.getListPush();
 
 
-
             if (ObjectUtils.isNotEmpty(smartUserList) && smartUserList.size() > 0) {
             if (ObjectUtils.isNotEmpty(smartUserList) && smartUserList.size() > 0) {
                 for (SmartUser smartUser : smartUserList) {
                 for (SmartUser smartUser : smartUserList) {
                     SmartNotification smartNotification = new SmartNotification();
                     SmartNotification smartNotification = new SmartNotification();

+ 70 - 0
src/main/java/com/template/controller/SmartUserController.java

@@ -5745,6 +5745,8 @@ public class SmartUserController implements SmartUserControllerAPI {
         }
         }
         return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
         return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
     }
     }
+
+
     //endregion
     //endregion
 
 
     //region 希沃增删改查方法
     //region 希沃增删改查方法
@@ -6607,6 +6609,74 @@ public class SmartUserController implements SmartUserControllerAPI {
     }
     }
     //endregion
     //endregion
 
 
+
+
+
+    @Override
+    @PassToken
+    public CommonResult updateSmartUserTimeById() throws Exception {
+
+        List<String> gradeIds = new ArrayList<>();
+        //2025 17
+        //2024 16
+        //2023 1
+        //gradeIds.add("17");
+        //gradeIds.add("16");
+        gradeIds.add("1");
+        List<SmartUser> users = smartUserService.queryStudentsByGrade(gradeIds);
+
+        for (SmartUser user:users) {
+            System.out.println("1");
+            Thread.sleep(2000);
+            bsUpdateStudentTimes(user);
+        }
+
+        System.out.println("操作完成");
+        return CommonResult.ok("操作成功");
+    }
+
+
+    //region 百胜更新学生时间组信息
+    public CommonResult bsUpdateStudentTimes(SmartUser su) throws Exception {
+        //region 更新百胜学生信息
+        String appId = controlConfig.getAppId();
+        String schoolno = controlConfig.getSchoolCode();
+        String timestamp = TimeExchange.DateNowTimeStamo();
+        String appSecret = controlConfig.getAppSecret();
+        String url = controlConfig.getUrl() + "student/update";
+
+        String idCardStr = org.springframework.util.StringUtils.hasText(su.getIdCard()) ? "\",\"student_idcard\":\"" + su.getIdCard() : "\",\"student_idcard\":\"" + "";
+
+        String bsGroupNo = "STG1712456245769408";
+        JSONObject jsonobject = new JSONObject();
+        jsonobject.put("appid", appId);
+        String str = "{\"student_no\":\"" + su.getBsStudentNo() + "\",\"student_name\":\"" + su.getName() + "\",\"student_number\":\"" + su.getCardNo() + "\",\"student_sex\":\"" + su.getSexId() + idCardStr + "\",\"student_stgno\":\"" + bsGroupNo + "\"}";
+        String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
+        jsonobject.put("data", aesStr);
+        jsonobject.put("schoolno", schoolno);
+        jsonobject.put("timestamp", timestamp);
+
+        String md5Str = "appid=" + appId + "&data={\"student_no\":\"" + su.getBsStudentNo() + "\",\"student_name\":\"" + su.getName() + "\",\"student_number\":\"" + su.getCardNo() + "\",\"student_sex\":\"" + su.getSexId() + idCardStr + "\",\"student_stgno\":\"" + bsGroupNo + "\"}" + "&schoolno=" + schoolno + "&timestamp=" + timestamp + "&key=" + appSecret;
+        String sign = CommonUtil.MD5(md5Str);
+        //sign签名
+        jsonobject.put("sign", sign);
+
+        //返回的结果中 code为1表示成功
+        String bsResult = RequestUtils.httpPost(url, jsonobject.toJSONString());
+
+        ObjectMapper objectMapper = new ObjectMapper();
+        BsClassVo result = objectMapper.readValue(bsResult, BsClassVo.class);
+
+        if (!bsResult.contains("更新成功")) {
+            System.out.println("百胜平台:" + result.getMsg());
+            return CommonResult.fail("百胜平台:" + result.getMsg());
+        }
+
+        return CommonResult.ok("更新成功");
+        //endregion
+    }
+    //endregion
+
     //region 百胜更新学生信息
     //region 百胜更新学生信息
     public CommonResult bsUpdateStudent(SmartUser su, String bsClassNo, String startDate, String endDate) throws Exception {
     public CommonResult bsUpdateStudent(SmartUser su, String bsClassNo, String startDate, String endDate) throws Exception {
         //region 更新百胜学生信息
         //region 更新百胜学生信息

+ 6 - 1
src/main/java/com/template/controller/WechatScanLoginController.java

@@ -101,6 +101,7 @@ public class WechatScanLoginController implements WechatScanLoginControllerAPI {
      */
      */
     @Override
     @Override
     @PassToken
     @PassToken
+    @DESRespondSecret(validated = false)
     public String login(Model model) throws UnsupportedEncodingException {
     public String login(Model model) throws UnsupportedEncodingException {
         Map<String, String> wechatLoginUrl = wechatScanLoginService.wechatLoginUrl();
         Map<String, String> wechatLoginUrl = wechatScanLoginService.wechatLoginUrl();
         String url = wechatLoginUrl.get("url");
         String url = wechatLoginUrl.get("url");
@@ -119,6 +120,7 @@ public class WechatScanLoginController implements WechatScanLoginControllerAPI {
      */
      */
     @Override
     @Override
     @PassToken
     @PassToken
+    @DESRespondSecret(validated = false)
     public String callback(String code, String state) throws UnsupportedEncodingException {
     public String callback(String code, String state) throws UnsupportedEncodingException {
         logger.info(code + "=====" + state);
         logger.info(code + "=====" + state);
         if (code != null && state != null) {
         if (code != null && state != null) {
@@ -161,6 +163,7 @@ public class WechatScanLoginController implements WechatScanLoginControllerAPI {
      */
      */
     @Override
     @Override
     @PassToken
     @PassToken
+    @DESRespondSecret(validated = false)
     public String bindUserMac(String phone, String messageCode) throws UnsupportedEncodingException {
     public String bindUserMac(String phone, String messageCode) throws UnsupportedEncodingException {
         if (StringUtils.isBlank(phone) || StringUtils.isBlank(messageCode)) {
         if (StringUtils.isBlank(phone) || StringUtils.isBlank(messageCode)) {
             return "redirect:" + HttpParame.FRONT_URI + "/#/login?message=" + URLEncoder.encode("请输入信息", "UTF-8");
             return "redirect:" + HttpParame.FRONT_URI + "/#/login?message=" + URLEncoder.encode("请输入信息", "UTF-8");
@@ -173,8 +176,9 @@ public class WechatScanLoginController implements WechatScanLoginControllerAPI {
 
 
     @Override
     @Override
     @PassToken
     @PassToken
+    @DESRespondSecret(validated = false)
     public String bindcallback(String code, String state, String phone, String messageCode) throws UnsupportedEncodingException {
     public String bindcallback(String code, String state, String phone, String messageCode) throws UnsupportedEncodingException {
-        logger.info(code + "===" + state + "==" + messageCode);
+        System.out.println(code + "===" + state + "==" + messageCode);
         if (code != null && state != null) {
         if (code != null && state != null) {
             // 验证state为了用于防止跨站请求伪造攻击
             // 验证state为了用于防止跨站请求伪造攻击
             String decrypt = AesUtil.decrypt(AesUtil.parseHexStr2Byte(state), AesUtil.PASSWORD_SECRET_KEY, 16);
             String decrypt = AesUtil.decrypt(AesUtil.parseHexStr2Byte(state), AesUtil.PASSWORD_SECRET_KEY, 16);
@@ -182,6 +186,7 @@ public class WechatScanLoginController implements WechatScanLoginControllerAPI {
                 return "redirect:" + HttpParame.FRONT_URI + "/#/login?message=" + URLEncoder.encode("请勿非法进入", "UTF-8");
                 return "redirect:" + HttpParame.FRONT_URI + "/#/login?message=" + URLEncoder.encode("请勿非法进入", "UTF-8");
             }
             }
             AccessToken access = wechatScanLoginService.getAccessToken(code);
             AccessToken access = wechatScanLoginService.getAccessToken(code);
+            System.out.println("====="+access);
             if (access != null) {
             if (access != null) {
                 String openid = access.getOpenid();
                 String openid = access.getOpenid();
                 QueryWrapper<SmsCode> queryWrapper1 = new QueryWrapper<>();
                 QueryWrapper<SmsCode> queryWrapper1 = new QueryWrapper<>();

+ 2 - 2
src/main/java/com/template/mapper/SmartEvaluateTeacherMapper.java

@@ -22,9 +22,9 @@ import java.util.List;
 @Repository
 @Repository
 public interface SmartEvaluateTeacherMapper extends BaseMapper<SmartEvaluateTeacher> {
 public interface SmartEvaluateTeacherMapper extends BaseMapper<SmartEvaluateTeacher> {
 
 
-    Double getAvgLowingScore(@RequestParam("term") String term);
+    Double getAvgLowingScore(@Param("term") String term);
 
 
-    List<EvaluateTeacherVo> smartTopTeacherList(@RequestParam("termId") Integer termId);
+    List<EvaluateTeacherVo> smartTopTeacherList(@Param("termId") Integer termId);
 
 
     List<RankingVo> getRankingList(@Param("term") String term);
     List<RankingVo> getRankingList(@Param("term") String term);
 
 

+ 2 - 0
src/main/java/com/template/services/SmartUserService.java

@@ -107,6 +107,8 @@ public interface SmartUserService extends IService<SmartUser> {
 
 
     List<SmartUser> queryStudentsByGrade(List<String> gradeIds);
     List<SmartUser> queryStudentsByGrade(List<String> gradeIds);
 
 
+    List<SmartUser> queryStudentsByTime(Integer groupId);
+
     List<SmartUser> queryUsersByClass(Integer schoolClass);
     List<SmartUser> queryUsersByClass(Integer schoolClass);
 
 
     List<SmartUser> getListUser();
     List<SmartUser> getListUser();

+ 0 - 8
src/main/java/com/template/services/impl/SmartFaceDiscernServiceImpl.java

@@ -257,19 +257,12 @@ public class SmartFaceDiscernServiceImpl extends ServiceImpl<SmartFaceDiscernMap
                                 smartNotification.setType(2);
                                 smartNotification.setType(2);
 
 
                                 smartNotificationService.save(smartNotification);
                                 smartNotificationService.save(smartNotification);
-
                             }
                             }
-
                         }
                         }
-
                     }
                     }
-
                 }
                 }
-
             } else {
             } else {
-
                 smartFaceDiscern.setUserId(0);
                 smartFaceDiscern.setUserId(0);
-
 //                    判断是否已经添加
 //                    判断是否已经添加
                 LambdaQueryWrapper<SmartFaceDiscern> wrapperFD = new LambdaQueryWrapper<>();
                 LambdaQueryWrapper<SmartFaceDiscern> wrapperFD = new LambdaQueryWrapper<>();
                 wrapperFD.eq(SmartFaceDiscern::getDateTime, recordAddtime)
                 wrapperFD.eq(SmartFaceDiscern::getDateTime, recordAddtime)
@@ -280,7 +273,6 @@ public class SmartFaceDiscernServiceImpl extends ServiceImpl<SmartFaceDiscernMap
                 if (ObjectUtils.isEmpty(list) && list.size() == 0) {
                 if (ObjectUtils.isEmpty(list) && list.size() == 0) {
                     this.save(smartFaceDiscern);
                     this.save(smartFaceDiscern);
                 }
                 }
-
             }
             }
         }
         }
     }
     }

+ 9 - 0
src/main/java/com/template/services/impl/SmartUserServiceImpl.java

@@ -330,6 +330,15 @@ public class SmartUserServiceImpl extends ServiceImpl<SmartUserMapper, SmartUser
     }
     }
 
 
     @Override
     @Override
+    public List<SmartUser> queryStudentsByTime(Integer groupId) {
+        QueryWrapper<SmartUser> queryWrapper = new QueryWrapper();
+        queryWrapper.eq("identity_id", eIdentityStatu.Student.getValue());
+        queryWrapper.in("time_group_id", groupId);
+        List<SmartUser> result = smartUserMapper.selectList(queryWrapper);
+        return result;
+    }
+
+    @Override
     public List<SmartUser> queryUsersByClass(Integer schoolClass) {
     public List<SmartUser> queryUsersByClass(Integer schoolClass) {
         QueryWrapper<SmartUser> queryWrapper = new QueryWrapper();
         QueryWrapper<SmartUser> queryWrapper = new QueryWrapper();
         queryWrapper.eq(schoolClass != null, "school_class", schoolClass);
         queryWrapper.eq(schoolClass != null, "school_class", schoolClass);

+ 1 - 1
src/main/resources/application-prod.yml

@@ -88,7 +88,7 @@ tencentcloud:
 #1:开启
 #1:开启
 #0:关闭
 #0:关闭
 schedule:
 schedule:
-  isOpen: 1
+  isOpen: 0
 
 
 ding:
 ding:
   #钉钉配置
   #钉钉配置

+ 1 - 1
src/main/resources/mapper/template/SmartEvaluateTeacherMapper.xml

@@ -17,7 +17,7 @@
             resultMap="smartTopTeacherMap">
             resultMap="smartTopTeacherMap">
         select id,name,term from smart_evaluate_teacher
         select id,name,term from smart_evaluate_teacher
         where deleted = 0
         where deleted = 0
-        <if test="termId != null and termId != ''">
+        <if test="termId != null and termId > 0">
             and term_id = #{termId}
             and term_id = #{termId}
         </if>
         </if>
         order by total_score desc limit 6
         order by total_score desc limit 6