LAPTOP-KB9HII50\70708 vor 1 Woche
Ursprung
Commit
56a8553cce

+ 82 - 0
svr/svr-iot/src/main/java/com/yihu/iot/controller/third/DataEnvelop.java

@ -0,0 +1,82 @@
package com.yihu.iot.controller.third;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
@JsonInclude(JsonInclude.Include.ALWAYS)
@ApiModel(value = "DataEnvelop", description = "基础实体")
public class DataEnvelop implements Serializable {
    @ApiModelProperty(value = "信息", example = "success")
    protected String msg;
    @ApiModelProperty(value = "API中所描述的 响应参数 组成的JSON字符串经过加密后得到的Base64编码的字符串", example = "data")
    protected String data;
    @ApiModelProperty(value = "状态(200 - 成功)", example = "200")
    protected Integer code = 200;
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public String getData() {
        return data;
    }
    public void setData(String data) {
        this.data = data;
    }
    public static DataEnvelop getSuccess(String msg) {
        DataEnvelop envelop = new DataEnvelop();
        envelop.setMsg(msg);
        envelop.setCode(200);
        return envelop;
    }
    public static DataEnvelop getSuccess(String msg,String data) {
        DataEnvelop envelop = new DataEnvelop();
        envelop.setMsg(msg);
        envelop.setData(data);
        envelop.setCode(200);
        return envelop;
    }
    public static DataEnvelop getError(String msg, int errorCode) {
        DataEnvelop envelop = new DataEnvelop();
        envelop.setMsg(msg);
        envelop.setCode(errorCode);
        return envelop;
    }
    public static DataEnvelop getError(String msg) {
        DataEnvelop envelop = new DataEnvelop();
        envelop.setMsg(msg);
        envelop.setCode(-1);
        return envelop;
    }
    public static DataEnvelop getError(String msg,String data) {
        DataEnvelop envelop = new DataEnvelop();
        envelop.setMsg(msg);
        envelop.setData(data);
        envelop.setCode(-1);
        return envelop;
    }
}

+ 151 - 0
svr/svr-iot/src/main/java/com/yihu/iot/controller/third/RuncoboController.java

@ -0,0 +1,151 @@
package com.yihu.iot.controller.third;
import com.alibaba.fastjson.JSONObject;
import com.yihu.iot.datainput.service.RuncoboService;
import com.yihu.jw.util.entity.ServiceException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * 云康宝人体成分分析仪
 * Created by yeshijie on 2025/9/23.
 */
@RestController
@RequestMapping("weixin/runcobo")
@Api(tags = "开放接口-云康宝人体成分分析仪", description = "开放接口-云康宝人体成分分析仪")
public class RuncoboController {
    private static final Logger logger = LoggerFactory.getLogger(RuncoboController.class);
    @Autowired
    private RuncoboService runcoboService;
    @GetMapping(value = "major_scale/v1/test_calibrate")
    @ApiOperation(value = "验证接口", notes = "在设备切换模式⾃定义配置服务器时,发送验证。服务器收到")
    public DataEnvelop test_calibrate(String biz_params){
        try{
            logger.info("test_calibrate:biz_params:"+biz_params);
            String params = runcoboService.decryptStr(biz_params);
            logger.info("test_calibrate:params:"+params);
            return DataEnvelop.getSuccess("验证成功");
        } catch (ServiceException e){
            return DataEnvelop.getError(e.getMessage());
        } catch (Exception e){
            e.printStackTrace();
            return DataEnvelop.getError("验证失败");
        }
    }
    @PostMapping(value = "user/v1/save_user_list")
    @ApiOperation(value = "创建/更新用户信息", notes = "创建/更新用户信息")
    public DataEnvelop save_user_list(String biz_params){
        try{
            logger.info("save_user_list:biz_params:"+biz_params);
            String params = runcoboService.decryptStr(biz_params);
            logger.info("save_user_list:params:"+params);
            JSONObject data = runcoboService.save_user_list(params);
            logger.info("save_user_list:data:"+data.toJSONString());
            return DataEnvelop.getSuccess("成功",runcoboService.encryptStr(data.toJSONString()));
        } catch (ServiceException e){
            return DataEnvelop.getError(e.getMessage());
        } catch (Exception e){
            e.printStackTrace();
            return DataEnvelop.getError("失败");
        }
    }
    @PostMapping(value = "user/v1/delete_user_list")
    @ApiOperation(value = "删除用户", notes = "删除用户")
    public DataEnvelop delete_user_list(String biz_params){
        try{
            logger.info("delete_user_list:biz_params:"+biz_params);
            String params = runcoboService.decryptStr(biz_params);
            logger.info("delete_user_list:params:"+params);
            JSONObject data = runcoboService.delete_user_list(params);
            logger.info("delete_user_list:data:"+data.toJSONString());
            return DataEnvelop.getSuccess("成功",runcoboService.encryptStr(data.toJSONString()));
        } catch (ServiceException e){
            return DataEnvelop.getError(e.getMessage());
        } catch (Exception e){
            e.printStackTrace();
            return DataEnvelop.getError("失败");
        }
    }
    @GetMapping(value = "user/v1/get_from_user_list")
    @ApiOperation(value = "增量获取用户信息列表", notes = "增量获取用户信息列表")
    public DataEnvelop get_from_user_list(String biz_params){
        try{
            logger.info("get_from_user_list:biz_params:"+biz_params);
            String params = runcoboService.decryptStr(biz_params);
            logger.info("get_from_user_list:params:"+params);
            JSONObject data = runcoboService.get_from_user_list(params);
            logger.info("get_from_user_list:data:"+data.toJSONString());
            return DataEnvelop.getSuccess("成功",runcoboService.encryptStr(data.toJSONString()));
        } catch (ServiceException e){
            return DataEnvelop.getError(e.getMessage());
        } catch (Exception e){
            e.printStackTrace();
            return DataEnvelop.getError("验证失败");
        }
    }
    @GetMapping(value = "user/v1/get_from_user_id")
    @ApiOperation(value = "获取单⼀用户信息", notes = "获取单⼀用户信息")
    public DataEnvelop get_from_user_id(String biz_params){
        try{
            logger.info("get_from_user_id:biz_params:"+biz_params);
            String params = runcoboService.decryptStr(biz_params);
            logger.info("get_from_user_id:params:"+params);
            JSONObject data = runcoboService.get_from_user_id(params);
            logger.info("get_from_user_id:data:"+data.toJSONString());
            return DataEnvelop.getSuccess("成功",runcoboService.encryptStr(data.toJSONString()));
        } catch (ServiceException e){
            return DataEnvelop.getError(e.getMessage());
        } catch (Exception e){
            e.printStackTrace();
            return DataEnvelop.getError("验证失败");
        }
    }
    @PostMapping(value = "measurement/v1/upload_data")
    @ApiOperation(value = "批量上传测量数据", notes = "批量上传测量数据")
    public DataEnvelop measurement_upload_data(String biz_params){
        try{
            logger.info("measurement_upload_data:biz_params:"+biz_params);
            String params = runcoboService.decryptStr(biz_params);
            logger.info("measurement_upload_data:params:"+params);
            JSONObject data = runcoboService.measurement_upload_data(params);
            return DataEnvelop.getSuccess("成功",runcoboService.encryptStr(data.toJSONString()));
        } catch (ServiceException e){
            return DataEnvelop.getError(e.getMessage());
        } catch (Exception e){
            e.printStackTrace();
            return DataEnvelop.getError("验证失败");
        }
    }
    @PostMapping(value = "teeny_data/v1/upload_data")
    @ApiOperation(value = "批量上传⻘少年测量数据", notes = "批量上传⻘少年测量数据")
    public DataEnvelop teeny_data_upload_data(String biz_params){
        try{
            logger.info("teeny_data_upload_data:biz_params:"+biz_params);
            String params = runcoboService.decryptStr(biz_params);
            logger.info("teeny_data_upload_data:params:"+params);
            JSONObject data = runcoboService.teeny_data_upload_data(params);
            return DataEnvelop.getSuccess("成功",runcoboService.encryptStr(data.toJSONString()));
        } catch (ServiceException e){
            return DataEnvelop.getError(e.getMessage());
        } catch (Exception e){
            e.printStackTrace();
            return DataEnvelop.getError("验证失败");
        }
    }
}

+ 12 - 0
svr/svr-iot/src/main/java/com/yihu/iot/dao/runcobo/RunCoboUploadDataDao.java

@ -0,0 +1,12 @@
package com.yihu.iot.dao.runcobo;
import com.yihu.jw.entity.iot.runcobo.RunCoboUploadData;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * Created by yeshijie on 2025/9/23.
 */
public interface RunCoboUploadDataDao extends PagingAndSortingRepository<RunCoboUploadData,Long>,
        JpaSpecificationExecutor<RunCoboUploadData> {
}

+ 12 - 0
svr/svr-iot/src/main/java/com/yihu/iot/dao/runcobo/RuncoboTeenyUploadDataDao.java

@ -0,0 +1,12 @@
package com.yihu.iot.dao.runcobo;
import com.yihu.jw.entity.iot.runcobo.RuncoboTeenyUploadData;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * Created by yeshijie on 2025/9/24.
 */
public interface RuncoboTeenyUploadDataDao extends PagingAndSortingRepository<RuncoboTeenyUploadData,Long>,
        JpaSpecificationExecutor<RuncoboTeenyUploadData> {
}

+ 16 - 0
svr/svr-iot/src/main/java/com/yihu/iot/dao/runcobo/RuncoboUserDao.java

@ -0,0 +1,16 @@
package com.yihu.iot.dao.runcobo;
import com.yihu.jw.entity.iot.runcobo.RuncoboUser;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * Created by yeshijie on 2025/9/23.
 */
public interface RuncoboUserDao extends PagingAndSortingRepository<RuncoboUser,Long>,
        JpaSpecificationExecutor<RuncoboUser> {
    @Query("from RuncoboUser w where w.sn=?1 and w.userCode =?2")
    RuncoboUser findByUserCode(String sn,String userCode);
}

+ 491 - 0
svr/svr-iot/src/main/java/com/yihu/iot/datainput/service/RuncoboService.java

@ -0,0 +1,491 @@
package com.yihu.iot.datainput.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yihu.iot.dao.runcobo.RunCoboUploadDataDao;
import com.yihu.iot.dao.runcobo.RuncoboTeenyUploadDataDao;
import com.yihu.iot.dao.runcobo.RuncoboUserDao;
import com.yihu.iot.datainput.util.AesCbcUtils;
import com.yihu.jw.entity.iot.runcobo.RunCoboUploadData;
import com.yihu.jw.entity.iot.runcobo.RuncoboTeenyUploadData;
import com.yihu.jw.entity.iot.runcobo.RuncoboUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import java.util.*;
/**
 * 云康宝人体成分分析仪(横屏)-API文档_V1.2.1--配置服务器接口
 * Created by yeshijie on 2025/9/23.
 */
@Service
public class RuncoboService {
    public static final String aesKey = "yol202302l6qn133";//我司API对接文档秘钥key
    public static final String aesIv = "yol2023king02160";//偏移量iv
    @Autowired
    private RuncoboTeenyUploadDataDao teenyUploadDataDao;
    @Autowired
    private RuncoboUserDao userDao;
    @Autowired
    private RunCoboUploadDataDao uploadDataDao;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    /**
     * 创建/更新用户信息
     */
    public JSONObject save_user_list(String params){
        JSONObject result = new JSONObject();
        List<String> success_user_code_list = new ArrayList<>();//创建/更新成功的用户标识列表
        List<String> failed_user_code_list = new ArrayList<>();//创建/更新失败的用户标识列表
        try{
            JSONObject jsonObject = JSON.parseObject(params);
            String sn = jsonObject.getString("sn");
            JSONArray user_list = jsonObject.getJSONArray("user_list");
            for (int i=0;i<user_list.size();i++){
                JSONObject user = user_list.getJSONObject(i);
                String user_code = user.getString("user_code");
                try {
                    RuncoboUser u = userDao.findByUserCode(sn,user_code);
                    if(u==null){
                        u = new RuncoboUser();
                        u.setUserCode(user_code);
                        u.setCreateTime(new Date());
                    }
                    u.setDel(1);
                    u.setSn(sn);
                    u.setAccountName(user.getString("account_name"));
                    u.setGender(user.getInteger("gender"));
                    u.setAge(user.getInteger("age"));
                    u.setHeightUnit(user.getInteger("height_unit"));
                    u.setHeight(user.getDouble("height"));
                    u.setUpdateTimestamp(user.getLong("update_timestamp"));
                    u.setCreateTimestamp(user.getLong("create_timestamp"));
                    u.setCreateMode(user.getInteger("create_mode"));
                    userDao.save(u);
                    success_user_code_list.add(user_code);
                }catch (Exception e){
                    e.printStackTrace();
                    failed_user_code_list.add(user_code);
                }
            }
        } catch (Exception e){
            e.printStackTrace();
        }
        result.put("success_user_code_list",success_user_code_list);
        result.put("failed_user_code_list",failed_user_code_list);
        return result;
    }
    /**
     * 删除
     */
    public JSONObject delete_user_list(String params){
        JSONObject result = new JSONObject();
        List<String> success_user_code_list = new ArrayList<>();//创建/更新成功的用户标识列表
        List<String> failed_user_code_list = new ArrayList<>();//创建/更新失败的用户标识列表
        try{
            JSONObject jsonObject = JSON.parseObject(params);
            String sn = jsonObject.getString("sn");
            JSONArray user_code_list = jsonObject.getJSONArray("user_code_list");
            for (int i=0;i<user_code_list.size();i++){
                String user_code = user_code_list.getString(i);
                try {
                    RuncoboUser u = userDao.findByUserCode(sn,user_code);
                    if(u!=null){
                        u.setDel(0);
                        userDao.save(u);
                    }
                    success_user_code_list.add(user_code);
                }catch (Exception e){
                    e.printStackTrace();
                    failed_user_code_list.add(user_code);
                }
            }
        } catch (Exception e){
            e.printStackTrace();
        }
        result.put("success_user_code_list",success_user_code_list);
        result.put("failed_user_code_list",failed_user_code_list);
        return result;
    }
    /**
     * 增量获取用户信息列表
     */
    public JSONObject get_from_user_list(String params){
        JSONObject result = new JSONObject();
        try{
            JSONObject jsonObject = JSON.parseObject(params);
            String sn = jsonObject.getString("sn");
            long last_timestamp = jsonObject.getLong("last_timestamp");//最新时间戳,⾸次获取赋值为0;后续值为服务器下发的
            String sql = "SELECT user_code,account_name,gender,age,height,height_unit,update_timestamp,create_timestamp,create_mode " +
                    " from runcobo_user WHERE sn='"+sn+"' and del=1 ";
            if(last_timestamp>0){
                sql += " and create_timestamp>"+last_timestamp;
            }
            sql += " ORDER BY create_timestamp LIMIT 15 ";
            List<Map<String,Object>> list = jdbcTemplate.queryForList(sql);
            String maxSql = "SELECT ifnull(MAX(create_timestamp),0) from runcobo_user WHERE sn='"+sn+"' and del=1";
            long create_timestamp = jdbcTemplate.queryForObject(maxSql,Long.class);
            int is_complete = 1;//是否下发完成,根据该字段判断是否已下拉完成
            if(list.size()>0){
                long create_timestamp1 = Long.parseLong(list.get(list.size()-1).get("create_timestamp")+"");
                if(create_timestamp1!=create_timestamp){
                    is_complete = 0;
                }
            }
            result.put("last_timestamp",create_timestamp);
            result.put("is_complete",is_complete);
            result.put("user_list",list);
        } catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 获取单一用户信息
     */
    public JSONObject get_from_user_id(String params){
        JSONObject result = new JSONObject();
        try{
            JSONObject jsonObject = JSON.parseObject(params);
            String sn = jsonObject.getString("sn");
            String user_code = jsonObject.getString("user_code");
            String sql = "SELECT user_code,account_name,cast(gender as SIGNED) gender,age,height,height_unit,update_timestamp,create_timestamp,create_mode " +
                    " from runcobo_user WHERE sn='"+sn+"' and user_code='"+user_code+"' ";
            List<Map<String,Object>> list = jdbcTemplate.queryForList(sql);
            if(list.size()>0){
                Map<String,Object> map = list.get(0);
                result.put("user_code",map.get("user_code"));
                result.put("account_name",map.get("account_name"));
                result.put("gender",map.get("gender"));
                result.put("age",map.get("age"));
                result.put("height",map.get("height"));
                result.put("height_unit",map.get("height_unit"));
                result.put("update_timestamp",map.get("update_timestamp"));
                result.put("create_timestamp",map.get("create_timestamp"));
                result.put("create_mode",map.get("create_mode"));
            }
        } catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 批量上传测量数据
     */
    public JSONObject measurement_upload_data(String params){
        JSONObject result = new JSONObject();
        JSONArray success_data_timestamp_list = new JSONArray();//保存成功的数据标识列表
        JSONArray failed_data_timestamp_list = new JSONArray();//保存失败的数据标识列表,需要注意返回失败的数据后续会⼀直重复上传。若需阻抗⽆需保存的数据后续不再重复上传,服务端可在success_data_timestamp_list字段中回复
        try{
            JSONObject jsonObject = JSON.parseObject(params);
            JSONArray measurements = jsonObject.getJSONArray("measurements");
            Date now = new Date();
            for (int i=0;i<measurements.size();i++){
                JSONObject user = measurements.getJSONObject(i);
                String user_code = user.getString("user_code");
                Long timestamp = user.getLong("timestamp");
                JSONObject tmp = new JSONObject();
                tmp.put("user_code",user_code);
                tmp.put("timestamp",timestamp);
                try {
                    RunCoboUploadData uploadData = new RunCoboUploadData();
                    uploadData.setCreateTime(now);
                    uploadData.setSn(user.getString("sn"));// sn Y string 设备序列号
                    uploadData.setCreateMode(user.getInteger("create_mode"));
                    uploadData.setTimestamp(user.getLong("timestamp"));
                    uploadData.setUserCode(user_code);
                    uploadData.setGender(user.getInteger("gender"));
                    uploadData.setAge(user.getInteger("age"));
                    uploadData.setHeight(user.getDouble("height"));
                    uploadData.setWeight(user.getDouble("weight"));
                    uploadData.setStdWeightUpper(user.getDouble("std_weight_upper"));
                    uploadData.setStdWeightLower(user.getDouble("std_weight_lower"));
                    uploadData.setBmi(user.getDouble("bmi"));
                    uploadData.setStdBMISevere(user.getDouble("std_bmi_severe"));
                    uploadData.setStdBMIUpper(user.getDouble("std_bmi_upper"));
                    uploadData.setStdBMILower(user.getDouble("std_bmi_lower"));
                    uploadData.setSinew(user.getDouble("sinew"));
                    uploadData.setStdSinewUpper(user.getDouble("std_sinew_upper"));
                    uploadData.setStdSinewLower(user.getDouble("std_sinew_lower"));
                    uploadData.setMuscle(user.getDouble("muscle"));
                    uploadData.setStdMuscleUpper(user.getDouble("std_muscle_upper"));
                    uploadData.setStdMuscleLower(user.getDouble("std_muscle_lower"));
                    uploadData.setBone(user.getDouble("bone"));
                    uploadData.setStdBoneUpper(user.getDouble("std_bone_upper"));
                    uploadData.setStdBoneLower(user.getDouble("std_bone_lower"));
                    uploadData.setWater(user.getDouble("water"));
                    uploadData.setStdWaterUpper(user.getDouble("std_water_upper"));
                    uploadData.setStdWaterLower(user.getDouble("std_water_lower"));
                    uploadData.setProtein(user.getDouble("protein"));
                    uploadData.setStdProteinUpper(user.getDouble("std_protein_upper"));
                    uploadData.setStdProteinLower(user.getDouble("std_protein_lower"));
                    uploadData.setBodyfat(user.getDouble("bodyfat"));
                    uploadData.setStdBodyfatSevere(user.getDouble("std_bodyfat_severe"));
                    uploadData.setStdBodyfatUpper(user.getDouble("std_bodyfat_upper"));
                    uploadData.setStdBodyfatLower(user.getDouble("std_bodyfat_lower"));
                    uploadData.setFat(user.getDouble("fat"));
                    uploadData.setStdFatUpper(user.getDouble("std_fat_upper"));
                    uploadData.setStdFatLower(user.getDouble("std_fat_lower"));
                    uploadData.setLbm(user.getDouble("lbm"));
                    uploadData.setStdLbmUpper(user.getDouble("std_lbm_upper"));
                    uploadData.setStdLbmLower(user.getDouble("std_lbm_lower"));
                    uploadData.setBmr(user.getInteger("bmr"));
                    uploadData.setStdBmrUpper(user.getInteger("std_bmr_upper"));
                    uploadData.setStdBmrLower(user.getInteger("std_bmr_lower"));
                    uploadData.setSubfat(user.getDouble("subfat"));
                    uploadData.setStdSubfatUpper(user.getDouble("std_subfat_upper"));
                    uploadData.setStdSubfatLower(user.getDouble("std_subfat_lower"));
                    uploadData.setVisfat(user.getInteger("visfat"));
                    uploadData.setStdVisfatUpper(user.getInteger("std_visfat_upper"));
                    uploadData.setStdVisfatSevere(user.getInteger("std_visfat_severe"));
                    uploadData.setBodyshape(user.getInteger("bodyshape"));
                    uploadData.setBodyage(user.getInteger("bodyage"));
                    uploadData.setScore(user.getDouble("score"));
                    uploadData.setLeftArmMuscle(user.getDouble("left_arm_muscle"));
                    uploadData.setLeftArmMuscleIdeale(user.getDouble("left_arm_muscle_ideale"));
                    uploadData.setLeftArmMuscleRatio(user.getDouble("left_arm_muscle_ratio"));
                    uploadData.setStdLeftArmMuscleUpper(user.getDouble("std_left_arm_muscle_upper"));
                    uploadData.setStdLeftArmMuscleLower(user.getDouble("std_left_arm_muscle_lower"));
                    uploadData.setRightArmMuscle(user.getDouble("right_arm_muscle"));
                    uploadData.setRightArmMuscleIdeale(user.getDouble("right_arm_muscle_ideale"));
                    uploadData.setRightArmMuscleRatio(user.getDouble("right_arm_muscle_ratio"));
                    uploadData.setStdRightArmMuscleUpper(user.getDouble("std_right_arm_muscle_upper"));
                    uploadData.setStdRightArmMuscleLower(user.getDouble("std_right_arm_muscle_lower"));
                    uploadData.setTorsoMuscle(user.getDouble("torso_muscle"));
                    uploadData.setTorsoMuscleIdeale(user.getDouble("torso_muscle_ideale"));
                    uploadData.setTorsoMuscleRatio(user.getDouble("torso_muscle_ratio"));
                    uploadData.setStdTorsoMuscleUpper(user.getDouble("std_torso_muscle_upper"));
                    uploadData.setStdTorsoMuscleLower(user.getDouble("std_torso_muscle_lower"));
                    uploadData.setLeftLegMuscle(user.getDouble("left_leg_muscle"));
                    uploadData.setLeftLegMuscleIdeale(user.getDouble("left_leg_muscle_ideale"));
                    uploadData.setLeftLegMuscleRatio(user.getDouble("left_leg_muscle_ratio"));
                    uploadData.setStdLeftLegMuscleUpper(user.getDouble("std_left_leg_muscle_upper"));
                    uploadData.setStdLeftLegMuscleLower(user.getDouble("std_left_leg_muscle_lower"));
                    uploadData.setRightLegMuscle(user.getDouble("right_leg_muscle"));
                    uploadData.setRightLegMuscleIdeale(user.getDouble("right_leg_muscle_ideale"));
                    uploadData.setRightLegMuscleRatio(user.getDouble("right_leg_muscle_ratio"));
                    uploadData.setStdRightLegMuscleUpper(user.getDouble("std_right_leg_muscle_upper"));
                    uploadData.setStdRightLegMuscleLower(user.getDouble("std_right_leg_muscle_lower"));
                    uploadData.setLeftArmFat(user.getDouble("left_arm_fat"));
                    uploadData.setLeftArmFatIdeale(user.getDouble("left_arm_fat_ideale"));
                    uploadData.setLeftArmFatRatio(user.getDouble("left_arm_fat_ratio"));
                    uploadData.setStdLeftArmFatUpper(user.getDouble("std_left_arm_fat_upper"));
                    uploadData.setStdLeftArmFatLower(user.getDouble("std_left_arm_fat_lower"));
                    uploadData.setRightArmFat(user.getDouble("right_arm_fat"));
                    uploadData.setRightArmFatIdeale(user.getDouble("right_arm_fat_ideale"));
                    uploadData.setRightArmFatRatio(user.getDouble("right_arm_fat_ratio"));
                    uploadData.setStdRightArmFatUpper(user.getDouble("std_right_arm_fat_upper"));
                    uploadData.setStdRightArmFatLower(user.getDouble("std_right_arm_fat_lower"));
                    uploadData.setTorsoFat(user.getDouble("torso_fat"));
                    uploadData.setTorsoFatIdeale(user.getDouble("torso_fat_ideale"));
                    uploadData.setTorsoFatRatio(user.getDouble("torso_fat_ratio"));
                    uploadData.setStdTorsoFatUpper(user.getDouble("std_torso_fat_upper"));
                    uploadData.setStdTorsoFatLower(user.getDouble("std_torso_fat_lower"));
                    uploadData.setLeftLegFat(user.getDouble("left_leg_fat"));
                    uploadData.setLeftLegFatIdeale(user.getDouble("left_leg_fat_ideale"));
                    uploadData.setLeftLegFatRatio(user.getDouble("left_leg_fat_ratio"));
                    uploadData.setStdLeftLegFatUpper(user.getDouble("std_left_leg_fat_upper"));
                    uploadData.setStdLeftLegFatLower(user.getDouble("std_left_leg_fat_lower"));
                    uploadData.setRightLegFat(user.getDouble("right_leg_fat"));
                    uploadData.setRightLegFatIdeale(user.getDouble("right_leg_fat_ideale"));
                    uploadData.setRightLegFatRatio(user.getDouble("right_leg_fat_ratio"));
                    uploadData.setStdRightLegFatUpper(user.getDouble("std_right_leg_fat_upper"));
                    uploadData.setStdRightLegFatLower(user.getDouble("std_right_leg_fat_lower"));
                    uploadData.setWeightControl(user.getDouble("weight_control"));
                    uploadData.setFatControl(user.getDouble("fat_control"));
                    uploadData.setSinewControl(user.getDouble("sinew_control"));
                    uploadData.setArmSinewLimbBalance(user.getInteger("arm_sinew_limb_balance"));
                    uploadData.setLegSinewLimbBalance(user.getInteger("leg_sinew_limb_balance"));
                    uploadData.setArmLegSinewLimbBalance(user.getInteger("arm_leg_sinew_limb_balance"));
                    uploadData.setArmBodyStrength(user.getInteger("arm_body_strength"));
                    uploadData.setLegBodyStrength(user.getInteger("leg_body_strength"));
                    uploadData.setArmLegBodyStrength(user.getInteger("arm_leg_body_strength"));
                    uploadDataDao.save(uploadData);
                    success_data_timestamp_list.add(tmp);
                }catch (Exception e){
                    e.printStackTrace();
                    failed_data_timestamp_list.add(tmp);
                }
            }
        } catch (Exception e){
            e.printStackTrace();
        }
        result.put("success_data_timestamp_list",success_data_timestamp_list);
        result.put("failed_data_timestamp_list",failed_data_timestamp_list);
        return result;
    }
    /**
     * 批量上传青少年测量数据
     */
    public JSONObject teeny_data_upload_data(String params){
        JSONObject result = new JSONObject();
        JSONArray success_data_timestamp_list = new JSONArray();//保存成功的数据标识列表
        JSONArray failed_data_timestamp_list = new JSONArray();//保存失败的数据标识列表,需要注意返回失败的数据后续会⼀直重复上传。若需阻抗⽆需保存的数据后续不再重复上传,服务端可在success_data_timestamp_list字段中回复
        try{
            JSONObject jsonObject = JSON.parseObject(params);
            JSONArray measurements = jsonObject.getJSONArray("measurements");
            Date now = new Date();
            for (int i=0;i<measurements.size();i++){
                JSONObject user = measurements.getJSONObject(i);
                String user_code = user.getString("user_code");
                Long timestamp = user.getLong("timestamp");
                JSONObject tmp = new JSONObject();
                tmp.put("user_code",user_code);
                tmp.put("timestamp",timestamp);
                try {
                    RuncoboTeenyUploadData uploadData = new RuncoboTeenyUploadData();
                    uploadData.setCreateTime(now);
                    uploadData.setSn(user.getString("sn"));// sn Y string 设备序列号
                    uploadData.setCreateMode(user.getInteger("create_mode"));
                    uploadData.setTimestamp(user.getLong("timestamp"));
                    uploadData.setUserCode(user_code);
                    uploadData.setGender(user.getInteger("gender"));
                    uploadData.setAge(user.getInteger("age"));
                    uploadData.setHeight(user.getDouble("height"));
                    uploadData.setWeight(user.getDouble("weight"));
                    uploadData.setStdWeight(user.getDouble("std_weight"));
                    uploadData.setIdealWeight(user.getDouble("ideal_weight"));
                    uploadData.setMinWeight(user.getDouble("min_weight"));
                    uploadData.setMaxWeight(user.getDouble("max_weight"));
                    uploadData.setStdWeightLower(user.getDouble("std_weight_lower"));
                    uploadData.setStdWeightUpper(user.getDouble("std_weight_upper"));
                    uploadData.setWaterIndex(user.getInteger("weight_index"));
                    uploadData.setBmi(user.getDouble("bmi"));
                    uploadData.setStdBmi(user.getDouble("std_bmi"));
                    uploadData.setModerateBmi(user.getDouble("moderate_bmi"));
                    uploadData.setMildBmi(user.getDouble("mild_bmi"));
                    uploadData.setFatBmi(user.getDouble("fat_bmi"));
                    uploadData.setFatnessBmi(user.getDouble("fatness_bmi"));
                    uploadData.setBmiIndex(user.getInteger("bmi_index"));
                    uploadData.setBodyfat(user.getDouble("bodyfat"));
                    uploadData.setStdBodyfat(user.getDouble("std_bodyfat"));
                    uploadData.setLowBodyfat(user.getDouble("low_bodyfat"));
                    uploadData.setMildBodyfat(user.getDouble("mild_bodyfat"));
                    uploadData.setModerateBodyfat(user.getDouble("moderate_bodyfat"));
                    uploadData.setServereBodyfat(user.getDouble("servere_bodyfat"));
                    uploadData.setBodyfatIndex(user.getInteger("bodyfat_index"));
                    uploadData.setLbm(user.getDouble("lbm"));
                    uploadData.setStdLbm(user.getDouble("std_lbm"));
                    uploadData.setMinLbm(user.getDouble("min_lbm"));
                    uploadData.setMaxLbm(user.getDouble("max_lbm"));
                    uploadData.setStdLbmLower(user.getDouble("std_lbm_lower"));
                    uploadData.setStdLbmUpper(user.getDouble("std_lbm_upper"));
                    uploadData.setLbmIndex(user.getDouble("lbm_index"));
                    uploadData.setWater(user.getDouble("water"));
                    uploadData.setStdWater(user.getDouble("std_water"));
                    uploadData.setMinWater(user.getDouble("min_water"));
                    uploadData.setMaxWater(user.getDouble("max_water"));
                    uploadData.setStdWaterLower(user.getDouble("std_water_lower"));
                    uploadData.setStdWaterUpper(user.getDouble("std_water_upper"));
                    uploadData.setWaterIndex(user.getInteger("water_index"));
                    uploadData.setBmr(user.getInteger("bmr"));
                    uploadData.setStdBmrLower(user.getInteger("std_bmr_lower"));
                    uploadData.setStdBmrUpper(user.getInteger("std_bmr_upper"));
                    uploadData.setBmrIndex(user.getInteger("bmr_index"));
                    uploadData.setMuscle(user.getDouble("muscle"));
                    uploadData.setStdMuscle(user.getDouble("std_muscle"));
                    uploadData.setMinMuscle(user.getDouble("min_muscle"));
                    uploadData.setMaxMuscle(user.getDouble("max_muscle"));
                    uploadData.setStdMuscleLower(user.getDouble("std_muscle_lower"));
                    uploadData.setStdMuscleUpper(user.getDouble("std_muscle_upper"));
                    uploadData.setMuscleIndex(user.getInteger("muscle_index"));
                    uploadData.setSinew(user.getDouble("sinew"));
                    uploadData.setStdSinew(user.getDouble("std_sinew"));
                    uploadData.setMinSinew(user.getDouble("min_sinew"));
                    uploadData.setMaxSinew(user.getDouble("max_sinew"));
                    uploadData.setStdSinewLower(user.getDouble("std_sinew_lower"));
                    uploadData.setStdSinewUpper(user.getDouble("std_sinew_upper"));
                    uploadData.setSinewIndex(user.getInteger("sinew_index"));
                    uploadData.setBone(user.getDouble("bone"));
                    uploadData.setStdBone(user.getDouble("std_bone"));
                    uploadData.setMinBone(user.getDouble("min_bone"));
                    uploadData.setMaxBone(user.getDouble("max_bone"));
                    uploadData.setStdBoneLower(user.getDouble("std_bone_lower"));
                    uploadData.setStdBoneUpper(user.getDouble("std_bone_upper"));
                    uploadData.setBoneIndex(user.getInteger("bone_index"));
                    uploadData.setProtein(user.getDouble("protein"));
                    uploadData.setStdProtein(user.getDouble("std_protein"));
                    uploadData.setMinProtein(user.getDouble("min_protein"));
                    uploadData.setMaxProtein(user.getDouble("max_protein"));
                    uploadData.setStdProteinLower(user.getDouble("std_protein_lower"));
                    uploadData.setStdProteinUpper(user.getDouble("std_protein_upper"));
                    uploadData.setProteinIndex(user.getInteger("protein_index"));
                    uploadData.setFat(user.getDouble("fat"));
                    uploadData.setStdFat(user.getDouble("std_fat"));
                    uploadData.setMinFat(user.getDouble("min_fat"));
                    uploadData.setMaxFat(user.getDouble("max_fat"));
                    uploadData.setStdFatLower(user.getDouble("std_fat_lower"));
                    uploadData.setStdFatUpper(user.getDouble("std_fat_upper"));
                    uploadData.setFatIndex(user.getInteger("fat_index"));
                    uploadData.setObesity(user.getInteger("obesity"));
                    uploadData.setMinObesity(user.getInteger("min_obesity"));
                    uploadData.setMaxObesity(user.getInteger("max_obesity"));
                    uploadData.setThinObesity(user.getInteger("thin_obesity"));
                    uploadData.setFatObesity(user.getInteger("fat_obesity"));
                    uploadData.setFatnessObesity(user.getInteger("fatness_obesity"));
                    uploadData.setObesityIndex(user.getInteger("obesity_index"));
                    uploadData.setWeightControl(user.getDouble("weight_control"));
                    uploadData.setFatControl(user.getDouble("fat_control"));
                    uploadData.setSinewControl(user.getDouble("sinew_control"));
                    uploadData.setBodyshape(user.getInteger("bodyshape"));
                    uploadData.setScore(user.getInteger("score"));
                    uploadData.setWaterMass(user.getDouble("water_mass"));
                    uploadData.setStdWaterMass(user.getDouble("std_water_mass"));
                    uploadData.setMinWaterMass(user.getDouble("min_water_mass"));
                    uploadData.setMaxWaterMass(user.getDouble("max_water_mass"));
                    uploadData.setStdWaterMassLower(user.getDouble("std_water_mass_lower"));
                    uploadData.setStdWaterMassUpper(user.getDouble("std_water_mass_upper"));
                    uploadData.setWaterIndex(user.getInteger("water_mass_index"));
                    uploadData.setProteinMass(user.getDouble("protein_mass"));
                    uploadData.setStdProteinMass(user.getDouble("std_protein_mass"));
                    uploadData.setMinProteinMass(user.getDouble("min_protein_mass"));
                    uploadData.setMaxProteinMass(user.getDouble("max_protein_mass"));
                    uploadData.setStdProteinMassLower(user.getDouble("std_protein_mass_lower"));
                    uploadData.setStdProteinMassUpper(user.getDouble("std_protein_mass_upper"));
                    uploadData.setProteinMassIndex(user.getInteger("protein_mass_index"));
                    uploadData.setMuscleIndex(user.getInteger("muscle_mass"));
                    uploadData.setStdMuscleMass(user.getDouble("std_muscle_mass"));
                    uploadData.setMinMuscleMass(user.getDouble("min_muscle_mass"));
                    uploadData.setMaxMuscleMass(user.getDouble("max_muscle_mass"));
                    uploadData.setStdMuscleMassLower(user.getDouble("std_muscle_mass_lower"));
                    uploadData.setStdMuscleMassUpper(user.getDouble("std_muscle_mass_upper"));
                    uploadData.setMuscleMassIndex(user.getInteger("muscle_mass_index"));
                    teenyUploadDataDao.save(uploadData);
                    success_data_timestamp_list.add(tmp);
                }catch (Exception e){
                    e.printStackTrace();
                    failed_data_timestamp_list.add(tmp);
                }
            }
        } catch (Exception e){
            e.printStackTrace();
        }
        result.put("success_data_timestamp_list",success_data_timestamp_list);
        result.put("failed_data_timestamp_list",failed_data_timestamp_list);
        return result;
    }
    //加密
    public String encryptStr(String plaintext) throws Exception{
        return AesCbcUtils.encryptStr(plaintext,aesKey,aesIv);
    }
    //解密
    public String decryptStr(String encrypted) throws Exception{
        return AesCbcUtils.decryptStr(encrypted,aesKey,aesIv);
    }
}

+ 89 - 0
svr/svr-iot/src/main/java/com/yihu/iot/datainput/util/AesCbcUtils.java

@ -0,0 +1,89 @@
package com.yihu.iot.datainput.util;
import com.alibaba.fastjson.JSONObject;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class AesCbcUtils {
    private static final String ALGORITHM = "AES";
    private static final String TRANSFORMATION = "AES/CBC/NoPadding";
    private static final int BLOCK_SIZE = 16;
    public static void main(String[] args) throws Exception {
        String key = "yol202302l6qn133";
        String iv = "yol2023king02160";
        JSONObject json = new JSONObject();//get_from_user_id
        json.put("sn","002106");
        json.put("user_code","test");
        String get_from_user_id = "{\"user_code\":\"test\",\"sn\":\"002106\"}";
        String save_user_list = "{\"sn\":\"002106\",\"user_list\":[{\"user_code\":\"test1\",\"gender\":1,\"height_unit\":1,\"update_timestamp\":1,\"create_timestamp\":1,\"account_name\":\"test\",\"create_mode\":1,\"age\":1,\"height\":1.0}]}";
        String delete_user_list = "{\"sn\":\"002106\",\"user_code_list\":[\"test1\"]}";
        String get_from_user_list = "{\"last_timestamp\":0,\"sn\":\"002106\"}";
        String upload_data = "{\"last_timestamp\":0,\"sn\":\"002106\"}";//批量上传
        String teeny_upload_data = "{\"last_timestamp\":0,\"sn\":\"002106\"}";//青少年批量上传
        String plaintext = json.toJSONString();
        // 加密
        byte[] encrypted = encrypt(plaintext, key, iv);
        System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(encrypted));
        System.out.println("Encrypted2: " + encryptStr(get_from_user_list, key, iv));
        // 输出示例: bH0vUu7F6I/zdX2ySgwCiRDw7JbWKjFJDDzLRwIDRH3cr3spwdRnT3dTr8BnrqnL
        // 解密
        String ss = "EnNaR2BBavnCL2ZY1W//lyQJCmniY5c9NiJ31vFt+jz+5HpGLoji3ZD7AUPco+oA";
        String decrypted = decrypt(Base64.getDecoder().decode(ss), key, iv);
        System.out.println("Decrypted: " + decrypted);
        System.out.println("Decrypted2: " + decryptStr(ss,key,iv));
    }
    private static byte[] addZeroPadding(byte[] data) {
        int paddingLength = BLOCK_SIZE - (data.length % BLOCK_SIZE);
        if (paddingLength == BLOCK_SIZE) return data;
        byte[] padded = new byte[data.length + paddingLength];
        System.arraycopy(data, 0, padded, 0, data.length);
        return padded;
    }
    private static byte[] removeZeroPadding(byte[] data) {
        int i = data.length - 1;
        while (i >= 0 && data[i] == 0) i--;
            byte[] unpadded = new byte[i + 1];
            System.arraycopy(data, 0, unpadded, 0, unpadded.length);
            return unpadded;
    }
    public static byte[] encrypt(String plaintext, String key, String ivStr) throws Exception {
        byte[] paddedData = addZeroPadding(plaintext.getBytes());
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
        IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes());
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
        return cipher.doFinal(paddedData);
    }
    public static String decrypt(byte[] encrypted, String key, String ivStr) throws Exception {
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
        IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes());
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
        byte[] decrypted = cipher.doFinal(encrypted);
        byte[] unpadded = removeZeroPadding(decrypted);
        return new String(unpadded, StandardCharsets.UTF_8);
    }
    public static String encryptStr(String plaintext, String key, String ivStr) throws Exception {
        byte[] paddedData = addZeroPadding(plaintext.getBytes());
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
        IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes());
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
        byte[] encrypted = cipher.doFinal(paddedData);
        return Base64.getEncoder().encodeToString(encrypted);
    }
    public static String decryptStr(String encrypted, String key, String ivStr) throws Exception {
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
        IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes());
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
        byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(encrypted));
        byte[] unpadded = removeZeroPadding(decrypted);
        return new String(unpadded, StandardCharsets.UTF_8);
    }
}