Explorar o código

增加网络请求框架,数据库存储框架,默认头像,获取部门数据,自定义圆形头像,

ifengouy %!s(int64=2) %!d(string=hai) anos
pai
achega
04a70e60fd

+ 1 - 0
app/build.gradle

@@ -41,6 +41,7 @@ dependencies {
     implementation files('libs\\zkandroididcardreader.jar')
     implementation files('libs\\zkandroidcore.jar')
     implementation files('libs\\universal-image-loader-1.9.3.jar')
+    implementation files('libs\\lite-orm-1.9.2.jar')
     testImplementation 'junit:junit:4.+'
     androidTestImplementation 'androidx.test.ext:junit:1.1.2'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

BIN=BIN
app/libs/lite-orm-1.9.2.jar


+ 2 - 0
app/src/main/AndroidManifest.xml

@@ -36,6 +36,8 @@
         <activity android:name=".activity.VisitorRegisterAc" />
         <activity android:name=".activity.SettingAc" />
         <activity android:name=".activity.NoCardRegActivity" />
+
+        <service android:name=".service.PullDataService" />
     </application>
 
 </manifest>

+ 147 - 5
app/src/main/java/com/sunwin/visitorapp/activity/VisitorRegisterAc.java

@@ -5,16 +5,54 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ArrayAdapter;
 import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
 import android.widget.Spinner;
+import android.widget.TextView;
 
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.request.RequestOptions;
+import com.nostra13.universalimageloader.core.ImageLoader;
 import com.sunwin.visitorapp.BaseActivity;
 import com.sunwin.visitorapp.R;
+import com.sunwin.visitorapp.model.UploadRecordResultInfo;
+import com.sunwin.visitorapp.net.ApiService;
+import com.sunwin.visitorapp.net.BaseRsult;
+import com.sunwin.visitorapp.net.RetrofitUtil;
+import com.sunwin.visitorapp.utils.AppUtil;
 import com.sunwin.visitorapp.utils.Constant;
+import com.sunwin.visitorapp.utils.ConvertUtil;
+import com.sunwin.visitorapp.utils.TimeUtils;
 import com.sunwin.visitorapp.view.UINav;
 
-public class VisitorRegisterAc extends BaseActivity {
+import okhttp3.MediaType;
+import okhttp3.RequestBody;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
 
-   private String currentFacePath;//人脸照片
+public class VisitorRegisterAc extends BaseActivity implements View.OnClickListener {
+
+    private String currentFacePath;//人脸照片
+    private UINav mUINav;
+    private ImageView mImageVisitorPhoto;
+    private TextView mTextVisitorName;
+    private TextView mTextVisitorIdCode;
+    private LinearLayout mViewForm;
+    private LinearLayout mViewFormVisitor;
+    private EditText mEditPhone;
+    private EditText mComeReason;
+    private EditText mEditCompany;
+    private EditText mEditCarPlate;
+    private EditText mEditVisitTimeBegin;
+    private EditText mEditVisitTimeEnd;
+    private EditText mEditVisitNumber;
+    private EditText mEditVisitPeopleCount;
+    private EditText mEditICCode;
+    private LinearLayout mViewFormVisitorBy;
+    private EditText mEditByVisitPeople;
+    private EditText mEditByVisitDepartment;
+    private TextView mTextButtonSure;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -32,11 +70,9 @@ public class VisitorRegisterAc extends BaseActivity {
         ArrayAdapter<String> adpter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, ctype);
         adpter.setDropDownViewResource(android.R.layout.simple_spinner_item);
 
-        //获取Spinner组件,
-        Spinner spinner = (Spinner) findViewById(R.id.SpinnerReason);
-        spinner.setAdapter(adpter);
 
 
+        initView();
     }
 
 
@@ -56,4 +92,110 @@ public class VisitorRegisterAc extends BaseActivity {
             }
         }
     }
+
+    private void initView() {
+        mImageVisitorPhoto = (ImageView) findViewById(R.id.ImageVisitorPhoto);
+        mTextVisitorName = (TextView) findViewById(R.id.TextVisitorName);
+        mTextVisitorIdCode = (TextView) findViewById(R.id.TextVisitorIdCode);
+        mViewForm = (LinearLayout) findViewById(R.id.ViewForm);
+        mViewFormVisitor = (LinearLayout) findViewById(R.id.ViewFormVisitor);
+        mEditPhone = (EditText) findViewById(R.id.EditPhone);
+        mComeReason =  findViewById(R.id.comeReason);
+        mEditCompany = (EditText) findViewById(R.id.EditCompany);
+        mEditCarPlate = (EditText) findViewById(R.id.EditCarPlate);
+        mEditVisitTimeBegin = (EditText) findViewById(R.id.EditVisitTimeBegin);
+        mEditVisitTimeEnd = (EditText) findViewById(R.id.EditVisitTimeEnd);
+        mEditVisitNumber = (EditText) findViewById(R.id.EditVisitNumber);
+        mEditVisitPeopleCount = (EditText) findViewById(R.id.EditVisitPeopleCount);
+        mEditICCode = (EditText) findViewById(R.id.EditICCode);
+        mViewFormVisitorBy = (LinearLayout) findViewById(R.id.ViewFormVisitorBy);
+        mEditByVisitPeople = (EditText) findViewById(R.id.EditByVisitPeople);
+        mEditByVisitDepartment = (EditText) findViewById(R.id.EditByVisitDepartment);
+        findViewById(R.id.TextButtonSure).setOnClickListener(this);
+
+       showHead(currentFacePath,mImageVisitorPhoto);
+    }
+    private void showHead(String path,ImageView iv_head) {
+        //显示头像
+        RequestOptions options = new RequestOptions().placeholder(R.mipmap.icon_head).error(R.mipmap.icon_head).override(160, 160);
+        Glide.with(mContext).load(path).apply(options).into(iv_head);
+    }
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()) {
+            case R.id.TextButtonSure:
+                submit();
+                break;
+        }
+    }
+
+    private void submit() {
+        String phone = mEditPhone.getText().toString().trim();
+        String idNum = mTextVisitorIdCode.getText().toString().trim();
+        String name = mTextVisitorName.getText().toString().trim();
+        String cardNum = mEditICCode.getText().toString().trim();
+        String comeReason = mComeReason.getText().toString().trim();
+        String company = mEditCompany.getText().toString().trim();
+        String carPlate = mEditCarPlate.getText().toString().trim();
+        String startTime = mEditVisitTimeBegin.getText().toString().trim();
+        String endTime = mEditVisitTimeEnd.getText().toString().trim();
+        String visitNum = mEditVisitNumber.getText().toString().trim();
+        String visitPeopleNum = mEditVisitPeopleCount.getText().toString().trim();
+        String theVisitPerson = mEditByVisitPeople.getText().toString().trim();
+        String theVisitDpt = mEditByVisitDepartment.getText().toString().trim();
+
+
+        UploadRecordResultInfo.Request parms = new UploadRecordResultInfo.Request();
+//        parms.setTime(TimeUtils.stampToTime(System.currentTimeMillis()));
+//        parms.setDeviceId(AppUtil.getDeviceId());
+//        parms.setInout_flag(1);
+//        parms.setCardNo(cardNum);
+//        parms.setPersonId(resultInfo.getPersonId());
+//
+//        parms.setDeptId(resultInfo.getDepartmentId());
+//        parms.setCategoryId(resultInfo.getCategoryId());
+//        parms.setPersonName(name);
+//        parms.setPersonCode(idNum);
+//        parms.setType();//4刷身份证通过 //6访客通过
+//
+//        parms.setThreshold("70");//
+//        parms.setTemperature("37");
+//        String imaCode = ConvertUtil.bitmapToBase64(ImageLoader.getInstance().loadImageSync(resultInfo.getImageUrl()));
+//        parms.setImgCode(imaCode);
+//        if (!StringUtils.isEmpty(resultInfo.getImageUrl2())) {
+//            String imaCode2 = ConvertUtil.bitmapToBase64(ImageLoader.getInstance().loadImageSync(resultInfo.getImageUrl2()));
+//            parms.setImgCode2(imaCode2);
+//        }
+
+        ApiService apiService = RetrofitUtil.getApiService();
+        MediaType textType = MediaType.parse("text/plain");
+        final RequestBody requestBody = RequestBody.create(textType, RetrofitUtil.bean2Json(parms));
+        Call<BaseRsult<String>> call = apiService.uploadRecord(requestBody);
+        call.enqueue(new Callback<BaseRsult<String>>() {
+            @Override
+            public void onResponse(Call<BaseRsult<String>> call, Response<BaseRsult<String>> response) {
+                try {
+                    if (response.body() == null) {
+                        return;
+                    }
+                    int code = response.body().getCode();
+                    if (code == 0) {
+
+                    } else {
+
+                    }
+
+                } catch (Exception e) {
+
+                }
+            }
+
+            @Override
+            public void onFailure(Call<BaseRsult<String>> call, Throwable t) {
+
+            }
+        });
+    }
+
+
 }

+ 103 - 0
app/src/main/java/com/sunwin/visitorapp/db/DatabaseManager.java

@@ -0,0 +1,103 @@
+package com.sunwin.visitorapp.db;
+
+import com.litesuits.orm.LiteOrm;
+import com.sunwin.visitorapp.BaseApplication;
+
+import java.util.List;
+
+public class DatabaseManager {
+    private String dbName = "visitorapp.db";
+    private static LiteOrm liteOrm;
+    private static DatabaseManager ourInstance = new DatabaseManager();
+
+    private DatabaseManager() {
+        liteOrm = LiteOrm.newCascadeInstance( BaseApplication.getInstance() , dbName ) ;
+    }
+
+    public static DatabaseManager getInstance() {
+        return ourInstance;
+    }
+
+    /**
+     * 插入一条记录
+     * @param t
+     */
+    public <T> long insert(T t) {
+        return liteOrm.save(t);
+    }
+
+    /**
+     * 插入所有记录
+     * @param list
+     */
+    public <T> void insertAll(List<T> list) {
+        liteOrm.save(list);
+    }
+
+    /**
+     * 查询所有
+     * @param cla
+     * @return
+     */
+    public <T> List<T> getQueryAll(Class<T> cla) {
+        return liteOrm.query(cla);
+    }
+
+    /**
+     * 查询  某字段 等于 Value的值
+     * @param cla
+     * @param field
+     * @param value
+     * @return
+     */
+//    public <T> List<T> getQueryByWhere(Class<T> cla, String field, String[] value) {
+//        return liteOrm.<T>query(new QueryBuilder(cla).where(field + "=?", value));
+//    }
+
+    /**
+     * 查询  某字段 等于 Value的值  可以指定从1-20,就是分页
+     * @param cla
+     * @param field
+     * @param value
+     * @param start
+     * @param length
+     * @return
+     */
+//    public <T> List<T> getQueryByWhereLength(Class<T> cla, String field, String[] value, int start, int length) {
+//        return liteOrm.<T>query(new QueryBuilder(cla).where(field + "=?", value).limit(start, length));
+//    }
+
+    /**
+     * 删除一个数据
+     * @param t
+     * @param <T>
+     */
+    public <T> void delete( T t){
+        liteOrm.delete( t ) ;
+    }
+
+    /**
+     * 删除一个表
+     * @param cla
+     * @param <T>
+     */
+    public <T> void delete( Class<T> cla ){
+        liteOrm.delete( cla ) ;
+    }
+
+    /**
+     * 删除集合中的数据
+     * @param list
+     * @param <T>
+     */
+    public <T> void deleteList( List<T> list ){
+        liteOrm.delete( list ) ;
+    }
+
+    /**
+     * 删除数据库
+     */
+    public void deleteDatabase(){
+        liteOrm.deleteDatabase() ;
+    }
+}

+ 1 - 1
app/src/main/java/com/sunwin/visitorapp/fragment/NoCardRegFragment.java

@@ -99,7 +99,7 @@ public class NoCardRegFragment extends BaseFragment implements FaceDetecterView.
                     @Override
                     public void run() {
                         Intent intent = new Intent(mContext, VisitorRegisterAc.class);
-                        intent.putExtra(Constant.IIntentValue.CURRENTFACEPATH, saveFile);
+                        intent.putExtra(Constant.IIntentValue.CURRENTFACEPATH, saveFilePath);
                         startActivity(intent);
                     }
                 }, 500);

+ 61 - 0
app/src/main/java/com/sunwin/visitorapp/model/DepartmentResult.java

@@ -0,0 +1,61 @@
+package com.sunwin.visitorapp.model;
+
+import com.litesuits.orm.db.annotation.Table;
+
+@Table("depart_table")
+public class DepartmentResult{
+
+    /**
+     * categoryCode : DANGWEI
+     * categoryId : 686d8a8d-7e9d-4f20-92c6-da9917f02010
+     * categoryName : 党委书记
+     * status : 0
+     * updateTime : 1593315516351
+     */
+
+    private String categoryCode;
+    private String categoryId;
+    private String categoryName;
+    private int status;
+    private long updateTime;
+
+    public String getCategoryCode() {
+        return categoryCode;
+    }
+
+    public void setCategoryCode(String categoryCode) {
+        this.categoryCode = categoryCode;
+    }
+
+    public String getCategoryId() {
+        return categoryId;
+    }
+
+    public void setCategoryId(String categoryId) {
+        this.categoryId = categoryId;
+    }
+
+    public String getCategoryName() {
+        return categoryName;
+    }
+
+    public void setCategoryName(String categoryName) {
+        this.categoryName = categoryName;
+    }
+
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    public long getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(long updateTime) {
+        this.updateTime = updateTime;
+    }
+}

+ 243 - 0
app/src/main/java/com/sunwin/visitorapp/model/UploadRecordResultInfo.java

@@ -0,0 +1,243 @@
+package com.sunwin.visitorapp.model;
+
+import org.json.JSONObject;
+
+public class UploadRecordResultInfo extends BaseModel {
+    int code;
+    String message;
+    JSONObject result;
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public JSONObject getResult() {
+        return result;
+    }
+
+    public void setResult(JSONObject result) {
+        this.result = result;
+    }
+
+    public static class Request  {
+        String time;
+        String personId;
+        String personName;
+        String personCode;
+        String deviceId;
+        String deptId;
+        String cardNo;
+        String idNum;
+        String imgCode;
+        String imgCode2;
+        String temperature;
+        String threshold;
+        int sex;
+        String nation;  //民族(type为8,9时使用)
+        String depart;  //签发单位(type为8,9时使用)
+        String address;  //地址(type为8,9时使用)
+        String birthday;  //出生日期(type为8,9时使用)
+        private int type2;  //0:不需要审核的;1:需要审核的
+        int inout_flag;//0进 1出
+        int type;
+        String faceCode;//证件照
+        String composeName;
+        String categoryId;
+
+        public int getType2() {
+            return type2;
+        }
+
+        public String getImgCode2() {
+            return imgCode2;
+        }
+
+        public void setImgCode2(String imgCode2) {
+            this.imgCode2 = imgCode2;
+        }
+
+        public void setType2(int type2) {
+            this.type2 = type2;
+        }
+
+        public String getCategoryId() {
+            return categoryId;
+        }
+
+        public void setCategoryId(String categoryId) {
+            this.categoryId = categoryId;
+        }
+
+        public String getComposeName() {
+            return composeName;
+        }
+
+        public void setComposeName(String composeName) {
+            this.composeName = composeName;
+        }
+
+        public String getTemperature() {
+            return temperature;
+        }
+
+        public void setTemperature(String temperature) {
+            this.temperature = temperature;
+        }
+
+        public String getFaceCode() {
+            return faceCode;
+        }
+
+        public void setFaceCode(String faceCode) {
+            this.faceCode = faceCode;
+        }
+
+        public String getNation() {
+            return nation;
+        }
+
+        public int getSex() {
+            return sex;
+        }
+
+        public void setSex(int sex) {
+            this.sex = sex;
+        }
+
+        public void setNation(String nation) {
+            this.nation = nation;
+        }
+
+        public String getDepart() {
+            return depart;
+        }
+
+        public void setDepart(String depart) {
+            this.depart = depart;
+        }
+
+        public String getAddress() {
+            return address;
+        }
+
+        public void setAddress(String address) {
+            this.address = address;
+        }
+
+        public String getBirthday() {
+            return birthday;
+        }
+
+        public void setBirthday(String birthday) {
+            this.birthday = birthday;
+        }
+
+        public int getInout_flag() {
+            return inout_flag;
+        }
+
+        public void setInout_flag(int inout_flag) {
+            this.inout_flag = inout_flag;
+        }
+
+        public String getImgCode() {
+            return imgCode;
+        }
+
+        public void setImgCode(String imgCode) {
+            this.imgCode = imgCode;
+        }
+
+        public String getPersonName() {
+            return personName;
+        }
+
+        public void setPersonName(String personName) {
+            this.personName = personName;
+        }
+
+        public String getCardNo() {
+            return cardNo;
+        }
+
+        public void setCardNo(String cardNo) {
+            this.cardNo = cardNo;
+        }
+
+        public String getIdNum() {
+            return idNum;
+        }
+
+        public void setIdNum(String idNum) {
+            this.idNum = idNum;
+        }
+
+        public String getTime() {
+            return time;
+        }
+
+        public void setTime(String time) {
+            this.time = time;
+        }
+
+        public String getPersonId() {
+            return personId;
+        }
+
+        public void setPersonId(String personId) {
+            this.personId = personId;
+        }
+
+        public String getPersonCode() {
+            return personCode;
+        }
+
+        public void setPersonCode(String personCode) {
+            this.personCode = personCode;
+        }
+
+        public String getDeviceId() {
+            return deviceId;
+        }
+
+        public void setDeviceId(String deviceId) {
+            this.deviceId = deviceId;
+        }
+
+        public int getType() {
+            return type;
+        }
+
+        public void setType(int type) {
+            this.type = type;
+        }
+
+        public String getDeptId() {
+            return deptId;
+        }
+
+        public void setDeptId(String deptId) {
+            this.deptId = deptId;
+        }
+
+        public String getThreshold() {
+            return threshold;
+        }
+
+        public void setThreshold(String threshold) {
+            this.threshold = threshold;
+        }
+    }
+}

+ 11 - 0
app/src/main/java/com/sunwin/visitorapp/net/ApiService.java

@@ -1,5 +1,9 @@
 package com.sunwin.visitorapp.net;
 
+import com.sunwin.visitorapp.model.DepartmentResult;
+
+import java.util.List;
+
 import okhttp3.RequestBody;
 import retrofit2.Call;
 import retrofit2.http.Body;
@@ -10,4 +14,11 @@ public interface ApiService {
     @POST("uploadRecord")
     @Headers({"Content-Type: application/json", "Accept: application/json"})
     Call<BaseRsult<String>> uploadRecord(@Body RequestBody body);
+
+    /**
+     * 获取所有部门
+     */
+    @POST("syncCategorys")
+    @Headers({"Content-Type: application/json", "Accept: application/json"})
+    Call<BaseRsult<List<DepartmentResult>>> getDepartments(@Body RequestBody body);
 }

+ 70 - 0
app/src/main/java/com/sunwin/visitorapp/net/CommonRequest.java

@@ -0,0 +1,70 @@
+package com.sunwin.visitorapp.net;
+
+public class CommonRequest { private long time;
+    private int num;
+    private String deviceId;
+
+    private String personId;//人员id ,
+    private String cardNo;//卡号
+    private int type;//卡号
+
+
+    public CommonRequest() {
+    }
+
+    public CommonRequest(long time, int num, String deviceId) {
+        this.time = time;
+        this.num = num;
+        this.deviceId = deviceId;
+    }
+
+    public long getTime() {
+        return time;
+    }
+
+    public void setTime(long time) {
+        this.time = time;
+    }
+
+    public int getNum() {
+        return num;
+    }
+
+    public void setNum(int num) {
+        this.num = num;
+    }
+
+    public String getDeviceId() {
+        return deviceId;
+    }
+
+    public void setDeviceId(String deviceId) {
+        this.deviceId = deviceId;
+    }
+
+
+
+    public String getPersonId() {
+        return personId;
+    }
+
+    public void setPersonId(String personId) {
+        this.personId = personId;
+    }
+
+    public String getCardNo() {
+        return cardNo;
+    }
+
+    public void setCardNo(String cardNo) {
+        this.cardNo = cardNo;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public void setType(int type) {
+        this.type = type;
+    }
+}

+ 52 - 21
app/src/main/java/com/sunwin/visitorapp/net/RetrofitUtil.java

@@ -4,10 +4,14 @@ import android.text.TextUtils;
 
 
 import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 import com.sunwin.visitorapp.BaseApplication;
 import com.sunwin.visitorapp.utils.Constant;
+import com.sunwin.visitorapp.utils.MD5Util;
+import com.sunwin.visitorapp.utils.TimeUtils;
 
 import java.io.File;
+import java.io.IOException;
 import java.lang.reflect.Type;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -15,9 +19,12 @@ import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 import okhttp3.Cache;
+import okhttp3.Interceptor;
 import okhttp3.MediaType;
 import okhttp3.OkHttpClient;
+import okhttp3.Request;
 import okhttp3.RequestBody;
+import okhttp3.Response;
 import okhttp3.logging.HttpLoggingInterceptor;
 import retrofit2.Retrofit;
 import retrofit2.converter.gson.GsonConverterFactory;
@@ -46,11 +53,39 @@ public class RetrofitUtil {
 
     public static void initRetrofit() {
         try {
-            Retrofit retrofit = new Retrofit.Builder()
-                    .client(initClient())
-                    .addConverterFactory(GsonConverterFactory.create())
+            HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
+            logging.setLevel(HttpLoggingInterceptor.Level.BODY);
+            HeaderInterceptor headerInterceptor = new HeaderInterceptor();
+            // 指定缓存路径,缓存大小100Mb
+            Cache cache = new Cache(new File(BaseApplication.getInstance().getCacheDir(), "HttpCache"),
+                    1024 * 1024 * 100);
+            OkHttpClient okHttpClient = new OkHttpClient.Builder().cache(cache)
+                    .retryOnConnectionFailure(true)
+
+                    .addInterceptor(headerInterceptor)
+                    //                .addInterceptor(sLoggingInterceptor)
+                    //                .addInterceptor(sRewriteCacheControlInterceptor)
+                    .addInterceptor(logging)//logInterceptor
+                    //                .addNetworkInterceptor(sRewriteCacheControlInterceptor)
+                    .connectTimeout(60, TimeUnit.SECONDS)////建立连接的超时时间
+                    .writeTimeout(60, TimeUnit.SECONDS)
+                    .readTimeout(60, TimeUnit.SECONDS)//传递数据的超时时间
+                    .build();
+
+//            String ip = SharePrefenceUtils.getString("serviceIpAdress", Constant.defaultServiceIP);
+//            String port = SharePrefenceUtils.getString("portNumber", Constant.defaultSocketPort);
+//            String url = "http://" + ip + ":" + port;
+
+            Gson gson = new GsonBuilder()
+                    .setLenient()
+                    .create();
 
-//                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
+//            OkHttpClient unsafeOkHttpClient = getUnsafeOkHttpClient();
+            Retrofit retrofit = new Retrofit.Builder()
+                    .client(okHttpClient)
+                    .addConverterFactory(GsonConverterFactory.create(gson))
+                    //                .addConverterFactory(ScalarsConverterFactory.create())
+                    //                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                     .baseUrl(Constant.getSERVER())
                     .build();
             apiService = retrofit.create(ApiService.class);
@@ -60,26 +95,22 @@ public class RetrofitUtil {
 
     }
 
-    public static OkHttpClient initClient() {
-        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
-        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
-
-        // 指定缓存路径,缓存大小100Mb
-        Cache cache = new Cache(new File(BaseApplication.getInstance().getCacheDir(), "HttpCache"),
-                1024 * 1024 * 100);
-        OkHttpClient okHttpClient = new OkHttpClient.Builder().cache(cache)
-                .retryOnConnectionFailure(true)
-                .addInterceptor(logging)//logInterceptor
-//                .addNetworkInterceptor(sRewriteCacheControlInterceptor)
-                .connectTimeout(90, TimeUnit.SECONDS)////建立连接的超时时间
-                .writeTimeout(120, TimeUnit.SECONDS)
-                .readTimeout(120, TimeUnit.SECONDS)//传递数据的超时时间
-                .build();
-        return okHttpClient;
+    public static class HeaderInterceptor implements Interceptor {
+        @Override
+        public Response intercept(Interceptor.Chain chain) throws IOException {
+            long cTime = System.currentTimeMillis();
+            String timeStr = TimeUtils.stampToTime(cTime);
+            Request original = chain.request();
+            Request.Builder requestBuilder = original.newBuilder()
+                    .addHeader("reqSign", MD5Util.getSign(timeStr))
+                    .addHeader("reqTime",timeStr )
+                    .addHeader("account", MD5Util.account);
+            Request request = requestBuilder.build();
+            return chain.proceed(request);
+        }
     }
 
 
-
     public static Map<String, RequestBody> getUploadPicMap(List<String> files) {
         Map<String, RequestBody> bodyMap = new LinkedHashMap<>();
         for (int i = 0; i < files.size(); i++) {

+ 87 - 0
app/src/main/java/com/sunwin/visitorapp/service/PullDataService.java

@@ -0,0 +1,87 @@
+package com.sunwin.visitorapp.service;
+
+import android.content.Intent;
+
+import androidx.annotation.NonNull;
+import androidx.core.app.JobIntentService;
+
+import com.sunwin.visitorapp.model.DepartmentResult;
+import com.sunwin.visitorapp.net.ApiService;
+import com.sunwin.visitorapp.net.BaseRsult;
+import com.sunwin.visitorapp.net.CommonRequest;
+import com.sunwin.visitorapp.net.RetrofitUtil;
+import com.sunwin.visitorapp.utils.AppUtil;
+import com.sunwin.visitorapp.utils.Constant;
+import com.sunwin.visitorapp.utils.LogUtil;
+import com.sunwin.visitorapp.utils.SharePrefenceUtils;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+import okhttp3.MediaType;
+import okhttp3.RequestBody;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+
+public class PullDataService extends JobIntentService {
+    private static final String TAG = "PullDataService";
+
+    @Override
+    protected void onHandleWork(@NonNull @NotNull Intent intent) {
+        LogUtil.e(TAG, "---------------onHandleWork------------------");
+        getDataFromNet();
+    }
+
+    private void getDataFromNet() {
+        getDepartments();
+    }
+
+    private void getDepartments() {
+        ApiService apiService = RetrofitUtil.getApiService();
+        MediaType textType = MediaType.parse("text/plain");
+        RequestBody requestBody = RequestBody.create(textType, RetrofitUtil.bean2Json(new CommonRequest(0, 100, AppUtil.getDeviceId())));
+
+        Call<BaseRsult<List<DepartmentResult>>> call = apiService.getDepartments(requestBody);
+        call.enqueue(new Callback<BaseRsult<List<DepartmentResult>>>() {
+            @Override
+            public void onResponse(Call<BaseRsult<List<DepartmentResult>>> call, Response<BaseRsult<List<DepartmentResult>>> response) {
+                try {
+                    if (response.body() == null) {
+                        return;
+                    }
+                    if (response.body().getCode() != 0) {
+                        return;
+                    }
+                   /* UserCategoryModel.deleteAll();//删除本地无效数据
+                    List<DepartmentResult> list = response.body().getResult();
+                    if (list != null && list.size() > 0) {
+                        //存入最新数据
+                        for (int i = 0; i < list.size(); i++) {
+                            DepartmentResult resultBean = list.get(i);
+                            //新增与编辑
+                            if (resultBean.getStatus() == 0 || resultBean.getStatus() == 1) {
+                                UserCategoryModel userCategoryModel = new UserCategoryModel();
+                                userCategoryModel.setCategoryCode(resultBean.getCategoryCode());
+                                userCategoryModel.setCategoryId(resultBean.getCategoryId());
+                                userCategoryModel.setCategoryName(resultBean.getCategoryName());
+                                userCategoryModel.setStatus(0);
+                                userCategoryModel.setUpdateTime(resultBean.getUpdateTime());
+                                userCategoryModel.save();
+                            }
+                        }
+                        SharePrefenceUtils.putLong("categorys_refreshTime", list.get(list.size() - 1).getUpdateTime());
+                    }*/
+                } catch (Exception e) {
+
+                }
+            }
+
+            @Override
+            public void onFailure(Call<BaseRsult<List<DepartmentResult>>> call, Throwable t) {
+
+            }
+        });
+    }
+}

+ 6 - 0
app/src/main/java/com/sunwin/visitorapp/utils/AppUtil.java

@@ -1,9 +1,15 @@
 package com.sunwin.visitorapp.utils;
 
+import android.os.Build;
+
 import com.sunwin.visitorapp.BaseApplication;
 
 public class AppUtil {
     public static String getPackageName(){
         return BaseApplication.getInstance().getPackageName();
     }
+
+    public  static String getDeviceId(){
+        return Build.SERIAL;
+    }
 }

+ 1 - 1
app/src/main/java/com/sunwin/visitorapp/utils/Constant.java

@@ -17,7 +17,7 @@ public class Constant {
 
     public static int isUse = SharePrefenceUtils.getInt("isUse", 1);
 
-    public static String BASE_HOST = "http://119.39.226.171:20040/";//正式服务器
+    public static String BASE_HOST = "192.168.31.7:8080/";//正式服务器
     public static final String SWBINDIR = "/sdcard/models";
     public static final String SWRECODE = "/sdcard/swRecode";
 

+ 77 - 0
app/src/main/java/com/sunwin/visitorapp/utils/MD5Util.java

@@ -0,0 +1,77 @@
+package com.sunwin.visitorapp.utils;
+
+import android.util.Log;
+
+import java.security.MessageDigest;
+
+public class MD5Util {
+    public final static String MD5(String s) {
+        char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+        try {
+            byte[] btInput = s.getBytes();
+            // 获得MD5摘要算法的 MessageDigest 对象
+            MessageDigest mdInst = MessageDigest.getInstance("MD5");
+            // 使用指定的字节更新摘要
+            mdInst.update(btInput);
+            // 获得密文
+            byte[] md = mdInst.digest();
+            // 把密文转换成十六进制的字符串形式
+            int j = md.length;
+            char str[] = new char[j * 2];
+            int k = 0;
+            for (int i = 0; i < j; i++) {
+                byte byte0 = md[i];
+                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
+                str[k++] = hexDigits[byte0 & 0xf];
+            }
+            return new String(str);
+        } catch (Exception e) {
+          e.printStackTrace();
+            return null;
+        }
+    }
+
+    public static String getMd5(String source) {
+        String s = null;
+        char hexDigits[] = { // 用来将字节转换成 16 进制表示的字符
+                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+        try {
+            java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
+            md.update(source.getBytes());
+            byte tmp[] = md.digest(); // MD5 的计算结果是一个 128 位的长整数,
+            // 用字节表示就是 16 个字节
+            char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
+            // 所以表示成 16 进制需要 32 个字符
+            int k = 0; // 表示转换结果中对应的字符位置
+            for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
+                // 转换成 16 进制字符的转换
+                byte byte0 = tmp[i]; // 取第 i 个字节
+                str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
+                // >>>
+                // 为逻辑右移,将符号位一起右移
+                str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
+            }
+            s = new String(str); // 换后的结果转换为字符串
+
+        } catch (Exception e) {
+            Log.e("error", e.toString());
+        }
+        return s;
+    }
+
+    public static String getSign(String cTime) {
+        String sign = getMd5(privateKey + account + pwd + cTime);
+        return sign;
+    }
+
+    public static final String privateKey = "mwWAH2eUAAHodlRt";
+    public static final String account = "adminA";
+    public static final String pwd = "admin";
+
+    public static void main(String[] args) {
+
+
+        String sign = getMd5("mwWAH2eUAAHodlRtadminAadmin2022-02-16 10:34:01");
+        System.out.println("sign ="+sign);
+    }
+}

+ 198 - 0
app/src/main/java/com/sunwin/visitorapp/view/MyRoundImageView.java

@@ -0,0 +1,198 @@
+package com.sunwin.visitorapp.view;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.NinePatchDrawable;
+import android.util.AttributeSet;
+
+import androidx.appcompat.widget.AppCompatImageView;
+
+public class MyRoundImageView extends AppCompatImageView {
+    private int mBorderThickness = 0;
+    private Context mContext;
+    private int defaultColor = 0xFFFFFFFF;
+    // 如果只有其中一个有值,则只画一个圆形边框
+    private int mBorderOutsideColor = 0;
+    private int mBorderInsideColor = 0;
+    // 控件默认长、宽
+    private int defaultWidth = 0;
+    private int defaultHeight = 0;
+
+    public MyRoundImageView(Context context) {
+        super(context);
+        mContext = context;
+    }
+
+    public MyRoundImageView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        mContext = context;
+        setCustomAttributes(attrs);
+    }
+
+    public MyRoundImageView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        mContext = context;
+        setCustomAttributes(attrs);
+    }
+
+    private void setCustomAttributes(AttributeSet attrs) {
+
+//		TypedArray a = mContext.obtainStyledAttributes(attrs,R.styleable.roundedimageview);
+//		mBorderThickness = a.getDimensionPixelSize(R.styleable.roundedimageview_border_thickness, 0);
+//		mBorderOutsideColor = a.getColor(R.styleable.roundedimageview_border_outside_color,defaultColor);
+//		mBorderInsideColor = a.getColor(R.styleable.roundedimageview_border_inside_color, defaultColor);
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        Drawable drawable = getDrawable();
+        if (drawable == null) {
+            return;
+        }
+
+        if (getWidth() == 0 || getHeight() == 0) {
+            return;
+        }
+        this.measure(0, 0);
+        if (drawable.getClass() == NinePatchDrawable.class)
+            return;
+        Bitmap b = ((BitmapDrawable) drawable).getBitmap();
+        Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);
+        if (defaultWidth == 0) {
+            defaultWidth = getWidth();
+
+        }
+        if (defaultHeight == 0) {
+            defaultHeight = getHeight();
+        }
+        // 保证重新读取图片后不会因为图片大小而改变控件宽、高的大小(针对宽、高为wrap_content布局的imageview,但会导致margin无效)
+        // if (defaultWidth != 0 && defaultHeight != 0) {
+        // LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
+        // defaultWidth, defaultHeight);
+        // setLayoutParams(params);
+        // }
+        int radius = 0;
+        if (mBorderInsideColor != defaultColor
+                && mBorderOutsideColor != defaultColor) {// 定义画两个边框,分别为外圆边框和内圆边框
+            radius = (defaultWidth < defaultHeight ? defaultWidth
+                    : defaultHeight) / 2 - 2 * mBorderThickness;
+            // 画内圆
+            drawCircleBorder(canvas, radius + mBorderThickness / 2,
+                    mBorderInsideColor);
+            // 画外圆
+            drawCircleBorder(canvas, radius + mBorderThickness
+                    + mBorderThickness / 2, mBorderOutsideColor);
+        } else if (mBorderInsideColor != defaultColor
+                && mBorderOutsideColor == defaultColor) {// 定义画一个边框
+            radius = (defaultWidth < defaultHeight ? defaultWidth
+                    : defaultHeight) / 2 - mBorderThickness;
+            drawCircleBorder(canvas, radius + mBorderThickness / 2,
+                    mBorderInsideColor);
+        } else if (mBorderInsideColor == defaultColor
+                && mBorderOutsideColor != defaultColor) {// 定义画一个边框
+            radius = (defaultWidth < defaultHeight ? defaultWidth
+                    : defaultHeight) / 2 - mBorderThickness;
+            drawCircleBorder(canvas, radius + mBorderThickness / 2,
+                    mBorderOutsideColor);
+        } else {// 没有边框
+            radius = (defaultWidth < defaultHeight ? defaultWidth
+                    : defaultHeight) / 2;
+        }
+        Bitmap roundBitmap = getCroppedRoundBitmap(bitmap, radius);
+        canvas.drawBitmap(roundBitmap, defaultWidth / 2 - radius, defaultHeight
+                / 2 - radius, null);
+    }
+
+    /**
+     * 获取裁剪后的圆形图片
+     *
+     * @param radius
+     *            半径
+     */
+    public Bitmap getCroppedRoundBitmap(Bitmap bmp, int radius) {
+        Bitmap scaledSrcBmp;
+        int diameter = radius * 2;
+
+        // 为了防止宽高不相等,造成圆形图片变形,因此截取长方形中处于中间位置最大的正方形图片
+        int bmpWidth = bmp.getWidth();
+        int bmpHeight = bmp.getHeight();
+        int squareWidth = 0, squareHeight = 0;
+        int x = 0, y = 0;
+        Bitmap squareBitmap;
+        if (bmpHeight > bmpWidth) {// 高大于宽
+            squareWidth = squareHeight = bmpWidth;
+            x = 0;
+            y = (bmpHeight - bmpWidth) / 2;
+            // 截取正方形图片
+            squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,
+                    squareHeight);
+        } else if (bmpHeight < bmpWidth) {// 宽大于高
+            squareWidth = squareHeight = bmpHeight;
+            x = (bmpWidth - bmpHeight) / 2;
+            y = 0;
+            squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,
+                    squareHeight);
+        } else {
+            squareBitmap = bmp;
+        }
+
+        if (squareBitmap.getWidth() != diameter
+                || squareBitmap.getHeight() != diameter) {
+            scaledSrcBmp = Bitmap.createScaledBitmap(squareBitmap, diameter,
+                    diameter, true);
+
+        } else {
+            scaledSrcBmp = squareBitmap;
+        }
+        Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(),
+                scaledSrcBmp.getHeight(), Bitmap.Config.ARGB_8888);
+        Canvas canvas = new Canvas(output);
+
+        Paint paint = new Paint();
+        Rect rect = new Rect(0, 0, scaledSrcBmp.getWidth(),
+                scaledSrcBmp.getHeight());
+
+        paint.setAntiAlias(true);
+        paint.setFilterBitmap(true);
+        paint.setDither(true);
+        canvas.drawARGB(0, 0, 0, 0);
+        canvas.drawCircle(scaledSrcBmp.getWidth() / 2,
+                scaledSrcBmp.getHeight() / 2, scaledSrcBmp.getWidth() / 2,
+                paint);
+        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
+        canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);
+        // bitmap回收(recycle导致在布局文件XML看不到效果)
+        // bmp.recycle();
+        // squareBitmap.recycle();
+        // scaledSrcBmp.recycle();
+        bmp = null;
+        squareBitmap = null;
+        scaledSrcBmp = null;
+        return output;
+    }
+
+    /**
+     * 边缘画圆
+     */
+    private void drawCircleBorder(Canvas canvas, int radius, int color) {
+        Paint paint = new Paint();
+        /* 去锯齿 */
+        paint.setAntiAlias(true);
+        paint.setFilterBitmap(true);
+        paint.setDither(true);
+        paint.setColor(color);
+        /* 设置paint的 style 为STROKE:空心 */
+        paint.setStyle(Paint.Style.STROKE);
+        /* 设置paint的外框宽度 */
+        paint.setStrokeWidth(mBorderThickness);
+        canvas.drawCircle(defaultWidth / 2, defaultHeight / 2, radius, paint);
+    }
+
+}

+ 2 - 2
app/src/main/res/layout/ac_visitor_register.xml

@@ -124,10 +124,10 @@
                             android:layout_weight="1"
                             android:text="来访事由"
                             />
-                        <Spinner
+                        <EditText
                             style="@style/StyleInputContent"
 
-                            android:id="@+id/SpinnerReason"
+                            android:id="@+id/comeReason"
                             android:layout_weight="2"
                             android:layout_width="0dp"
                             android:layout_height="match_parent"/>

BIN=BIN
app/src/main/res/mipmap-xhdpi/icon_head.png