基于Android的医院预下单叫号排队系统

Posted FranzLiszt1847

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Android的医院预下单叫号排队系统相关的知识,希望对你有一定的参考价值。

效果视频

提前下单

RecyclerView双列表联动

商品选购界面采用的是两个RecyclerView联动,使用一个第三方封装包BaseQuickAdapter

导入BaseQuickAdapter

一、添加库

maven { url "https://jitpack.io" }

二、添加依赖

implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'

商品信息实体类

GoodsTitle为左侧商品类型实体类
GoodsContent为右侧商品信息实体类
GoodsTitle、GoodsContent都有一个id字段,为左右联动而设置

public class Goods {
    private List<GoodsTitle> titleList;
    private List<GoodsContent> contentList;
    public static class GoodsTitle{
        private String Title;
        private int id;
        public GoodsTitle(String Title,int id){
            this.Title = Title;
            this.id = id;
        }
        public String getTitle() {
            return Title;
        }
        public void setTitle(String title) {
            Title = title;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }
    }
    public static class GoodsContent{
        private int GoodsIMG;
        private String Content;
        private String Specs;
        private double Price;
        private int Number;
        private int AddIMG;
        private int SubIMG;
        private String Type;
        private int subId;
        public GoodsContent(int GoodsIMG,String Content,String Specs,double Price,int AddIMG,int SubIMG,int Number,int subId){
            this.GoodsIMG = GoodsIMG;
            this.Content = Content;
            this.Specs = Specs;
            this.Price = Price;
            this.AddIMG = AddIMG;
            this.SubIMG = SubIMG;
            this.Number = Number;
            this.subId = subId;
        }

        public int getGoodsIMG() {
            return GoodsIMG;
        }

        public void setGoodsIMG(int goodsIMG) {
            GoodsIMG = goodsIMG;
        }

        public String getContent() {
            return Content;
        }

        public void setContent(String content) {
            Content = content;
        }

        public String getSpecs() {
            return Specs;
        }

        public void setSpecs(String specs) {
            Specs = specs;
        }

        public double getPrice() {
            return Price;
        }

        public void setPrice(double price) {
            Price = price;
        }

        public int getAddIMG() {
            return AddIMG;
        }

        public void setAddIMG(int addIMG) {
            AddIMG = addIMG;
        }

        public int getSubIMG() {
            return SubIMG;
        }

        public void setSubIMG(int subIMG) {
            SubIMG = subIMG;
        }

        public String getType() {
            return Type;
        }

        public void setType(String type) {
            Type = type;
        }

        public int getNumber() {
            return Number;
        }

        public void setNumber(int number) {
            Number = number;
        }

        public int getSubId() {
            return subId;
        }

        public void setSubId(int subId) {
            this.subId = subId;
        }
    }

}

左侧商品类型适配器

public class titleAdapter extends BaseQuickAdapter<Goods.GoodsTitle, BaseViewHolder> {
    public int Position;

    public titleAdapter(int layoutResId, @Nullable List<Goods.GoodsTitle> data) {
        super( layoutResId, data );
    }

    public titleAdapter(@Nullable List<Goods.GoodsTitle> data) {
        super( data );
    }

    public titleAdapter(int layoutResId) {
        super( layoutResId );
    }

    @Override
    protected void convert(BaseViewHolder helper, Goods.GoodsTitle item) {
        helper.setTextColor( R.id.title_name,helper.getLayoutPosition() == Position ? Color.parseColor("#ff0000") : Color.parseColor("#000000") );
        helper.setText( R.id.title_name,item.getTitle() );

    }
    public void setSelection(int Position) {
        this.Position = Position;
        notifyDataSetChanged();
    }

右侧商品信息适配器

public class contentAdapter extends BaseQuickAdapter<Goods.GoodsContent, BaseViewHolder> {


    public contentAdapter(int layoutResId, @Nullable List<Goods.GoodsContent> data) {
        super( layoutResId, data );
    }

    public contentAdapter(@Nullable List<Goods.GoodsContent> data) {
        super( data );
    }

    public contentAdapter(int layoutResId) {
        super( layoutResId );
    }

    @Override
    protected void convert(BaseViewHolder helper, Goods.GoodsContent item) {
        helper.setText( R.id.medicineName,item.getContent() );
        helper.setText( R.id.medicineSpecs,item.getSpecs() );
        helper.setText( R.id.medicinePrice,item.getPrice()+"" );
        helper.setText( R.id.Number,item.getNumber()+"" );
        helper.setImageResource( R.id.medicineIMG,item.getGoodsIMG() );
        helper.setImageResource( R.id.Add,item.getAddIMG() );
        helper.setImageResource( R.id.Sub,item.getSubIMG() );
        helper.addOnClickListener( R.id.Add );
        helper.addOnClickListener( R.id.Sub );
    }
}

初始化左右两个RecyclerView

private void InitRecyclerView(){
        titleManager = new LinearLayoutManager( getApplicationContext() );
        mGoodsTitle.setLayoutManager( titleManager );
        titleAdapter = new titleAdapter( R.layout.title_item,titleList );
        mGoodsTitle.setAdapter( titleAdapter );



        contentManager = new LinearLayoutManager( getApplicationContext() );
        mGoodsContent.setLayoutManager( contentManager );
        contentAdapter = new contentAdapter( R.layout.content_item,contentList );
        mGoodsContent.setAdapter( contentAdapter );

    }

传入数据源

private void InitTitle(){
        for (int i = 0; i <resources.listTitleName.length; i++) {
            goodsTitle = new Goods.GoodsTitle( resources.listTitleName[i],i );
            titleList.add( goodsTitle );
        }
    }
    private void InitContent(){
        for (int i = 0; i <resources.medicineContent.length ; i++) {
            /*感冒系列*/
            if ( i < 10){
                goodsContent = new Goods.GoodsContent( resources.medicineImg[i],resources.medicineContent[i],resources.medicineSpec[i],resources.medicinePrice[i],R.drawable.jiahao,R.drawable.jianhao,0,0 );
            }else if (i >= 10 && i < 20){
                /*家庭常用系列*/
                goodsContent = new Goods.GoodsContent( resources.medicineImg[i],resources.medicineContent[i],resources.medicineSpec[i],resources.medicinePrice[i],R.drawable.jiahao,R.drawable.jianhao,0,1);
            }else if (i >=20 && i  < 30){
                /*幸福生活系列*/
                goodsContent = new Goods.GoodsContent( resources.medicineImg[i],resources.medicineContent[i],resources.medicineSpec[i],resources.medicinePrice[i],R.drawable.jiahao,R.drawable.jianhao,0,2);
            }else if (i >= 30 && i < 35){
                /*妇科系列*/
                goodsContent = new Goods.GoodsContent( resources.medicineImg[i],resources.medicineContent[i],resources.medicineSpec[i],resources.medicinePrice[i],R.drawable.jiahao,R.drawable.jianhao,0,3);
            }else if (i >= 35 && i < 40){
                /*男科系列*/
                goodsContent = new Goods.GoodsContent( resources.medicineImg[i],resources.medicineContent[i],resources.medicineSpec[i],resources.medicinePrice[i],R.drawable.jiahao,R.drawable.jianhao,0,4);
            }
            contentList.add( goodsContent );
        }
    }

列表联动

在传入数据时,为左侧每一个类型传入不同的id,右侧商品信息根据数目传入不同的id,在右侧联动左侧时,对左侧id和右侧id进行匹配,然后移动左侧标题栏,实现列表联动

左侧联动右侧
  titleAdapter.setOnItemClickListener( new BaseQuickAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
                titleAdapter.setSelection( position );
                titleAdapter.notifyDataSetChanged();
                contentManager.scrollToPositionWithOffset( resources.listTitleName.length,0 );
               // mGoodsTitle.smoothScrollToPosition( resources.listTitleName.length );
                //contentAdapter.notifyDataSetChanged();
            }
        } );
右侧联动左侧
  mGoodsContent.addOnScrollListener( new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled( recyclerView, dx, dy );
                int firstPosition = contentManager.findFirstVisibleItemPosition();
                goodsContent = contentList.get(firstPosition);
                int subId = goodsContent.getSubId();
                int pos = 0;
                for (int i = 0; i < titleList.size(); i++) {
                    int id = titleList.get(i).getId();
                    if ((subId == id)) {
                        pos = i;
                    }
                }
                titleAdapter.setSelection(pos);
                //mGoodsTitle.scrollToPosition( pos );
                titleAdapter.notifyDataSetChanged();

            }
        } );

子项添加点击

在适配器中添加如下定义,传入需要添加点击事件的子项ID

helper.addOnClickListener( R.id.Add );
 helper.addOnClickListener( R.id.Sub );

源码如下

 /**
     * add childView id
     *
     * @param viewId add the child view id   can support childview click
     * @return if you use adapter bind listener
     * @link {(adapter.setOnItemChildClickListener(listener))}
     * <p>
     * or if you can use  recyclerView.addOnItemTouch(listerer)  wo also support this menthod
     */
    @SuppressWarnings("unchecked")
    public BaseViewHolder addOnClickListener(@IdRes final int viewId) {
        childClickViewIds.add(viewId);
        final View view = getView(viewId);
        if (view != null) {
            if (!view.isClickable()) {
                view.setClickable(true);
            }
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (adapter.getOnItemChildClickListener() != null) {
                        adapter.getOnItemChildClickListener().onItemChildClick(adapter, v, getClickPosition());
                    }
                }
            });
        }

        return this;
    }

然后再实现setOnItemChildClickListener方法即可
点击加号按钮时,商品数量增加,价格也增加,通过修改实体类字段的内容,然后通过如下语句刷新,减号按钮同理

contentAdapter.notifyDataSetChanged();
 contentAdapter.setOnItemChildClickListener( new BaseQuickAdapter.OnItemChildClickListener() {
            @Override
            public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
                double  Price = contentList.get( position ).getPrice();
                switch (view.getId()){
                    case R.id.Add:
                        int numberAdd = contentList.get( position ).getNumber();
                        numberAdd++;
                        Monetary(Price);
                        contentList.get( position ).setNumber( numberAdd );
                        contentAdapter.notifyDataSetChanged();
                        //Toast.makeText( FunctionActivity.this,"Add"+Price,Toast.LENGTH_SHORT ).show();
                        break;
                    case R.id.Sub:
                        int numberSub = contentList.get( position ).getNumber();
                        if (numberSub > 0 ){
                            numberSub--;
                            contentList.get( position ).setNumber( numberSub );
                            LessMoney(Price);
                        }else if (numberSub < 0){
                            contentList.get( position ).setNumber( 0 );
                        }
                        contentAdapter.notifyDataSetChanged();
                        //Toast.makeText( FunctionActivity.this,"Sub"+Price,Toast.LENGTH_SHORT ).show();
                        break;
                }
            }
        } );

选中的商品插入与显示

效果图

将选中的商品,存入数据库

创建数据库实体类
public class GoodsList {
        private int Img;
        private String Name;
        private double Price;
        private int Number;
        private int Sub;
        private int Add;
        public GoodsList(int Img,String Name,double Price,int Number,int Sub,int Add){
            this.Img = Img;
            this.Name = Name;
            this.Price = Price;
            this.Number = Number;
            this.Sub = Sub;
            this.Add = Add;
        }
        public GoodsList(int Img,String Name,double Price,int Number){
            this.Img = Img;
            this.Name = Name;
            this.Price = Price;
            this.Number = Number;
        }

        public int getImg() {
            return Img;
        }

        public void setImg(int img) {
            Img = img;
        }

        public String getName() {
            return Name;
        }

        public void setName(String name) {
            Name = name;
        }

        public double getPrice() {
            return Price;
        }

        public void setPrice(double price) {
            Price = price;
        }

        public int getNumber() {
            return Number;
        }

        public void setNumber(int number) {
            Number = number;
        }

        public int getSub() {
            return Sub;
        }

        public void setSub(int sub) {
            Sub = sub;
        }

        public int getAdd() {
            return Add;
        }

        public void setAdd(int add) {
            Add = add;
        }

}

建表
public class Helper extends SQLiteOpenHelper {
    /**数据库名称*/
    public static final String DataBase = "HospitalSystem.db";
    public static final SQLiteDatabase.CursorFactory factory = null;
    public static int version = 5;
    /**表名1*/
    public static final String TableName = "GoodsList";
    /**行名*/
    public static final String Row_ID = "ID";
    public static final String Row_GoodsImg = "GoodsImg";
    public static final String Row_GoodsName = "GoodsName";
    public static final String Row_GoodsPrice = "GoodsPrice";
    public static final String Row_GoodsNumber = "GoodsNumber";
    public static final String Row_GoodsSub = "GoodsSub";
    public static final String Row_GoodsAdd= "GoodsAdd";



    public Helper(@Nullable Context context) {
        super( context, DataBase, factory, version );
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table " + TableName + "("+Row_ID+" INTEGER primary key AUTOINCREMENT,"+Row_GoodsImg+" INTEGER, "+Row_GoodsName+" varchar(20),"+Row_GoodsPrice+" REAL,"+Row_GoodsNumber+" INTEGER,"+Row_GoodsSub+" NUMERIC,"+Row_GoodsAdd+" NUMERIC);";
        //String sql_Information = "create table " + InformationTable + "("+Row_InformationAddress+" varchar(20) primary key, "+Row_InformationParkType+" varchar(20),"+Row_InformationShareMode+" varchar(20),"+Row_InformationLastName+" varchar(20),"+Row_InformationSex+" varchar(20),"+Row_InformationPhone+" varchar(20));";
        db.execSQL( sql );
        //db.execSQL( sql_Information );
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        switch (oldVersion){
            case 4:
                String sql = "create table " + TableName + "("+Row_ID+" INTEGER primary key AUTOINCREMENT,"+Row_GoodsImg+" INTEGER, "+Row_GoodsName+" varchar(20),"+Row_GoodsPrice+" REAL,"+Row_GoodsNumber+" INTEGER,"+Row_GoodsSub+" NUMERIC,"+Row_GoodsAdd+" NUMERIC);";
                db.execSQL( sql );
            case 5:
                String sql5 = "create table " + TableName + "("+Row_ID+" INTEGER primary key AUTOINCREMENT,"+Row_GoodsImg+" INTEGER, "+Row_GoodsName+" varchar(20),"+Row_GoodsPrice+" REAL,"+Row_GoodsNumber+" INTEGER,"+Row_GoodsSub+" NUMERIC,"+Row_GoodsAdd+" NUMERIC);";
                db.execSQL( sql5 );
        }
        //db.execSQL("drop table if exists "+TableName);
        //db.execSQL("drop table if exists "+InformationTable);
        //onCreate(db);
    }
}
建立Dao类,封装CRUD
public class Dao {
    public static final String TAG = "DataBase";
    private Helper helper ;
    private SQLiteDatabase DB;
    public Dao(Context context)
    {
        helper = new Helper(context);
    }
    public void Insert(GoodsList goodsList){
        DB = helper.getReadableDatabase();
        if (DB.isOpen())
        {
            ContentValues values = new ContentValues();
            values.put( Helper.Row_GoodsImg,goodsList.getImg());
            values.put( Helper.Row_GoodsName,goodsList.getName());
            values.put( Helper.Row_GoodsNumber,goodsList.getNumber());
            values.put( Helper.Row_GoodsPrice,goodsList.getPrice());
            values.put( Helper.Row_GoodsSub,goodsList.getSub() );
            values.put( Helper.Row_GoodsAdd,goodsList.getAdd() );
            long RowId = DB.replace(Helper.TableName,null,values);
            if(RowId == -1)
                Log.i(TAG, "数据插入失败!");
            else
                Log.i(TAG, "数据插入成功!"+RowId);
        }
    }
    //根据序号删除数据
    //当前id为暂不为序号
    public void Delete(){
        DB = helper.getReadableDatabase();
        if (DB.isOpen()){
            String whereClause = null;
            String[] whereArgs = null;
            int count = DB.delete(Helper.TableName, whereClause, whereArgs);
            if (count > 0)
                Log.i(TAG, "删除了: " + count + "行");
            else
                Log.i(Helper.TableName, "数据未删除!");
            DB.close(); // 数据库关闭
        }
    }
//    public void Update(Account account){
//        DB = helper.getWritableDatabase();
//        if(DB.isOpen()) {   // 如果数据库打开, 执行更新的操作
//            ContentValues values = new ContentValues();
//            //values.put( Helper.Row_Account,account.getUserID());
//            values.put( Helper.Row_UserName,account.getUserName());
//            //values.put( Helper.Row_PassWord,account.getPassWord());
//            values.put( Helper.Row_Sex,account.getSex());
//            values.put( Helper.Row_PhoneNumber,account.getPhoneNumber());
//            int count  = DB.update(Helper.TableName, values, "Account = ?", new String[]{account.getUserID() + ""});
//            if (count > 0)
//                Log.i(TAG, "修改了: " + count + "行");
//            else
//                Log.i(Helper.TableName, "数据未删除!");
//            DB.close(); // 数据库关闭
//        }
//    }
//    public String Query(String Account){
//        DB = helper.getReadableDatabase();
//        //selection查询子句的条件,可以使用主键查询
//        String[] columns = {Helper.Row_Account,Helper.Row_PassWord};  // 需要的列
//        String selection = "Account = ?";
//        String[] selectionArgs = {Account + ""};
//        Cursor cursor = DB.query(Helper.TableName,columns,selection,selectionArgs,null,null,null);
//        if (cursor.moveToFirst())
//        {
//                //String _id = cursor.getString(0);
//                String Content = cursor.getString(cursor.getColumnIndex( Helper.Row_PassWord ));
//                return Content;
//        }
//        DB.close();
//        return null;
//    }
    public List<GoodsList> QueryAll() {
        DB = helper.getReadableDatabase();  // 获得一个只读的数据库对象
        if(DB.isOpen()) {
            String[] columns = {Helper.Row_GoodsImg, Helper.Row_GoodsName,Helper.Row_GoodsNumber,Helper.Row_GoodsPrice};  // 需要的列
            String selection = null;    // 选择条件, 给null查询所有
            String[] selectionArgs = null;  // 选择条件的参数, 会把选择条件中的? 替换成数据中的值
            String groupBy = null;  // 分组语句  group by name
            String having = null;   // 过滤语句
            String orderBy = null;  // 排序
            Cursor cursor = DB.query(Helper.TableName, columns, selection, selectionArgs, groupBy, having, orderBy);
            int mImg;
            String mName;
            double mPrice;
            int mNumber;
            int Add;
            int Sub;
            if(cursor != null && cursor.getCount() > 0) {
                List<GoodsList> goodsLists = new ArrayList<GoodsList>();
                while(cursor.moveToNext()) {    // 向下移一位, 知道最后一位, 不可以往下移动了, 停止.
                    mImg = cursor.getInt(cursor.getColumnIndex( "GoodsImg" ));
                    mName = cursor.getString(cursor.getColumnIndex( "GoodsName" ));
                    mPrice = cursor.getDouble(cursor.getColumnIndex( "GoodsPrice"));
                    mNumber = cursor.getInt(cursor.getColumnIndex( "GoodsNumber"));
                    Add =  R.drawable.jiahao;
                    Sub = R.drawable.jianhao;
                    goodsLists.add(new GoodsList(mImg,mName,mPrice,mNumber,Sub,Add));
                }
                DB.close();
                return goodsLists;
            }
            DB.close();
        }
        return null;
    }
}
插入选中的商品信息至数据库

通过判断选中商品数量,将大于0的商品信息插入数据库

private void GotoSettlement(){
        for (int i = 0; i <contentList.size() ; i++) {
            int num = contentList.get( i ).getNumber();
            if (num > 0){
                /*插入数据为null*/
                //Toast.makeText( context,""+num,Toast.LENGTH_SHORT ).show();
                goodsList = new GoodsList( contentList.get( i ).getGoodsIMG(),contentList.get( i ).getContent(),contentList.get( i ).getPrice(),contentList.get( i ).getNumber(),R.drawable.jianhao,R.drawable.jiahao );
                dao.Insert( goodsList );
            }
        }
    }
取出选中的商品信息从数据库
private void InitData(){
        goodsLists = dao.QueryAll();
        for (int i = 0; i <goodsLists.size() ; i++) {
            goodsList = new GoodsList( goodsLists.get( i ).getImg(),goodsLists.get( i ).getName(),goodsLists.get( i ).getPrice(),goodsLists.get( i ).getNumber(),goodsLists.get( i ).getSub(),goodsLists.get( i ).getAdd() );
            dataList.add( goodsList );
        }
    }

显示选中的商品

同样使用RecyclerView展示,实体类、适配器等省略

效果图
子项数量为0删除子项

在适配器中添加如下方法

public void subPrice(List<GoodsList> item,double price,int position,int number){
        number--;
        if (number > 0){
            totalPrice -= price;
             item.get( position ).setNumber( number );
        }else {
           item.remove( position );
        }
        notifyDataSetChanged();
    }
子项清空

添加如下方法

public void removeAllItem(List<GoodsList> item){
            item.removeAll( item );
            notifyDataSetChanged();
    }
商品总数统计
public int TotalNumber(List<GoodsList> item){
        int num = 0;
        for (int i = 0; i <item.size() ; i++) {
            num += item.get( i ).getNumber();
        }
        return num;
    }
商品总价统计
public double TotalPrice(List<GoodsList> item){
        double totalPrice = 0;
        for (int i = 0; i < item.size(); i++) {
            int num = item.get( i ).getNumber();
            double price = item.get( i ).getPrice();
            totalPrice += num * price;
        }
        return totalPrice;
    }

排队系统

参考另外一篇博客排队系统

优雅谢幕

killProcess

杀死所有Activity,添加如下类

public class killProcess extends Application {
    private List<Activity> activityList = new ArrayList<>(  );
    public void addActivity(Activity activity) {
        activityList.add(activity);
    }
    public void finishAll() {
        for (Activity activity : activityList) {
            if (!activity.isFinishing()) {
                activity.finish();
            }
        }
    }
}

应用

添加Activity

在每一个Activity的onCreate方法使用如下语句

 killProcess = new killProcess();
 killProcess.addActivity( GoodsListActivity.this );

杀死所有Activity

killProcess.finishAll();

尾言

花花世界,其心不恒,淤泥不染尚不可为之,唯独善其身,远离喧嚣。

以上是关于基于Android的医院预下单叫号排队系统的主要内容,如果未能解决你的问题,请参考以下文章

叫号系统排队系统挂号系统实现(JAVA队列)

谁能用C#设计一个银行排队叫号系统,简单的就行。需要程序文件和源代码。如果有好心人请发到1064635202qq

数据结构课设:银行排队系统模拟

简单模拟医院叫号系统

数学建模基于matlab银行多机排队论模型含Matlab源码 1096期

关于银行排队叫号机设置的问题