package com.basic.security.manager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.text.TextUtils; import android.util.Base64; import com.basic.security.base.BaseApplication; import com.basic.security.manager.es.ReadConfig; import com.basic.security.model.ModelAdapter; import com.basic.security.model.Org; import com.basic.security.model.Person; import com.basic.security.model.PersonA; import com.basic.security.utils.Base64Util; import com.basic.security.utils.BasicIdUtil; import com.basic.security.utils.BitmapHolder; import com.basic.security.utils.CompareFeatureResult; import com.basic.security.utils.Constants; import com.basic.security.utils.ExcelUtil; import com.basic.security.utils.FaceId; import com.basic.security.utils.FastDFSUtil; import com.basic.security.utils.SocketUtil; import com.basic.security.utils.ToastUtil; import org.androidannotations.api.BackgroundExecutor; import org.json.JSONArray; import org.json.JSONObject; import org.xutils.common.Callback; import org.xutils.http.RequestParams; import org.xutils.x; import java.io.ByteArrayOutputStream; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static com.basic.security.model.Sync.needSync; public class PersonManager extends BaseManager { static Map findPersonByIdMap = new HashMap<>(); static long lastFindPersonById = System.currentTimeMillis(); static BitmapHolder bitmapHolder = new BitmapHolder(); public static void savePerson(ModelAdapter person) { removePersonFromCache(person); save(person); GuestManager.updateGuestName(person); // uploadToTemporary(person.getId()); } public static void uploadToTemporary(String personId) { BackgroundExecutor.execute(new BackgroundExecutor.Task("", 0, "") { public void execute() { try { ModelAdapter savedPerson = PersonManager.findById("person", personId); RequestParams params = new RequestParams("http://" + ReadConfig.getInstance().getTempHost() + ":" + ReadConfig.getInstance().getTempPort() + "" + ReadConfig.getInstance().getTempUrl() + ""); params.addHeader("Content-Type", "application/json-rpc"); JSONArray jsonArray = new JSONArray(); JSONObject jsonObject = new JSONObject(); jsonObject.put("id", savedPerson.getId()); jsonObject.put("name", savedPerson.getString("name")); //姓名(可空) jsonObject.put("cardId", savedPerson.getString("id_card_number")); //身份证号(可以不准) jsonObject.put("gender", savedPerson.getString("")); //性别(可空) jsonObject.put("phone", savedPerson.getString("phone")); //手机号(可空) jsonObject.put("distributionIds", savedPerson.getString("")); //集群id(必需) jsonObject.put("distributionNames", savedPerson.getString("")); //集群名称(必需) jsonObject.put("deviceId", DeviceManager.getDeviceId()); //设备id:例如: DSPAD010120181101(类似这种之前统一规定的设备id) String camera_image_fastdfs_path = savedPerson.getString("camera_image_fastdfs_path"); if (camera_image_fastdfs_path == null || camera_image_fastdfs_path.length() == 0) { byte[] camera_image_path = savedPerson.getBlob("camera_image_path"); if (camera_image_path != null && camera_image_path != null) { String picPath = FastDFSUtil.upLoadVisitorPic(camera_image_path, System.currentTimeMillis()); savedPerson.setString("camera_image_fastdfs_path", picPath); } } jsonObject.put("photos", savedPerson.getString("camera_image_fastdfs_path")); //图片的fstdfs路径(必需) byte[] camera_image_feature = savedPerson.getBlob("camera_image_feature"); if (camera_image_feature != null && camera_image_feature != null) { jsonObject.put("featureBase64", Base64.encodeToString(camera_image_feature, Base64.NO_WRAP)); //图片的特征值(必需) } jsonArray.put(jsonObject); String bodyJsonContent = jsonArray.toString(); params.setBodyContent(bodyJsonContent); params.setAsJsonContent(true); x.http().post(params, new Callback.CommonCallback() { public void onSuccess(String result) { } public void onError(Throwable ex, boolean isOnCallback) { ex.printStackTrace(); System1.out.println("httponError"); } public void onCancelled(CancelledException cex) { System1.out.println("httponCancelled"); } public void onFinished() { } }); } catch (Exception e) { System1.out.println("PersonManager.execute " + e.getMessage()); // e.printStackTrace(); } } }); } //删除人员 public static void deletePerson(ModelAdapter person) { try { if ("1".equals(person.getString("auto_init"))) { return; } if (Constants.deletePersonPhysical) { String camera_image_path = ModelAdapter.getAttachmentPath(person.getId(), Person.camera_image_path, Person.tableName); if (!TextUtils.isEmpty(camera_image_path)) { File camera_image_path_file = new File(camera_image_path); if (camera_image_path_file.exists()) { camera_image_path_file.delete(); } } } FeatureManager.removeFeature(person.getString(Person.id)); PersonIdentityManager.deletePersonIdentityByPersonId(person.getString(Person.id)); PersonAManager.deletePersonAByPerson(person); if (Constants.deletePersonPhysical) { deletePhysically(person); } else { deleteWithDelFlag(person); } removePersonFromCache(person); SocketUtil.rpcCallDeletePerson(person); if (Constants.isIndoor) { GuestManager.removePersonId(person.getString(Person.id)); } } catch (Exception e) { e.printStackTrace(); } } public static void deletePersonList(List modelAdapterList) { for (ModelAdapter modelAdapter : modelAdapterList) { deletePerson(modelAdapter); } } //获取所有人员信息的列表 public static List getPersonList(String sign_up_status) { List allPersonList = new ArrayList<>(); String del_flag = "0"; if (syncTableNames.contains("person")) { del_flag = Base64Util.encodeToString("person", "del_flag", del_flag); sign_up_status = Base64Util.encodeToString("person", "sign_up_status", sign_up_status); } List documentList = findList("select * from person where name!='系统管理员' and del_flag ='" + del_flag + "' and sign_up_status='" + sign_up_status + "' order by sign_up_time desc"); // 过滤掉不是本设备的系统管理员 for (ModelAdapter person : documentList) { if (!"1".equals(person.getString("auto_init")) || ("1".equals(person.getString("auto_init")) && DeviceManager.getDeviceId().equals(person.getString("device_id")))) { // 过滤掉人脸特征为空的人 if (person.getBlob("camera_image_feature") != null || ("1".equals(person.getString("auto_init")) && DeviceManager.getDeviceId().equals(person.getString("device_id")))) { allPersonList.add(person); } } } return allPersonList; } public static void removePersonFromCache(ModelAdapter person) { try { String personId = person.getString(Person.id); findPersonByIdMap.remove(personId); } catch (Exception e) { e.printStackTrace(); } } public static ModelAdapter findPersonById(String personId) { try { ModelAdapter person = findPersonByIdMap.get(personId); if (System.currentTimeMillis() - lastFindPersonById < 1000 && person != null) { return person; } else { person = findById("person", personId); findPersonByIdMap.put(personId, person); lastFindPersonById = System.currentTimeMillis(); } return person; } catch (Exception e) { e.printStackTrace(); } return null; } // 获取含有特定身份的所有人员 public static List getIdentityPersonList(List allPersonList, Map checkedIdentityMap) { List allPersonIdList = new ArrayList<>();// 获取符合身份的所有人员信息 List personList = new ArrayList<>(); Map checkedPerson = new HashMap<>(); personList.clear(); allPersonIdList.clear(); checkedPerson.clear(); // 获取符合身份的所有人员信息 for (String ruleId : checkedIdentityMap.keySet()) { allPersonIdList.addAll(findList("select * from person_identity where identity_id='" + ruleId + "'")); } for (int j = 0; j < allPersonList.size(); j++) { for (int i = 0; i < allPersonIdList.size(); i++) { if (allPersonList.get(j).getId().equals(allPersonIdList.get(i).getString("person_id")) && !checkedPerson.containsKey(allPersonIdList.get(i).getString("person_id"))) { checkedPerson.put(allPersonIdList.get(i).getString("person_id"), allPersonList.get(j)); ModelAdapter person = allPersonList.get(j); if (person != null) { personList.add(person); } } } } return personList; } public static void reFindPerson(CompareFeatureResult compareFeatureResult) { try { if (compareFeatureResult != null && compareFeatureResult.person != null) { compareFeatureResult.person = PersonManager.findPersonById(compareFeatureResult.personId); } if (compareFeatureResult != null && compareFeatureResult.person == null) { compareFeatureResult.personId = ""; } } catch (Exception e) { try { if (compareFeatureResult != null) { compareFeatureResult.person = null; compareFeatureResult.personId = ""; } } catch (Exception e2) { e2.printStackTrace(); } e.printStackTrace(); } } // 人员注册时选中的为有效时间内通行,返回的为可以通行的时间规则 public static List getValidSignUpRuleList(ModelAdapter person) { List checkedTimeRuleList = new ArrayList<>(); String checked_time_rule_id = person.getString("checked_time_rule_id"); if (!TextUtils.isEmpty(checked_time_rule_id)) { if (TimeRuleManager.timeRuleIsValid(checked_time_rule_id)) { ModelAdapter checked_time_rule = findById("time", checked_time_rule_id); checkedTimeRuleList.add(checked_time_rule); } } return checkedTimeRuleList; } // 人员注册时选中的为有效时间内通行,提前多久提示,返回的为可以通行的时间规则 public static List getValidSignUpRuleListButTimeNotReach(ModelAdapter person) { List checkedTimeRuleList = new ArrayList<>(); long noReachTime = HintDoorAccessManager.getNoReachTime(); String checked_time_rule_id = person.getString("checked_time_rule_id"); if (!TextUtils.isEmpty(checked_time_rule_id)) { // if (TimeRuleManager.timeRuleIsValid(checked_time_rule_id),noReachTime * 1000){ if (TimeRuleManager.timeRuleIsValid(checked_time_rule_id, noReachTime * 60 * 1000)) { ModelAdapter checked_time_rule = findById("time", checked_time_rule_id); checkedTimeRuleList.add(checked_time_rule); } } return checkedTimeRuleList; } public static List findPersonList(String sql) { return findList(sql); } public static ModelAdapter findByNameAndOrgId(String personName, String personOrgId) { return findOne("select * from " + Person.tableName + " where " + Person.name + "='" + personName + "' " + "and " + Person.org_id + "='" + personOrgId + "'"); } public static void importPersonList(String dirPath) { Map photoFileMap = new HashMap<>(); File dir = new File(dirPath); File[] files = dir.listFiles(); File excelFile = null; for (File file : files) { String fileName = file.getName(); if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg") || fileName.endsWith(".png") || fileName.endsWith(".JPG") ) { fileName = fileName.substring(0, fileName.lastIndexOf('.')); photoFileMap.put(fileName, file); } if (fileName.endsWith(".xls") || fileName.endsWith(".xlsx")) { excelFile = file; } } if (photoFileMap.size() == 0) { ToastUtil.show("选择的文件夹中没有人脸照片"); return; } ExcelUtil.parseExcel(excelFile, photoFileMap); } private static byte[] cropImage(int x1, int y1, int x2, int y2, Bitmap frameBitmap) { float ratio = 0.8f; int enlargeWidth = (int) (ratio * (x2 - x1)); int enlargeHeight = (int) (ratio * (y2 - y1)); x1 = x1 - enlargeWidth / 2; x2 = x2 + enlargeWidth / 2; y1 = y1 - enlargeHeight / 2; y2 = y2 + enlargeHeight / 2; if (x1 < 0) { x1 = 0; } if (y1 < 0) { y1 = 0; } if (x2 > frameBitmap.getWidth()) { x2 = frameBitmap.getWidth(); } if (y2 > frameBitmap.getHeight()) { y2 = frameBitmap.getHeight(); } int width = (x2 - x1); int height = (y2 - y1); if (width > frameBitmap.getWidth()) { width = frameBitmap.getWidth(); } if (height > frameBitmap.getHeight()) { height = frameBitmap.getHeight(); } Bitmap bitmap = null; if (frameBitmap != null) { bitmap = frameBitmap; } byte[] faceData = null; if (bitmap != null) { bitmapHolder.storeBitmap(bitmap); bitmapHolder.cropBitmap(x1, y1, x2, y2); Bitmap faceBitmap = bitmapHolder.getBitmapAndFree(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); faceBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); faceData = stream.toByteArray(); if (faceBitmap != null && !faceBitmap.isRecycled()) { faceBitmap.recycle(); } } return faceData; } public static ModelAdapter savePicToDatabase(File file, String orgId) { try { String _name = file.getName(); String filePath = file.getAbsolutePath();//获取文件路径 String fileName = file.getName().substring(0, _name.lastIndexOf("."));//获取文件名 Bitmap bitmap = BitmapFactory.decodeFile(filePath); BaseApplication.getApplication().detectLock.lock(); String facePosition = FaceId.instance.facePosition(file.getAbsolutePath()); if (facePosition.length() <= 0) { System1.out.println("SaveTestData.run 没有找到人脸"); return null; } String[] rectFace = facePosition.split(","); byte[] faceJpgData = cropImage(Integer.parseInt(rectFace[0]), Integer.parseInt(rectFace[1]), Integer.parseInt(rectFace[2]), Integer.parseInt(rectFace[3]), bitmap); byte[] featureData = FaceId.instance.extractFeature(file.getAbsolutePath()); BaseApplication.getApplication().detectLock.unlock(); if (featureData == null) { System1.out.println("SaveTestData.run 提取特征失败! 请检查SDK是否初始化"); return null; } String compareResultStr = FeatureManager.compareFeature(featureData, Constants.minRecognizeScore); String personId = compareResultStr.split(",", -1)[0]; if (!TextUtils.isEmpty(personId)) { return findById(Person.tableName, personId); } ModelAdapter person = new ModelAdapter() .setString(Person.id, BasicIdUtil.getPersonId(featureData)) .setString("name", fileName) .setString("sign_up_status", "已注册") .setString("verify_status", "不需要验证身份证") .setString("sign_up_method", "统一导入") .setString("sign_up_time", System.currentTimeMillis() + "") .setString("device_id", DeviceManager.getDeviceId()) .setString("company_id", CompanyManager.getCompanyId()) .setString(Person.org_id, orgId) .setString("table", "person"); person.setString(Person.device_id, DeviceManager.getDeviceId()); person.setString(Person.company_id, CompanyManager.getCompanyId()); person.setBlob("camera_image_feature", featureData); person.setBlob("camera_image_path", faceJpgData); PersonManager.savePerson(person); FeatureManager.addFeature(person.getId(), featureData); return person; } catch (Exception e) { e.printStackTrace(); } return null; } public static List filterByOrgId(List personList, String selectedOrgId) { if (!TextUtils.isEmpty(selectedOrgId)) { List newPersonList = new ArrayList<>(); for (ModelAdapter person : personList) { String person_org_ids = person.getString(Person.org_ids); if (person_org_ids != null && person_org_ids.contains(Org.separator + selectedOrgId + Org.separator)) { newPersonList.add(person); } } return newPersonList; } return personList; } public static List findPersonContainsOrgId(String orgId) { return findList("select * from person where " + Person.org_ids + " like '%" + Org.separator + orgId + Org.separator + "%'"); } public static void insertPersonFromPersonA(ModelAdapter personA) { class InsertPersonFromPersonAHelper { public void addPerson() { ModelAdapter person = new ModelAdapter(); person.setString(Person.camera_image_feature_path, ""); person.setString(Person.student_id, ""); person.setString(Person.checked_time_rule_id, ""); person.setString(Person.sign_up_rule, ""); person.setString(Person.org_id, ""); person.setString(Person.org_ids, ""); person.setString(Person.id, personA.getString(PersonA.id)); person.setString(Person.name, personA.getString(PersonA.personName)); person.setString(Person.camera_image_feature, personA.getString(PersonA.faceFeature)); person.setString(Person.phone, personA.getString(PersonA.phoneNum)); person.setString(Person.sign_up_time, System.currentTimeMillis() + ""); person.setString(Person.sign_up_status, "已注册"); person.setString(Person.auto_init, "0"); person.setString(Person.table, Person.tableName); person.setString(Person.del_flag, "0"); person.setString(Person.update_time, System.currentTimeMillis() + ""); person.setString(Person.id_card_number, personA.getString(PersonA.idCard)); person.setString(Person.verify_status, "不需要验证身份证"); person.setString(Person.camera_image_bitmap, ""); person.setString(Person.camera_image_fastdfs_path, ""); person.setString(Person.id_card_image_path, ""); person.setString(Person.id_card_image_feature, ""); person.setString(Person.type, ""); person.setString(Person.sign_up_method, "分析导入"); person.setString(Person.guest_allow_start_time, ""); person.setString(Person.all_device, "1"); person.setString(Person.company_id, CompanyManager.getCompanyId()); person.setString(Person.device_id, DeviceManager.getDeviceId()); person.setString(Person.respondent_ids, ""); person.setString(Person.respondent_names, ""); person.setString(Person.guest_visit_status, ""); person.setString(Person.guest_visit_valid_time, ""); person.setString(Person.guest_exit_time, ""); person.setString(Person.guest_enter_time, ""); person.setString(Person.guest_visit_reason, ""); person.setString(Person.guest_remark, ""); person.setString(Person.id, personA.getId()); person.setString(needSync, Constants.FALSE); if (person.getString(Person.del_flag).equals("0")) { byte[] feature = person.getBlob(Person.camera_image_feature); if (feature != null && feature.length > 10) { FeatureManager.addFeature(person.getId(), feature); } } else { FeatureManager.removeFeature(person.getId()); } savePerson(person); } public void updatePerson(ModelAdapter dbPerson) { dbPerson.setString(Person.id, personA.getString(PersonA.id)); dbPerson.setString(Person.name, personA.getString(PersonA.personName)); dbPerson.setString(Person.camera_image_feature, personA.getString(PersonA.faceFeature)); dbPerson.setString(Person.phone, personA.getString(PersonA.phoneNum)); dbPerson.setString(Person.sign_up_time, System.currentTimeMillis() + ""); dbPerson.setString(Person.verify_status, "已注册"); dbPerson.setString(Person.auto_init, "0"); dbPerson.setString(Person.table, Person.tableName); dbPerson.setString(Person.del_flag, "0"); PersonCameraImagePathManager.download_camera_image_path(personA.getString(PersonA.personPicUrl), dbPerson); if (dbPerson.getString(Person.del_flag).equals("0")) { byte[] feature = dbPerson.getBlob(Person.camera_image_feature); if (feature != null && feature.length > 10) { FeatureManager.addFeature(dbPerson.getId(), feature); } } else { FeatureManager.removeFeature(dbPerson.getId()); } dbPerson.setString(needSync, Constants.FALSE); savePerson(dbPerson); } public void addPersonA() { personA.setString(needSync, Constants.FALSE); PersonAManager.savePersonA(personA); } public void updatePersonA(ModelAdapter dbPersonA) { personA.setString(needSync, Constants.FALSE); dbPersonA.setString(needSync, Constants.FALSE); PersonAManager.savePersonA(personA); } public void execute() { ModelAdapter dbPerson = PersonManager.findPersonById(personA.getString(PersonA.id)); if (dbPerson == null) { addPerson(); } else { updatePerson(dbPerson); } ModelAdapter dbPersonA = PersonAManager.findPersonAById(personA.getString(PersonA.id)); if (dbPersonA == null) { addPersonA(); } else { updatePersonA(dbPersonA); } } } new InsertPersonFromPersonAHelper().execute(); String identities = personA.getString(PersonA.identities); PersonIdentityManager.reSavePersonIdentities(personA.getString(PersonA.id), identities); ModelAdapter personAType = PersonATypeManager.findPersonATypeById(personA.getString(PersonA.tableId)); } public static void updatePersonFromPersonA(ModelAdapter personA) { insertPersonFromPersonA(personA); } public static void deletePersonFromPersonA(ModelAdapter personA) { insertPersonFromPersonA(personA); } public static int getNotSignUpCount() { return findList("select * from " + Person.tableName + " where " + Person.sign_up_status + "='未注册'").size(); } }