Bläddra i källkod

feat 增加添加设备功能

lihao1 3 år sedan
förälder
incheckning
ab53813820

+ 24 - 4
cadengine/src/main/java/cn/sagacloud/android/cadengine/FloorScene.kt

@@ -29,6 +29,7 @@ open class FloorScene : SGraphyScene() {
     var canEdit = true
     val point = Point()
     var item: QrcodeItem? = null
+    var eqItem: EquipItem? = null
 
     /** 默认缩放比例,用于指定最小缩放比例*/
     var defaultPointScale = 0.01785718f
@@ -38,6 +39,7 @@ open class FloorScene : SGraphyScene() {
      * dot 绘制问题点
      * pipe 绘制管道模式
      * qrcode 绘制二维码
+     * equip 绘制设备
      */
     var type: String? = "normal"
 
@@ -148,6 +150,9 @@ open class FloorScene : SGraphyScene() {
     /** 有任务的空间 list   */
     var tunableSpaceList = ArrayList<TunableSpaceItem>()
 
+    /** 设备 list   */
+    var equipList = ArrayList<EquipItem>()
+
     /**
      *  获取底图压缩文件
      *
@@ -407,8 +412,8 @@ open class FloorScene : SGraphyScene() {
             var hasChose = false
             for (space in tunableSpaceList) {
                 val polygonContainsPoint = Lasso.isPolygonContainsPoint(
-                    space.mPoints,
-                    android.graphics.Point(e.x.toInt(), -e.y.toInt())
+                        space.mPoints,
+                        android.graphics.Point(e.x.toInt(), -e.y.toInt())
                 )
                 if (polygonContainsPoint) {
                     mapType = "space"
@@ -431,8 +436,8 @@ open class FloorScene : SGraphyScene() {
         if ("dot".equals(type)) {
             for (space in spaceList) {
                 val polygonContainsPoint = Lasso.isPolygonContainsPoint(
-                    space.mPoints,
-                    android.graphics.Point(e.x.toInt(), -e.y.toInt())
+                        space.mPoints,
+                        android.graphics.Point(e.x.toInt(), -e.y.toInt())
                 )
                 outSide = true
                 space.paint.color = Opt.spaceChoseColor
@@ -474,6 +479,8 @@ open class FloorScene : SGraphyScene() {
                 item.zOrder = 100000f
                 addItem(item)
             }
+
+            //绘制二维码
         } else if ("qrcode".equals(type)) {
             point.mX = e.x
             point.mY = e.y
@@ -485,6 +492,19 @@ open class FloorScene : SGraphyScene() {
             item!!.isVisible = true
             item!!.zOrder = 100000f
             addItem(item!!)
+
+            //绘制设备
+        } else if ("equip".equals(type)) {
+            point.mX = e.x
+            point.mY = e.y
+
+            if (eqItem != null) {
+                removeItem(eqItem!!)
+            }
+            eqItem = EquipItem(point, null, defaultPointScale)
+            eqItem!!.isVisible = true
+            eqItem!!.zOrder = 100000f
+            addItem(eqItem!!)
         }
 
         if (topUp != null) {

+ 94 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/EquipItem.kt

@@ -0,0 +1,94 @@
+package cn.sagacloud.android.cadengine.items
+
+
+import android.graphics.Canvas
+import android.graphics.Color
+import android.graphics.Paint
+import cn.sagacloud.android.cadengine.types.Point
+import com.sybotan.android.graphy.SGraphyItem
+
+/**
+ * Created by lihao.
+ * Date: 2021/6/4
+ */
+class EquipItem(val data: Point, parent: SGraphyItem? = null, defaultScale: Float) :
+    SGraphyItem(parent) {
+    /** 新建 画笔 */
+    val mPaint_inner = Paint()
+    val mPaint_center = Paint()
+    val mPaint_outer = Paint()
+
+    /** 按时 画笔 */
+    val not_overTime_inner = Paint()
+    val not_overTime_outer = Paint()
+
+    /** 逾期 画笔 */
+    val overTime_inner = Paint()
+    val overTime_outer = Paint()
+
+    /** 承接查验复核中 */
+    val checkReviewing_inner = Paint()
+    val checkReviewing_outer = Paint()
+    var mDefaultScale = 0f
+    //var defaultScale = 1.0f
+    //var mScale = 1f
+
+    init {
+        mDefaultScale = defaultScale;
+        /** 按时 */
+        not_overTime_inner.color = Color.parseColor("#ffffff")
+        not_overTime_inner.isAntiAlias = true
+        not_overTime_inner.style = Paint.Style.FILL
+
+        not_overTime_outer.color = Color.parseColor("#04df97")//绿色
+        not_overTime_outer.isAntiAlias = true
+        not_overTime_outer.style = Paint.Style.FILL
+
+        /** 逾期 */
+        overTime_inner.color = Color.parseColor("#ffffff")
+        overTime_inner.isAntiAlias = true
+        overTime_inner.style = Paint.Style.FILL
+
+        overTime_outer.color = Color.parseColor("#ff3b33")//红色
+        overTime_outer.isAntiAlias = true
+        overTime_outer.style = Paint.Style.FILL
+
+        /** 承接查验复核中 */
+        checkReviewing_inner.color = Color.parseColor("#ffffff")
+        checkReviewing_inner.isAntiAlias = true
+        checkReviewing_inner.style = Paint.Style.FILL
+
+        checkReviewing_outer.color = Color.parseColor("#F7B500")//黄色
+        checkReviewing_outer.isAntiAlias = true
+        checkReviewing_outer.style = Paint.Style.FILL
+
+        /** 新建 */
+        //内圈
+        mPaint_inner.color = Color.parseColor("#66272727")
+        mPaint_inner.isAntiAlias = true
+        mPaint_inner.style = Paint.Style.FILL
+        //中圈
+        mPaint_center.color = Color.parseColor("#ffffff")
+        mPaint_center.isAntiAlias = true
+        mPaint_center.style = Paint.Style.FILL
+        //外圈
+        mPaint_outer.color = Color.parseColor("#260c90eb")
+        mPaint_outer.isAntiAlias = true
+        mPaint_outer.style = Paint.Style.FILL
+    }
+
+    /**
+     * Item绘制操作
+     *
+     * @param   canvas          画布
+     * @param   rect            绘制区域
+     */
+    override fun onDraw(canvas: Canvas) {
+        data.scalePoint = mDefaultScale / scene!!.view!!.scale
+//        canvas.drawCircle(data.mX, data.mY, 2400f * data.scalePoint, mPaint_outer)
+        canvas.drawCircle(data.mX, data.mY, 500f * data.scalePoint, mPaint_center)
+        canvas.drawCircle(data.mX, data.mY, 1500f * data.scalePoint, mPaint_inner)
+        super.onDraw(canvas)
+    } // Function onDraw()
+
+}

+ 1 - 1
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/QrcodeItem.kt

@@ -87,7 +87,7 @@ class QrcodeItem(val data: Point, parent: SGraphyItem? = null, defaultScale: Flo
         data.scalePoint = mDefaultScale / scene!!.view!!.scale
 //        canvas.drawCircle(data.mX, data.mY, 2400f * data.scalePoint, mPaint_outer)
 //        canvas.drawCircle(data.mX, data.mY, 1200f * data.scalePoint, mPaint_center)
-        canvas.drawCircle(data.mX, data.mY, 2000f * data.scalePoint, mPaint_inner)
+        canvas.drawCircle(data.mX, data.mY, 1500f * data.scalePoint, mPaint_inner)
         super.onDraw(canvas)
     } // Function onDraw()
 

+ 88 - 30
demo/src/main/java/com/sybotan/android/demo/activities/GraphyActivity.kt

@@ -46,10 +46,9 @@ import cn.sagacloud.android.cadengine.types.Point
 import cn.sagacloud.android.cadengine.types.Space
 import cn.sagacloud.android.cadengine.types.TunableSpace
 import com.google.gson.Gson
-import com.sybotan.android.demo.bean.result.Position
-import com.sybotan.android.demo.bean.result.ProblemsModel
-import com.sybotan.android.demo.bean.result.QrcodeModel
-import com.sybotan.android.demo.bean.result.SpaceJobModel
+import com.sybotan.android.demo.activities.poc.DeviceActivity
+import com.sybotan.android.demo.bean.result.*
+import com.sybotan.android.demo.retrofit.BaseViewModelInterface
 import com.sybotan.android.demo.viewmodel.GraphyVM
 import com.zbar.lib.CaptureActivity
 
@@ -58,6 +57,7 @@ class GraphyActivity : BaseActivity() {
     companion object {
         private val TAG = GraphyActivity::class.java.name
         private val REQUEST_CODE_SCAN = 0x0000 // 扫描二维码
+        private val REQUEST_CODE_EQUIP = 0x0001 // 添加设备
     }
 
     lateinit var graphyVM: GraphyVM
@@ -153,6 +153,7 @@ class GraphyActivity : BaseActivity() {
         floorId = floor.getString("floorId")
         floorMap = floor.getString("floorMap")
         from = floor.getString("from")
+        from = "12345"
     }
 
     /**
@@ -163,15 +164,25 @@ class GraphyActivity : BaseActivity() {
             override fun onSingUp(x: Float, y: Float) {
                 //选中空间完毕界面逻辑
                 if (scene.mapType.equals("space")) {
-                    spaceStructure.visibility = View.VISIBLE
-                    spaceName.text = scene.choseSpace!!.data.localName
-                    graphyVM.getProblem(scene.choseSpace)
-                    graphyVM.getQrcode(scene.choseSpace)
+                    if ("space".equals(from)) {
+                        spaceStructure.visibility = View.VISIBLE
+                        spaceName.text = scene.choseSpace!!.data.localName
+                        graphyVM.getProblem(scene.choseSpace)
+                        graphyVM.getQrcode(scene.choseSpace)
+                    } else {
+                        if (equipLl.visibility == View.GONE) {
+                            drawLl.visibility = View.VISIBLE
+                            graphyVM.getSpaceEq(scene.choseSpace)
+                        }
+
+                    }
                     //未选中空间
                 } else if (scene.mapType.equals("nothing")) {
                     spaceStructure.visibility = View.GONE
                     qrcodeLl.visibility = View.GONE
                     quesDetail.visibility = View.GONE
+                    equipLl.visibility = View.GONE
+                    drawLl.visibility = View.GONE
                     for (item in scene.pointItemList) {
                         scene.removeItem(item)
                     }
@@ -186,7 +197,7 @@ class GraphyActivity : BaseActivity() {
                 if ("dot".equals(scene.type)) {
                     scene.type = "normal"
                     addDot.alpha = 1f
-                    graphyVM.addProblem(scene.choseSpace, x, y)
+                    scene.choseSpace?.let { graphyVM.addProblem(it, x, y) }
                     return
                 }
 
@@ -195,10 +206,10 @@ class GraphyActivity : BaseActivity() {
                     realDistance = distance * scene.defaultPointScale / graphyView.scale
                     for (point in scene.pointItemList) {
                         val sqrt = Math.sqrt(
-                            Math.pow(
-                                Math.abs(x - point.data.mX).toDouble(),
-                                2.0
-                            ) + Math.pow(Math.abs(y - point.data.mY).toDouble(), 2.0)
+                                Math.pow(
+                                        Math.abs(x - point.data.mX).toDouble(),
+                                        2.0
+                                ) + Math.pow(Math.abs(y - point.data.mY).toDouble(), 2.0)
                         ).toInt()
                         if (sqrt < realDistance) {
                             showDotDetail(point)
@@ -213,7 +224,7 @@ class GraphyActivity : BaseActivity() {
                     qrcodeLl.visibility = View.VISIBLE
                     qrcodeLocation.setText("(${scene.point.mX},${scene.point.mY})")
                     spaceStructure.visibility = View.GONE
-
+                    return
                 }
             }
         })
@@ -268,15 +279,56 @@ class GraphyActivity : BaseActivity() {
             val intent = Intent(this@GraphyActivity, CaptureActivity::class.java)
             startActivityForResult(intent, REQUEST_CODE_SCAN)
         }
+
+        //添加设备
+        drawEquip.setOnClickListener {
+            scene.type = "equip"
+            drawLl.visibility = View.GONE
+            equipLl.visibility = View.VISIBLE
+
+        }
+
+        equipCancel.setOnClickListener {
+            drawLl.visibility = View.VISIBLE
+            equipLl.visibility = View.GONE
+        }
+
+        equipNext.setOnClickListener {
+            val intent = Intent(this, DeviceActivity::class.java)
+            val bundle = Bundle()
+            val positon = Position()
+            positon.x = scene.point.mX.toString()
+            positon.y = scene.point.mY.toString()
+            val z = Z()
+            z.offset = equipEdit.text.toString()
+            when (equipRg.checkedRadioButtonId) {
+                R.id.roof -> {
+                    z.region = "roof"
+                }
+                R.id.floor -> {
+                    z.region = "floor"
+                }
+                R.id.wall -> {
+                    z.region = "wall"
+                }
+                R.id.air -> {
+                    z.region = "air"
+                }
+            }
+            positon.z = z
+            bundle.putString("spaceId", scene.choseSpace!!.data.id)
+            bundle.putSerializable("position", positon)
+            intent.putExtra("equip", bundle)
+            startActivityForResult(intent, REQUEST_CODE_EQUIP)
+        }
     }
 
     /**
      * 初始化viewModel
      */
     private fun initViewModel() {
-        graphyVM = GraphyVM({ name, params ->
+        graphyVM = GraphyVM(BaseViewModelInterface { name, params ->
             when (name) {
-
                 /** 查询空间和任务 */
                 GraphyVM.SPACE_JOB -> {
                     for (item in scene.tunableSpaceList) {
@@ -310,11 +362,12 @@ class GraphyActivity : BaseActivity() {
                         }
                     }
                 }
+
                 /** 添加空间核查问题 */
                 GraphyVM.ADD_PROBLEM -> {
                     Toast.makeText(this, "记录成功", Toast.LENGTH_SHORT).show()
                     graphyVM.getProblem(scene.choseSpace)
-                    graphyVM.getSpaceJob()
+                    graphyVM.getSpaceJob(from)
                 }
 
                 /** 查询空间核查问题 */
@@ -375,16 +428,21 @@ class GraphyActivity : BaseActivity() {
                 GraphyVM.SET_JOB -> {
                     Toast.makeText(this, "核查成功", Toast.LENGTH_SHORT).show()
                     refreshAll()
-                    graphyVM.getSpaceJob()
+                    graphyVM.getSpaceJob(from)
                 }
 
                 /** 设置空间核查问题的信息和状态 */
                 GraphyVM.SET_PROBLEM -> {
-                    graphyVM.getSpaceJob()
+                    graphyVM.getSpaceJob(from)
+                }
+
+                /** 查询空间下的设备(所在关系) */
+                GraphyVM.SPACE_EQ -> {
+
                 }
             }
         }, this, buildingId, floorId)
-        graphyVM.getSpaceJob()
+        graphyVM.getSpaceJob(from)
     }
 
     /**
@@ -419,11 +477,11 @@ class GraphyActivity : BaseActivity() {
         spaceStructure.visibility = View.GONE
         quesDetail.visibility = View.VISIBLE
         quesTv.setText(
-            "这是描述问题的文本,左侧是拍照图片。" +
-                    "\n问题编码:${point.data.id}" +
-                    "\nx轴:${point.data.mX}" +
-                    "\ny轴:${point.data.mY}" +
-                    "\n点击下方“问题已解决”按钮后可关闭该问题点。"
+                "这是描述问题的文本,左侧是拍照图片。" +
+                        "\n问题编码:${point.data.id}" +
+                        "\nx轴:${point.data.mX}" +
+                        "\ny轴:${point.data.mY}" +
+                        "\n点击下方“问题已解决”按钮后可关闭该问题点。"
         )
         //问题已解决按钮
         quesSubmit.setOnClickListener {
@@ -437,7 +495,7 @@ class GraphyActivity : BaseActivity() {
                     scene.removeItem(item)
                 }
             }
-            graphyVM.getSpaceJob()
+            graphyVM.getSpaceJob(from)
         }
     }
 
@@ -455,10 +513,10 @@ class GraphyActivity : BaseActivity() {
                         val result = bundle.getString(CaptureActivity.EXTRA_STRING)
                         Log.e("tag", "扫描结果:$result")
                         graphyVM.bindQrcode(
-                            scene.choseSpace,
-                            result,
-                            scene.point,
-                            qrcodeEdit.text.toString()
+                                scene.choseSpace,
+                                result,
+                                scene.point,
+                                qrcodeEdit.text.toString()
                         )
                     }
                 }

+ 11 - 0
demo/src/main/java/com/sybotan/android/demo/bean/request/ReqSpaceEq.java

@@ -0,0 +1,11 @@
+package com.sybotan.android.demo.bean.request;
+
+/**
+ * Created by lihao.
+ * Date: 2021/6/11
+ */
+public class ReqSpaceEq {
+    public String spaceId;
+    public boolean group;
+    public String target = "rtn";
+}

+ 2 - 0
demo/src/main/java/com/sybotan/android/demo/bean/result/Position.java

@@ -1,5 +1,7 @@
 package com.sybotan.android.demo.bean.result;
 
+import android.os.Parcelable;
+
 import java.io.Serializable;
 
 /**

+ 12 - 0
demo/src/main/java/com/sybotan/android/demo/bean/result/SpaceEqModel.java

@@ -0,0 +1,12 @@
+package com.sybotan.android.demo.bean.result;
+
+/**
+ * Created by lihao.
+ * Date: 2021/6/11
+ */
+public class SpaceEqModel {
+    public String deviceId;
+    public String name;
+    public String position;
+    public String remark;
+}

+ 7 - 0
demo/src/main/java/com/sybotan/android/demo/retrofit/API.java

@@ -2,6 +2,7 @@ package com.sybotan.android.demo.retrofit;
 
 
 import com.sybotan.android.demo.bean.BaseModel;
+import com.sybotan.android.demo.bean.result.SpaceEqModel;
 import com.sybotan.android.demo.bean.result.ResDeviceModel;
 import com.sybotan.android.demo.entitiies.Build;
 import com.sybotan.android.demo.bean.result.AddProblemModel;
@@ -155,6 +156,12 @@ public interface API {
     Observable<BaseModel<List<Build>>> requestBuildJob();
 
     /**
+     * 查询空间下的设备(所在关系)
+     */
+    @POST("clmt/query/space_eq")
+    Observable<BaseModel<List<SpaceEqModel>>> getSpaceEq(@Body RequestBody body);
+
+    /**
      * 添加设备
      */
     @POST("clmt/job/add_eq")

+ 63 - 0
demo/src/main/java/com/sybotan/android/demo/tools/DensityUtils.java

@@ -0,0 +1,63 @@
+package com.sybotan.android.demo.tools;
+
+import android.content.Context;
+import android.util.TypedValue;
+
+/**
+ * 常用单位转换的辅助类
+ */
+public class DensityUtils {
+    private DensityUtils() {
+        /* cannot be instantiated */
+        throw new UnsupportedOperationException("cannot be instantiated");
+    }
+
+    /**
+     * dp转px
+     *
+     * @param context
+     * @return
+     */
+    public static int dp2px(Context context, float dpVal) {
+        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+                dpVal, context.getResources().getDisplayMetrics());
+    }
+
+    /**
+     * sp转px
+     *
+     * @param context
+     * @return
+     */
+    public static int sp2px(Context context, float spVal) {
+        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
+                spVal, context.getResources().getDisplayMetrics());
+    }
+
+    public static float getDensity(Context context) {
+        return context.getResources().getDisplayMetrics().density;
+    }
+
+    /**
+     * px转dp
+     *
+     * @param context
+     * @param pxVal
+     * @return
+     */
+    public static float px2dp(Context context, float pxVal) {
+        final float scale = context.getResources().getDisplayMetrics().density;
+        return (pxVal / scale);
+    }
+
+    /**
+     * px转sp
+     *
+     * @param pxVal
+     * @return
+     */
+    public static float px2sp(Context context, float pxVal) {
+        return (pxVal / context.getResources().getDisplayMetrics().scaledDensity);
+    }
+
+}

+ 122 - 0
demo/src/main/java/com/sybotan/android/demo/tools/WordWrapView.java

@@ -0,0 +1,122 @@
+package com.sybotan.android.demo.tools;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.sybotan.android.demo.R;
+
+/**
+ * Created by cunwen on 17/4/14.
+ */
+public class WordWrapView extends ViewGroup {
+    private int PADDING_HOR = 15;//水平方向padding
+    private int PADDING_VERTICAL = 10;//垂直方向padding--文字上下距离边框的距离
+    private int SIDE_MARGIN = 40;//左右间距--整体的左右margin
+    private int TEXT_MARGIN = 10;//textview之间的间距
+    private boolean mIsAudit;
+
+    /**
+     * @param context
+     */
+    public WordWrapView(Context context) {
+        this(context, null);
+    }
+
+    /**
+     * @param context
+     * @param attrs
+     * @param defStyle
+     */
+    public WordWrapView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.wrapView);
+        PADDING_HOR = DensityUtils.dp2px(context, array.getInt(R.styleable.wrapView_padding_hor, 7));
+        PADDING_VERTICAL = DensityUtils.dp2px(context, array.getInt(R.styleable.wrapView_padding_ver, 5));
+        SIDE_MARGIN = DensityUtils.dp2px(context, array.getInt(R.styleable.wrapView_side_margin, 0));
+        TEXT_MARGIN = DensityUtils.dp2px(context, array.getInt(R.styleable.wrapView_text_margin, 12));
+        mIsAudit = array.getBoolean(R.styleable.wrapView_isAudit, false);
+        array.recycle();
+    }
+
+
+    /**
+     * @param context
+     * @param attrs
+     */
+    public WordWrapView(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        int childCount = getChildCount();
+        int autualWidth = r - l;
+        int x = SIDE_MARGIN;// 横坐标开始
+        int y = 0;//纵坐标开始
+        int rows = 1;
+        for (int i = 0; i < childCount; i++) {
+            View view = getChildAt(i);
+//            view.setBackgroundColor(Color.WHITE);
+            int width = view.getMeasuredWidth();
+            int height = view.getMeasuredHeight();
+
+            x += width + TEXT_MARGIN;
+            if (rows == 1) {
+                if (x - TEXT_MARGIN > autualWidth) {
+                    x = width + SIDE_MARGIN;
+                    rows++;
+                }
+            } else {
+                if (x > autualWidth) {
+                    x = width + SIDE_MARGIN;
+                    rows++;
+                }
+            }
+
+            y = rows * (height + TEXT_MARGIN);
+            if (rows == 1) {
+                view.layout(x - width - TEXT_MARGIN, y - height, x - TEXT_MARGIN, y);
+            } else {
+                view.layout(x - width, y - height, x, y);
+            }
+        }
+    }
+
+    ;
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        int x = 0;//横坐标
+        int y = 0;//纵坐标
+        int rows = 1;//总行数
+        int specWidth = MeasureSpec.getSize(widthMeasureSpec);
+        int actualWidth = specWidth - SIDE_MARGIN * 2;//实际宽度
+        int childCount = getChildCount();
+        for (int index = 0; index < childCount; index++) {
+            View child = getChildAt(index);
+            child.setPadding(PADDING_HOR, PADDING_VERTICAL, PADDING_HOR, PADDING_VERTICAL);
+            child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+            int width = child.getMeasuredWidth();
+            int height = child.getMeasuredHeight();
+            x += width + TEXT_MARGIN;
+            if (!mIsAudit) {
+                if (index != childCount - 1 && x > actualWidth) {//换行
+                    x = width;
+                    rows++;
+                }
+            } else {
+                if (x > actualWidth) {//换行
+                    x = width;
+                    rows++;
+                }
+            }
+            y = rows * (height + TEXT_MARGIN);
+        }
+        setMeasuredDimension(actualWidth, y);
+    }
+
+}

+ 0 - 215
demo/src/main/java/com/sybotan/android/demo/viewmodel/GraphyVM.java

@@ -1,215 +0,0 @@
-package com.sybotan.android.demo.viewmodel;
-
-import com.sybotan.android.demo.activities.BaseActivity;
-import com.sybotan.android.demo.bean.BaseModel;
-import com.sybotan.android.demo.bean.request.ReqAddProblem;
-import com.sybotan.android.demo.bean.request.ReqBindQrcode;
-import com.sybotan.android.demo.bean.request.ReqCloseProblem;
-import com.sybotan.android.demo.bean.request.ReqProblems;
-import com.sybotan.android.demo.bean.request.ReqQrcode;
-import com.sybotan.android.demo.bean.request.ReqSetJob;
-import com.sybotan.android.demo.bean.request.ReqSetProblem;
-import com.sybotan.android.demo.bean.request.ReqSpaceJob;
-import com.sybotan.android.demo.bean.result.AddProblemModel;
-import com.sybotan.android.demo.bean.result.BindQrcodeModel;
-import com.sybotan.android.demo.bean.result.CloseProblemModel;
-import com.sybotan.android.demo.bean.result.Position;
-import com.sybotan.android.demo.bean.result.ProblemsModel;
-import com.sybotan.android.demo.bean.result.QrcodeModel;
-import com.sybotan.android.demo.bean.result.SetJobModel;
-import com.sybotan.android.demo.bean.result.SetProblemModel;
-import com.sybotan.android.demo.bean.result.SpaceJobModel;
-import com.sybotan.android.demo.bean.result.Z;
-import com.sybotan.android.demo.retrofit.BaseObserver;
-import com.sybotan.android.demo.retrofit.BaseViewModelInterface;
-import com.sybotan.android.demo.retrofit.RetrofitFactory;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import cn.sagacloud.android.cadengine.items.PointItem;
-import cn.sagacloud.android.cadengine.items.TunableSpaceItem;
-import cn.sagacloud.android.cadengine.types.Point;
-import io.reactivex.Observable;
-
-/**
- * Created by lihao.
- * Date: 2021/6/9
- */
-public class GraphyVM extends BaseViewModel {
-    //查询空间和任务
-    public static final String SPACE_JOB = "SPACE_JOB";
-    //添加空间核查问题
-    public static final String ADD_PROBLEM = "ADD_PROBLEM";
-    //查询空间核查问题
-    public static final String GET_PROBLEM = "GET_PROBLEM";
-    //设置空间核查问题的信息和状态
-    public static final String SET_PROBLEM = "SET_PROBLEM";
-    //关闭空间核查问题
-    public static final String CLOSE_PROBLEM = "CLOSE_PROBLEM";
-    //绑定二维码
-    public static final String BIND_QECODE = "BIND_QECODE";
-    //查询对象绑定的二维码
-    public static final String GET_QECODE = "GET_QECODE";
-    //设置空间的任务状态(新建和修改)
-    public static final String SET_JOB = "SET_JOB";
-    private String buildingId;
-    private String floorId;
-
-    public GraphyVM(BaseViewModelInterface object, BaseActivity activity, String buildingId, String floorId) {
-        super(object, activity);
-        this.buildingId = buildingId;
-        this.floorId = floorId;
-    }
-
-    /**
-     * 查询空间和任务
-     */
-    public void getSpaceJob() {
-        ReqSpaceJob bean = new ReqSpaceJob();
-        bean.buildingId = buildingId;
-        bean.floorId = floorId;
-        bean.jobStatus.add("01");
-        bean.jobStatus.add("02");
-        Observable<BaseModel<List<SpaceJobModel>>> observable = RetrofitFactory.getInstance().getSpaceJob(getRequestBody(bean));
-        sendRequest(observable, new BaseObserver<List<SpaceJobModel>>(mActivity, this) {
-            @Override
-            protected void onSuccess(List<SpaceJobModel> spaceJobModels) {
-                mEmitter.SendDircetive(SPACE_JOB, spaceJobModels);
-            }
-        }, true);
-    }
-
-    /**
-     * 添加空间核查问题
-     *
-     * @param choseSpace 选中的空间
-     * @param x          x坐标
-     * @param y          y坐标
-     */
-    public void addProblem(TunableSpaceItem choseSpace, float x, float y) {
-        ReqAddProblem bean = new ReqAddProblem();
-        bean.spaceId = choseSpace.getData().getId();
-        bean.floorId = floorId;
-        Position position = new Position();
-        position.x = x + "";
-        position.y = y + "";
-        bean.position = position;
-        Observable<BaseModel<AddProblemModel>> observable = RetrofitFactory.getInstance().addProblem(getRequestBody(bean));
-        sendRequest(observable, new BaseObserver<AddProblemModel>(mActivity, this) {
-            @Override
-            protected void onSuccess(AddProblemModel model) {
-                mEmitter.SendDircetive(ADD_PROBLEM, model);
-            }
-        }, true);
-    }
-
-    /**
-     * 查询空间核查问题
-     *
-     * @param choseSpace 选中的空间
-     */
-    public void getProblem(@Nullable TunableSpaceItem choseSpace) {
-        ReqProblems bean = new ReqProblems();
-        bean.floorId = floorId;
-        bean.spaceId = choseSpace.getData().getId();
-        Observable<BaseModel<List<ProblemsModel>>> observable = RetrofitFactory.getInstance().problems(getRequestBody(bean));
-        sendRequest(observable, new BaseObserver<List<ProblemsModel>>(mActivity, this) {
-            @Override
-            protected void onSuccess(List<ProblemsModel> models) {
-                mEmitter.SendDircetive(GET_PROBLEM, models);
-            }
-        }, true);
-    }
-
-    /**
-     * 关闭空间核查问题
-     *
-     * @param point      点位
-     * @param choseSpace 选中的空间
-     */
-    public void closeProblem(@NotNull PointItem point, @Nullable TunableSpaceItem choseSpace) {
-        ReqCloseProblem bean = new ReqCloseProblem();
-        bean.problemId = point.getData().getId();
-        bean.spaceId = choseSpace.getData().getId();
-        Observable<BaseModel<CloseProblemModel>> observable = RetrofitFactory.getInstance().closeProblem(getRequestBody(bean));
-        sendRequest(observable, new BaseObserver<CloseProblemModel>(mActivity, this) {
-            @Override
-            protected void onSuccess(CloseProblemModel setProblemModel) {
-                mEmitter.SendDircetive(CLOSE_PROBLEM, null);
-            }
-        }, true);
-    }
-
-
-    /**
-     * 绑定二维码
-     *
-     * @param choseSpace 选中的空间
-     * @param result     二维码uuid
-     * @param point      点位信息
-     * @param toString   z轴描述
-     */
-    public void bindQrcode(@Nullable TunableSpaceItem choseSpace, @Nullable String result, @NotNull Point point, @NotNull String toString) {
-        ReqBindQrcode bean = new ReqBindQrcode();
-        bean.objId = choseSpace.getData().getId();
-        bean.objType = "space";
-        bean.uuid = result;
-        Position position = new Position();
-        position.x = String.valueOf(point.getMX());
-        position.y = String.valueOf(point.getMY());
-        position.z = new Z();
-        position.z.offset = toString;
-        position.z.region = "wall";
-        bean.position = position;
-        Observable<BaseModel<BindQrcodeModel>> observable = RetrofitFactory.getInstance().bindQrcode(getRequestBody(bean));
-        sendRequest(observable, new BaseObserver<BindQrcodeModel>(mActivity, this) {
-            @Override
-            protected void onSuccess(BindQrcodeModel bindQrcodeModel) {
-                mEmitter.SendDircetive(BIND_QECODE, null);
-            }
-        }, true);
-    }
-
-    /**
-     * 查询对象绑定的二维码
-     *
-     * @param choseSpace 选中的空间
-     */
-    public void getQrcode(@Nullable TunableSpaceItem choseSpace) {
-        ReqQrcode bean = new ReqQrcode();
-        bean.objId = choseSpace.getData().getId();
-        Observable<BaseModel<ArrayList<QrcodeModel>>> observable = RetrofitFactory.getInstance().qrcode(getRequestBody(bean));
-        sendRequest(observable, new BaseObserver<ArrayList<QrcodeModel>>(mActivity, this) {
-            @Override
-            protected void onSuccess(ArrayList<QrcodeModel> qrcodeModels) {
-                mEmitter.SendDircetive(GET_QECODE, qrcodeModels);
-            }
-        }, true);
-    }
-
-    /**
-     * 设置空间的任务状态(新建和修改)
-     *
-     * @param choseSpace 选中的空间
-     * @param toString   数字化交付编码
-     */
-    public void setJob(@Nullable TunableSpaceItem choseSpace, @NotNull String toString) {
-        ReqSetJob bean = new ReqSetJob();
-        bean.buildingId = buildingId;
-        bean.floorId = floorId;
-        bean.spaceId.add(choseSpace.getData().getId());
-        bean.jobStatus = "03";
-        bean.spaceCode = toString;
-        Observable<BaseModel<SetJobModel>> observable = RetrofitFactory.getInstance().setJob(getRequestBody(bean));
-        sendRequest(observable, new BaseObserver<SetJobModel>(mActivity, this) {
-            @Override
-            protected void onSuccess(SetJobModel model) {
-                mEmitter.SendDircetive(SET_JOB, null);
-            }
-        }, true);
-    }
-}

+ 214 - 0
demo/src/main/java/com/sybotan/android/demo/viewmodel/GraphyVM.kt

@@ -0,0 +1,214 @@
+package com.sybotan.android.demo.viewmodel
+
+import cn.sagacloud.android.cadengine.items.PointItem
+import cn.sagacloud.android.cadengine.items.TunableSpaceItem
+import cn.sagacloud.android.cadengine.types.Point
+import com.sybotan.android.demo.activities.BaseActivity
+import com.sybotan.android.demo.bean.request.*
+import com.sybotan.android.demo.bean.result.*
+import com.sybotan.android.demo.bean.result.Position
+import com.sybotan.android.demo.bean.result.Z
+import com.sybotan.android.demo.retrofit.BaseObserver
+import com.sybotan.android.demo.retrofit.BaseViewModelInterface
+import com.sybotan.android.demo.retrofit.RetrofitFactory
+import java.util.*
+
+/**
+ * Created by lihao.
+ * Date: 2021/6/9
+ */
+class GraphyVM(b: BaseViewModelInterface?, activity: BaseActivity?, //建筑id
+               private val buildingId: String, //楼层id
+               private val floorId: String) : BaseViewModel(b, activity) {
+
+    /**
+     * 查询空间和任务
+     */
+    fun getSpaceJob(from: String) {
+        val bean = ReqSpaceJob()
+        bean.buildingId = buildingId
+        bean.floorId = floorId
+        if ("space" == from) {
+            bean.jobStatus.add("01")
+            bean.jobStatus.add("02")
+        } else {
+            bean.jobStatus.add("04")
+        }
+        val observable = RetrofitFactory.getInstance().getSpaceJob(getRequestBody(bean))
+        sendRequest(observable, object : BaseObserver<List<SpaceJobModel>>(mActivity, this) {
+            override fun onSuccess(spaceJobModels: List<SpaceJobModel>) {
+                mEmitter.SendDircetive(SPACE_JOB, spaceJobModels)
+            }
+        }, true)
+    }
+
+    /**
+     * 添加空间核查问题
+     *
+     * @param choseSpace 选中的空间
+     * @param x          x坐标
+     * @param y          y坐标
+     */
+    fun addProblem(choseSpace: TunableSpaceItem, x: Float, y: Float) {
+        val bean = ReqAddProblem()
+        bean.spaceId = choseSpace.data.id
+        bean.floorId = floorId
+        val position = Position()
+        position.x = x.toString() + ""
+        position.y = y.toString() + ""
+        bean.position = position
+        val observable = RetrofitFactory.getInstance().addProblem(getRequestBody(bean))
+        sendRequest(observable, object : BaseObserver<AddProblemModel>(mActivity, this) {
+            override fun onSuccess(model: AddProblemModel) {
+                mEmitter.SendDircetive(ADD_PROBLEM, model)
+            }
+        }, true)
+    }
+
+    /**
+     * 查询空间核查问题
+     *
+     * @param choseSpace 选中的空间
+     */
+    fun getProblem(choseSpace: TunableSpaceItem?) {
+        val bean = ReqProblems()
+        bean.floorId = floorId
+        bean.spaceId = choseSpace!!.data.id
+        val observable = RetrofitFactory.getInstance().problems(getRequestBody(bean))
+        sendRequest(observable, object : BaseObserver<List<ProblemsModel>>(mActivity, this) {
+            override fun onSuccess(models: List<ProblemsModel>) {
+                mEmitter.SendDircetive(GET_PROBLEM, models)
+            }
+        }, true)
+    }
+
+    /**
+     * 关闭空间核查问题
+     *
+     * @param point      点位
+     * @param choseSpace 选中的空间
+     */
+    fun closeProblem(point: PointItem, choseSpace: TunableSpaceItem?) {
+        val bean = ReqCloseProblem()
+        bean.problemId = point.data.id
+        bean.spaceId = choseSpace!!.data.id
+        val observable = RetrofitFactory.getInstance().closeProblem(getRequestBody(bean))
+        sendRequest(observable, object : BaseObserver<CloseProblemModel>(mActivity, this) {
+            override fun onSuccess(setProblemModel: CloseProblemModel) {
+                mEmitter.SendDircetive(CLOSE_PROBLEM, null)
+            }
+        }, true)
+    }
+
+    /**
+     * 绑定二维码
+     *
+     * @param choseSpace 选中的空间
+     * @param result     二维码uuid
+     * @param point      点位信息
+     * @param toString   z轴描述
+     */
+    fun bindQrcode(choseSpace: TunableSpaceItem?, result: String?, point: Point, toString: String) {
+        val bean = ReqBindQrcode()
+        bean.objId = choseSpace!!.data.id
+        bean.objType = "space"
+        bean.uuid = result
+        val position = Position()
+        position.x = java.lang.String.valueOf(point.mX)
+        position.y = java.lang.String.valueOf(point.mY)
+        position.z = Z()
+        position.z.offset = toString
+        position.z.region = "wall"
+        bean.position = position
+        val observable = RetrofitFactory.getInstance().bindQrcode(getRequestBody(bean))
+        sendRequest(observable, object : BaseObserver<BindQrcodeModel>(mActivity, this) {
+            override fun onSuccess(bindQrcodeModel: BindQrcodeModel) {
+                mEmitter.SendDircetive(BIND_QECODE, null)
+            }
+        }, true)
+    }
+
+    /**
+     * 查询对象绑定的二维码
+     *
+     * @param choseSpace 选中的空间
+     */
+    fun getQrcode(choseSpace: TunableSpaceItem?) {
+        val bean = ReqQrcode()
+        bean.objId = choseSpace!!.data.id
+        val observable = RetrofitFactory.getInstance().qrcode(getRequestBody(bean))
+        sendRequest(observable, object : BaseObserver<ArrayList<QrcodeModel>>(mActivity, this) {
+            override fun onSuccess(qrcodeModels: ArrayList<QrcodeModel>) {
+                mEmitter.SendDircetive(GET_QECODE, qrcodeModels)
+            }
+        }, true)
+    }
+
+    /**
+     * 设置空间的任务状态(新建和修改)
+     *
+     * @param choseSpace 选中的空间
+     * @param toString   数字化交付编码
+     */
+    fun setJob(choseSpace: TunableSpaceItem?, toString: String) {
+        val bean = ReqSetJob()
+        bean.buildingId = buildingId
+        bean.floorId = floorId
+        bean.spaceId.add(choseSpace!!.data.id)
+        bean.jobStatus = "03"
+        bean.spaceCode = toString
+        val observable = RetrofitFactory.getInstance().setJob(getRequestBody(bean))
+        sendRequest(observable, object : BaseObserver<SetJobModel>(mActivity, this) {
+            override fun onSuccess(model: SetJobModel) {
+                mEmitter.SendDircetive(SET_JOB, null)
+            }
+        }, true)
+    }
+
+    /**
+     * 查询空间下的设备(所在关系)
+     *
+     * @param choseSpace 选中的空间
+     */
+    fun getSpaceEq(choseSpace: TunableSpaceItem?) {
+        val bean = ReqSpaceEq()
+        bean.group = true
+        bean.spaceId = choseSpace!!.data.id
+        val observable = RetrofitFactory.getInstance().getSpaceEq(getRequestBody(bean))
+        sendRequest(observable, object : BaseObserver<List<SpaceEqModel>>(mActivity, this) {
+            override fun onSuccess(models: List<SpaceEqModel>) {
+                mEmitter.SendDircetive(SPACE_EQ, models)
+            }
+        }, true)
+    }
+
+    companion object {
+        //查询空间和任务
+        const val SPACE_JOB = "SPACE_JOB"
+
+        //添加空间核查问题
+        const val ADD_PROBLEM = "ADD_PROBLEM"
+
+        //查询空间核查问题
+        const val GET_PROBLEM = "GET_PROBLEM"
+
+        //设置空间核查问题的信息和状态
+        const val SET_PROBLEM = "SET_PROBLEM"
+
+        //关闭空间核查问题
+        const val CLOSE_PROBLEM = "CLOSE_PROBLEM"
+
+        //绑定二维码
+        const val BIND_QECODE = "BIND_QECODE"
+
+        //查询对象绑定的二维码
+        const val GET_QECODE = "GET_QECODE"
+
+        //设置空间的任务状态(新建和修改)
+        const val SET_JOB = "SET_JOB"
+
+        //设置空间的任务状态(新建和修改)
+        const val SPACE_EQ = "SPACE_EQ"
+    }
+
+}

+ 172 - 1
demo/src/main/res/layout/activity_graphy.xml

@@ -25,8 +25,8 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical"
     android:background="@color/white"
+    android:orientation="vertical"
     tools:context="com.sybotan.android.demo.activities.GraphyActivity">
 
     <com.sybotan.android.graphy.SGraphyView
@@ -281,5 +281,176 @@
                 android:textSize="15sp" />
 
         </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/drawLl"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:visibility="gone">
+
+            <com.sybotan.android.demo.tools.WordWrapView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" />
+
+            <TextView
+                android:id="@+id/drawEquip"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginTop="5dp"
+                android:background="@drawable/bg_blue_3bacb2"
+                android:paddingLeft="10dp"
+                android:paddingTop="5dp"
+                android:paddingRight="10dp"
+                android:paddingBottom="5dp"
+                android:text="发现新设备"
+                android:textColor="@color/white"
+                android:textSize="15sp" />
+
+            <com.sybotan.android.demo.tools.WordWrapView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="5dp" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginTop="5dp"
+                android:background="@drawable/bg_blue_3bacb2"
+                android:paddingLeft="10dp"
+                android:paddingTop="5dp"
+                android:paddingRight="10dp"
+                android:paddingBottom="5dp"
+                android:text="绘制管道桥架"
+                android:textColor="@color/white"
+                android:textSize="15sp" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/equipLl"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:paddingBottom="5dp"
+            android:visibility="gone">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginTop="5dp"
+                android:text="在平面图上放置设备位置"
+                android:textColor="@color/grey_900"
+                android:textSize="15sp" />
+
+            <TextView
+                android:id="@+id/equipLocation"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginTop="8dp"
+                android:text="(0,0)"
+                android:textColor="@color/grey_900"
+                android:textSize="16sp" />
+
+            <RadioGroup
+                android:id="@+id/equipRg"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:orientation="horizontal">
+
+                <RadioButton
+                    android:id="@+id/roof"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="房顶"
+                    android:textColor="@color/grey_900"
+                    android:textSize="12sp" />
+
+                <RadioButton
+                    android:id="@+id/floor"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="5dp"
+                    android:text="地面"
+                    android:textColor="@color/grey_900"
+                    android:textSize="12sp" />
+
+                <RadioButton
+                    android:id="@+id/wall"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="5dp"
+                    android:text="墙面(贴墙)"
+                    android:textColor="@color/grey_900"
+                    android:textSize="12sp" />
+
+                <RadioButton
+                    android:id="@+id/air"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="5dp"
+                    android:text="半空"
+                    android:textColor="@color/grey_900"
+                    android:textSize="12sp" />
+            </RadioGroup>
+
+            <EditText
+                android:id="@+id/equipEdit"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginLeft="65dp"
+                android:layout_marginTop="8dp"
+                android:layout_marginRight="65dp"
+                android:hint="距离地面高度,米"
+                android:inputType="numberDecimal"
+                android:textColorHint="@color/grey_500"
+                android:textSize="16sp" />
+
+            <TextView
+                android:id="@+id/equipNext"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_below="@+id/quesTv"
+                android:layout_centerHorizontal="true"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginLeft="50dp"
+                android:layout_marginTop="12dp"
+                android:layout_marginRight="50dp"
+                android:background="@drawable/bg_blue_3bacb2"
+                android:gravity="center"
+                android:paddingLeft="15dp"
+                android:paddingTop="10dp"
+                android:paddingRight="15dp"
+                android:paddingBottom="10dp"
+                android:text="下一步"
+                android:textColor="@color/white"
+                android:textSize="15sp" />
+
+            <TextView
+                android:id="@+id/equipCancel"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_below="@+id/quesTv"
+                android:layout_centerHorizontal="true"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginLeft="50dp"
+                android:layout_marginTop="12dp"
+                android:layout_marginRight="50dp"
+                android:background="@drawable/bg_grey_e6e6e6"
+                android:gravity="center"
+                android:paddingLeft="15dp"
+                android:paddingTop="10dp"
+                android:paddingRight="15dp"
+                android:paddingBottom="10dp"
+                android:text="取消"
+                android:textColor="@color/grey_900"
+                android:textSize="15sp" />
+        </LinearLayout>
+
     </RelativeLayout>
 </LinearLayout>

+ 12 - 0
demo/src/main/res/values/attrs.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!--流式布局view属性-->
+    <declare-styleable name="wrapView">
+        <attr name="padding_hor" format="integer" />
+        <attr name="padding_ver" format="integer" />
+        <attr name="side_margin" format="integer" />
+        <attr name="text_margin" format="integer" />
+        <attr name="view_type" format="integer" />
+        <attr name="isAudit" format="boolean" />
+    </declare-styleable>
+</resources>