130
+        esc.addPrintQRCode();//打印QRCode
131
+        esc.addPrintAndLineFeed();
132
+
133
+        Vector<Byte> datas = esc.getCommand(); //发送数据
134
+        Byte[] Bytes = datas.toArray(new Byte[datas.size()]);
135
+        byte[] bytes = ArrayUtils.toPrimitive(Bytes);
136
+        String str = Base64.encodeToString(bytes, Base64.DEFAULT);
137
+        int rel;
138
+        try {
139
+            rel = mGpService.sendEscCommand(mPrinterId, str);
140
+            GpCom.ERROR_CODE r = GpCom.ERROR_CODE.values()[rel];
141
+            if (r != GpCom.ERROR_CODE.SUCCESS) {
142
+                sessionView.showToast( GpCom.getErrorText(r));
143
+            }
144
+        } catch (RemoteException e) {
145
+            e.printStackTrace();
146
+        }
147
+    }
148
+
149
+    private void startAndBindPrintService() {
150
+        Intent intent = new Intent(App.getAppContext(), GpPrintService.class);
151
+        App.getAppContext().startService(intent);
101 152
         conn = new PrinterServiceConnection();
102
-        Intent intent = new Intent("com.gprinter.aidl.GpPrintService");
103 153
         App.getAppContext().bindService(intent, conn, Context.BIND_AUTO_CREATE);
104 154
     }
105 155
 
@@ -115,4 +165,5 @@ public class SessionPresenter implements SessionContract.Presenter, SessionInter
115 165
             mGpService = GpService.Stub.asInterface(service);
116 166
         }
117 167
     }
168
+
118 169
 }

+ 14 - 2
app/src/main/java/ai/pai/lensman/session/SessionQRPopup.java

@@ -5,8 +5,10 @@ import android.content.Context;
5 5
 import android.view.LayoutInflater;
6 6
 import android.view.View;
7 7
 import android.view.animation.Animation;
8
+import android.widget.Button;
8 9
 import android.widget.ImageView;
9 10
 import android.widget.LinearLayout;
11
+import android.widget.TextView;
10 12
 
11 13
 import com.android.common.utils.DeviceUtils;
12 14
 import com.android.views.popup.BasePopupWindow;
@@ -19,15 +21,18 @@ import butterknife.ButterKnife;
19 21
 public class SessionQRPopup extends BasePopupWindow {
20 22
 
21 23
     private View popupView;
24
+    private Button printQRBtn;
22 25
     private ImageView groupQRImg;
26
+    private TextView printerSetText;
23 27
     private String groupId;
24 28
     private Context context;
29
+    private View.OnClickListener listener;
25 30
 
26
-
27
-    public SessionQRPopup(Activity context, String groupId) {
31
+    public SessionQRPopup(Activity context, String groupId,View.OnClickListener listener) {
28 32
         super(context);
29 33
         this.groupId = groupId;
30 34
         this.context = context;
35
+        this.listener = listener;
31 36
         init();
32 37
     }
33 38
 
@@ -45,10 +50,16 @@ public class SessionQRPopup extends BasePopupWindow {
45 50
     public View getPopupView() {
46 51
         popupView = LayoutInflater.from(mContext).inflate(R.layout.pop_session_qr, null);
47 52
         groupQRImg = ButterKnife.findById(popupView,R.id.iv_group_qrcode);
53
+        printQRBtn = ButterKnife.findById(popupView,R.id.btn_print_qr);
54
+        printerSetText = ButterKnife.findById(popupView,R.id.tv_printer_set);
55
+
48 56
         return popupView;
49 57
     }
50 58
 
51 59
     private void init(){
60
+        printQRBtn.setOnClickListener(listener);
61
+        printerSetText.setOnClickListener(listener);
62
+
52 63
         try{
53 64
             initQRImageSize();
54 65
             groupQRImg.setImageBitmap(QRCreateUtils.Create2DCode(UrlContainer.HOST_URL+groupId, DeviceUtils.dip2px(context,200)));
@@ -56,6 +67,7 @@ public class SessionQRPopup extends BasePopupWindow {
56 67
         }catch (Exception e){
57 68
             e.printStackTrace();
58 69
         }
70
+
59 71
     }
60 72
 
61 73
     @Override

BIN
app/src/main/res/drawable-hdpi/toggle_butt_close.png


BIN
app/src/main/res/drawable-hdpi/toggle_butt_on.png


+ 7 - 0
app/src/main/res/drawable/toggle_button_selector.xml

@@ -0,0 +1,7 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
3
+
4
+    <item android:drawable="@drawable/toggle_butt_on" android:state_checked="true"/>
5
+    <item android:drawable="@drawable/toggle_butt_close" android:state_checked="false"/>
6
+
7
+</selector>

+ 191 - 0
app/src/main/res/layout/activity_printer_setting.xml

@@ -0,0 +1,191 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3
+    android:layout_width="match_parent"
4
+    android:layout_height="match_parent"
5
+    android:background="@color/background_light_grey_color">
6
+
7
+    <LinearLayout
8
+        android:id="@+id/title_bar_with_back_btn"
9
+        android:layout_width="match_parent"
10
+        android:layout_height="@dimen/action_bar_height"
11
+        android:background="@color/colorPrimary"
12
+        android:orientation="horizontal">
13
+
14
+        <LinearLayout
15
+            android:id="@+id/title_bar_back_layout"
16
+            android:layout_width="70dp"
17
+            android:layout_height="match_parent"
18
+            android:gravity="center_vertical"
19
+            android:orientation="horizontal"
20
+            android:paddingLeft="12dp">
21
+
22
+            <ImageView
23
+                android:layout_width="32dp"
24
+                android:layout_height="32dp"
25
+                android:src="@drawable/back_selector" />
26
+
27
+        </LinearLayout>
28
+
29
+        <TextView
30
+            android:id="@+id/title_bar_middle_txt"
31
+            android:layout_width="0dp"
32
+            android:layout_height="match_parent"
33
+            android:layout_weight="1"
34
+            android:gravity="center"
35
+            android:paddingLeft="10dp"
36
+            android:paddingRight="10dp"
37
+            android:text="@string/printer_settings"
38
+            android:textColor="@color/text_white"
39
+            android:textSize="@dimen/action_bar_title_medium_text_size" />
40
+
41
+        <LinearLayout
42
+            android:id="@+id/title_bar_option_layout"
43
+            android:layout_width="70dp"
44
+            android:layout_height="match_parent"
45
+            android:gravity="center_vertical|right"
46
+            android:orientation="horizontal"
47
+            android:paddingRight="9dp"
48
+            android:visibility="invisible">
49
+
50
+
51
+            <ImageView
52
+                android:id="@+id/iv_options"
53
+                android:layout_width="32dp"
54
+                android:layout_height="32dp"
55
+                android:layout_marginLeft="6dp"
56
+                android:src="@drawable/option" />
57
+
58
+        </LinearLayout>
59
+
60
+    </LinearLayout>
61
+
62
+    <ScrollView
63
+        android:layout_width="match_parent"
64
+        android:layout_height="match_parent"
65
+        android:layout_below="@id/title_bar_with_back_btn">
66
+
67
+        <LinearLayout
68
+            android:layout_width="match_parent"
69
+            android:layout_height="wrap_content"
70
+            android:orientation="vertical">
71
+
72
+            <LinearLayout
73
+                android:layout_width="match_parent"
74
+                android:layout_height="38dp"
75
+                android:gravity="center_vertical"
76
+                android:orientation="horizontal"
77
+                android:paddingLeft="12dp">
78
+
79
+                <TextView
80
+                    android:layout_width="wrap_content"
81
+                    android:layout_height="wrap_content"
82
+                    android:text="@string/printer_status"
83
+                    android:textColor="@color/grey"
84
+                    android:textSize="14sp" />
85
+            </LinearLayout>
86
+
87
+
88
+            <LinearLayout
89
+                android:layout_width="match_parent"
90
+                android:layout_height="42dp"
91
+                android:background="@color/white"
92
+                android:gravity="center_vertical"
93
+                android:orientation="horizontal"
94
+                android:paddingLeft="12dp">
95
+
96
+                <TextView
97
+                    android:id="@+id/tv_printer_status"
98
+                    android:layout_width="wrap_content"
99
+                    android:layout_height="wrap_content"
100
+                    android:text="@string/query_processing"
101
+                    android:textColor="@color/dark_grey"
102
+                    android:textSize="16sp" />
103
+            </LinearLayout>
104
+
105
+            <LinearLayout
106
+                android:layout_width="match_parent"
107
+                android:layout_height="42dp"
108
+                android:layout_marginTop="1dp"
109
+                android:background="@color/white"
110
+                android:gravity="center_vertical"
111
+                android:orientation="horizontal"
112
+                android:paddingLeft="12dp">
113
+
114
+                <TextView
115
+                    android:id="@+id/tv_print_test"
116
+                    android:layout_width="wrap_content"
117
+                    android:layout_height="wrap_content"
118
+                    android:text="@string/print_test"
119
+                    android:textColor="@color/dark_grey"
120
+                    android:textSize="16sp" />
121
+            </LinearLayout>
122
+
123
+            <LinearLayout
124
+                android:layout_width="match_parent"
125
+                android:layout_height="38dp"
126
+                android:gravity="center_vertical"
127
+                android:orientation="horizontal"
128
+                android:paddingLeft="12dp">
129
+
130
+                <TextView
131
+                    android:layout_width="wrap_content"
132
+                    android:layout_height="wrap_content"
133
+                    android:text="@string/bluetooth_status"
134
+                    android:textColor="@color/grey"
135
+                    android:textSize="14sp" />
136
+            </LinearLayout>
137
+
138
+
139
+            <LinearLayout
140
+                android:layout_width="match_parent"
141
+                android:layout_height="42dp"
142
+                android:background="@color/white"
143
+                android:gravity="center_vertical"
144
+                android:orientation="horizontal"
145
+                android:paddingLeft="12dp">
146
+
147
+                <TextView
148
+                    android:id="@+id/tv_bluetooth_status"
149
+                    android:layout_width="0dp"
150
+                    android:layout_height="wrap_content"
151
+                    android:layout_weight="1"
152
+                    android:text="@string/bt_is_enabled"
153
+                    android:textColor="@color/dark_grey"
154
+                    android:textSize="16sp" />
155
+
156
+
157
+                <ToggleButton
158
+                    android:id="@+id/tb_bluetooth_switch"
159
+                    android:layout_width="56dp"
160
+                    android:layout_height="19dp"
161
+                    android:layout_marginRight="12dp"
162
+                    android:background="@drawable/toggle_button_selector"
163
+                    android:checked="true"
164
+                    android:gravity="center"
165
+                    android:textColor="@color/white"
166
+                    android:textOff="@null"
167
+                    android:textOn="@null" />
168
+
169
+            </LinearLayout>
170
+
171
+
172
+            <LinearLayout
173
+                android:layout_width="match_parent"
174
+                android:layout_height="38dp"
175
+                android:gravity="center_vertical"
176
+                android:orientation="horizontal"
177
+                android:paddingLeft="12dp">
178
+
179
+                <TextView
180
+                    android:layout_width="wrap_content"
181
+                    android:layout_height="wrap_content"
182
+                    android:text="@string/paired_devices"
183
+                    android:textColor="@color/grey"
184
+                    android:textSize="14sp" />
185
+            </LinearLayout>
186
+
187
+        </LinearLayout>
188
+    </ScrollView>
189
+
190
+
191
+</RelativeLayout>

+ 25 - 2
app/src/main/res/layout/pop_session_qr.xml

@@ -11,8 +11,8 @@
11 11
 
12 12
         <LinearLayout
13 13
             android:id="@+id/popup_anima"
14
-            android:layout_width="270dp"
15
-            android:layout_height="270dp"
14
+            android:layout_width="300dp"
15
+            android:layout_height="360dp"
16 16
             android:layout_centerInParent="true"
17 17
             android:gravity="center"
18 18
             android:background="@color/pop_bg_color"
@@ -34,6 +34,29 @@
34 34
                 android:textColor="@color/grey"
35 35
                 android:textSize="12sp" />
36 36
 
37
+            <Button
38
+                android:id="@+id/btn_print_qr"
39
+                android:layout_width="wrap_content"
40
+                android:layout_height="wrap_content"
41
+                android:paddingLeft="8dp"
42
+                android:paddingRight="8dp"
43
+                android:paddingBottom="5dp"
44
+                android:paddingTop="5dp"
45
+                android:textSize="14sp"
46
+                android:textColor="@color/dark_grey"
47
+                android:layout_marginTop="10dp"
48
+                android:text="@string/print_qr"/>
49
+
50
+            <TextView
51
+                android:id="@+id/tv_printer_set"
52
+                android:layout_marginTop="16dp"
53
+                android:padding="5dp"
54
+                android:layout_width="wrap_content"
55
+                android:layout_height="wrap_content"
56
+                android:text="@string/check_printer"
57
+                android:textColor="@color/light_blue"
58
+                android:textSize="12sp" />
59
+
37 60
         </LinearLayout>
38 61
 
39 62
     </RelativeLayout>

+ 28 - 0
app/src/main/res/values/strings.xml

@@ -58,4 +58,32 @@
58 58
     <string name="no_system_msg">暂无新系统消息</string>
59 59
 
60 60
     <string name="no_order_msg">暂无新购买消息</string>
61
+
62
+    <string name="print_qr">打印二维码</string>
63
+
64
+    <string name="check_bluetooth">请检查手机蓝牙是否开启</string>
65
+
66
+    <string name="check_printer">打印遇到问题了?去设置</string>
67
+
68
+    <string name="printer_settings">打印机设置</string>
69
+
70
+    <string name="printer_status">打印机状态</string>
71
+
72
+    <string name="query_processing">正在查询</string>
73
+
74
+    <string name="print_test">打印测试页</string>
75
+
76
+    <string name="bluetooth_status">蓝牙状态</string>
77
+
78
+    <string name="bt_is_enabled">蓝牙已打开</string>
79
+
80
+    <string name="bt_is_disabled">蓝牙已关闭</string>
81
+
82
+    <string name="connected_device">已连接设备</string>
83
+
84
+    <string name="discover_device">搜索设备</string>
85
+
86
+    <string name="paired_devices">已配对设备</string>
87
+
88
+    <string name="new_usable_devices">新可用设备</string>
61 89
 </resources>

thermometer - Gogs: Go Git Service

Nessuna descrizione

eqpt_views.py 13KB

    # -*- coding: utf-8 -*- from __future__ import division import json from django.conf import settings from django.db.models import Max, Q from django_logit import logit from django_query import get_query_value from django_response import response from paginator import pagination from TimeConvert import TimeConvert as tc from equipment.models import (IsolationPointInfo, IsolationPointUserInfo, ThermometerEquipmentInfo, ThermometerMeasureLogInfo) from utils.error.errno_utils import IsolationPointStatusCode, ThermometerEquipmentStatusCode from utils.redis.rscreen import get_screen_info, set_screen_info @logit def eqpt_bind(request): point_id = request.POST.get('point_id', '') macid = request.POST.get('macid', '') sn = request.POST.get('sn', '') macidsns = get_query_value(request, 'macidsns', val_cast_type='listjson') macidsns = macidsns or [{'macid': macid, 'sn': sn}] for macidsn in macidsns: macid, sn = macidsn.get('macid'), macidsn.get('sn') ThermometerEquipmentInfo.objects.update_or_create(macid=macid, defaults={ 'point_id': point_id, 'sn': sn, }) return response() @logit def eqpt_onoff(request): macid = request.POST.get('macid', '') active = int(request.POST.get('active', 0)) try: eqpt = ThermometerEquipmentInfo.objects.get(macid=macid) except ThermometerEquipmentInfo.DoesNotExist: return response(ThermometerEquipmentStatusCode.THERMOMETER_EQUIPMENT_NOT_FOUND) if active == 0: try: ipui = IsolationPointUserInfo.objects.get(pk=eqpt.ipui_pk) except IsolationPointUserInfo.DoesNotExist: ipui = None if ipui: ipui.leave_at = tc.utc_datetime() ipui.status = False ipui.save() eqpt.active_status = active eqpt.ipui_pk = 0 eqpt.save() return response() @logit def eqpt_remark(request): macid = request.POST.get('macid', '') remark = request.POST.get('remark', '') try: eqpt = ThermometerEquipmentInfo.objects.get(macid=macid) except ThermometerEquipmentInfo.DoesNotExist: return response(ThermometerEquipmentStatusCode.THERMOMETER_EQUIPMENT_NOT_FOUND) eqpt.remark = remark eqpt.save() # 存放历史备注记录 try: ipui = IsolationPointUserInfo.objects.get(pk=eqpt.ipui_pk) except IsolationPointUserInfo.DoesNotExist: ipui = None if ipui: ipui.remark = remark ipui.remarks += [remark] ipui.save() return response() @logit(body=True) def eqpt_list(request): point_id = request.POST.get('point_id', '') macid = request.POST.get('macid', '') page = request.POST.get('page', 1) num = request.POST.get('num', 20) eqpts = ThermometerEquipmentInfo.objects.filter(point_id=point_id, status=True) if macid: eqpts = eqpts.filter(macid=macid) total_num = eqpts.count() active_num = eqpts.filter(active_status=ThermometerEquipmentInfo.ONLINE).count() eqpts, left = pagination(eqpts, page, num) eqpts = [eqpt.data for eqpt in eqpts] return response(data={ 'eqpts': eqpts, 'left': left, 'total_num': total_num, 'active_num': active_num, 'unactive_num': total_num - active_num, }) @logit def eqpt_result(request): point_id = request.POST.get('point_id', '') kw = request.POST.get('kw', '') page = request.POST.get('page', 1) num = request.POST.get('num', 20) try: point = IsolationPointInfo.objects.get(point_id=point_id, status=True) except IsolationPointInfo.DoesNotExist: return response(IsolationPointStatusCode.ISOLATIONPOINT_NOT_FOUND) eqpts = ThermometerEquipmentInfo.objects.filter(point_id=point_id, active_status=ThermometerEquipmentInfo.ONLINE, status=True) ipuis = IsolationPointUserInfo.objects.filter(point_id=point.point_id, status=True) ipuis = [ipui.data for ipui in ipuis] total_active_eqpt_num = eqpts.count() has_upload_temperature_num = len([1 for ipui in ipuis if ipui.get('temperature_has_upload', '') == IsolationPointUserInfo.HAS_YET_UPLOAD]) fever_num = len([1 for ipui in ipuis if ipui.get('temperature', 0) > settings.FEVER_TEMPERATURE]) ipuis = {ipui.get('pk'): { 'fields': ipui.get('fields', []), 'observed_days': ipui.get('observed_days', 0), 'temperature_has_upload': ipui.get('temperature_has_upload', ''), 'temperature': ipui.get('temperature', 0), 'last_submit_at': ipui.get('last_submit_at', ''), 'remark': ipui.get('remark', ''), } for ipui in ipuis} if kw: eqpts = eqpts.filter(Q(name__icontains=kw) | Q(phone__icontains=kw)) eqpts, left = pagination(eqpts, page, num) eqpts = [{**eqpt.data, **{ 'has_upload': ipuis.get(eqpt.ipui_pk, {}).get('temperature_has_upload', ''), 'temperature': ipuis.get(eqpt.ipui_pk, {}).get('temperature', 0), 'observed_days': ipuis.get(eqpt.ipui_pk, {}).get('observed_days', 0), 'last_submit_at': ipuis.get(eqpt.ipui_pk, {}).get('last_submit_at', ''), 'remark': ipuis.get(eqpt.ipui_pk, {}).get('remark', ''), 'fields': ipuis.get(eqpt.ipui_pk, {}).get('fields', []), }} for eqpt in eqpts] return response(data={ 'eqpts': eqpts, 'left': left, 'total_active_eqpt_num': total_active_eqpt_num, 'has_upload_temperature_num': has_upload_temperature_num, 'not_upload_temperature_num': total_active_eqpt_num - has_upload_temperature_num, 'fever_num': fever_num, }) def get_screen_data(point=None, point_id=None): if not point: try: point = IsolationPointInfo.objects.get(point_id=point_id, status=True) except IsolationPointInfo.DoesNotExist: return {} eqpts = ThermometerEquipmentInfo.objects.filter(point_id=point.point_id, active_status=ThermometerEquipmentInfo.ONLINE, status=True) ipuis = IsolationPointUserInfo.objects.filter(point_id=point.point_id, status=True) ipuis = [ipui.data for ipui in ipuis] total_active_eqpt_num = eqpts.count() has_upload_temperature_num = len([1 for ipui in ipuis if ipui.get('temperature_has_upload', '') == IsolationPointUserInfo.HAS_YET_UPLOAD]) fever_num = len([1 for ipui in ipuis if ipui.get('temperature', 0) > settings.FEVER_TEMPERATURE]) ipuis = {ipui.get('pk'): { 'fields': ipui.get('fields', []), 'observed_days': ipui.get('observed_days', 0), 'temperature_has_upload': ipui.get('temperature_has_upload', ''), 'temperature': ipui.get('temperature', 0), 'last_submit_at': ipui.get('last_submit_at', ''), 'remark': ipui.get('remark', ''), } for ipui in ipuis} eqpts = [{**eqpt.screen_data, **{ 'has_upload': ipuis.get(eqpt.ipui_pk, {}).get('temperature_has_upload', ''), 'temperature': ipuis.get(eqpt.ipui_pk, {}).get('temperature', 0), 'observed_days': ipuis.get(eqpt.ipui_pk, {}).get('observed_days', 0), 'last_submit_at': ipuis.get(eqpt.ipui_pk, {}).get('last_submit_at', ''), 'remark': ipuis.get(eqpt.ipui_pk, {}).get('remark', ''), }, **{ field.get('key', ''): field.get('value', '') for field in ipuis.get(eqpt.ipui_pk, {}).get('fields', []) }} for eqpt in eqpts] reminds = [{ 'name': eqpt.get('name'), 'room': eqpt.get('room'), 'content': eqpt.get('remark'), } for eqpt in eqpts if eqpt.get('remark')] eqpts = [{ 'name': eqpt.get('name', ''), 'room': eqpt.get('room', ''), 'phone': eqpt.get('phone', ''), 'sex': eqpt.get('sex', ''), 'age': eqpt.get('age', ''), 'status': eqpt.get('has_upload'), 'last_report_time': eqpt.get('last_submit_at', ''), 'temperature': eqpt.get('temperature', 0), 'observed_days': eqpt.get('observed_days', 0), } for eqpt in eqpts] # 排序:发烧 > 未上报 > 充电中 > 时间 eqpts_fever = [] eqpts_not_upload = [] eqpts_chg = [] eqpts_other = [] for eqpt in eqpts: status = eqpt.get('status') temperature = eqpt.get('temperature') if temperature > settings.FEVER_TEMPERATURE: eqpts_fever.append(eqpt) elif status == IsolationPointUserInfo.HAS_NOT_UPLOAD and temperature <= settings.FEVER_TEMPERATURE: eqpts_not_upload.append(eqpt) elif status == IsolationPointUserInfo.CHG_STA_CHARGING: eqpts_chg.append(eqpt) else: eqpts_other.append(eqpt) return { 'eqpts': eqpts_fever + eqpts_not_upload + eqpts_chg + eqpts_other, 'reminds': reminds, 'total_active_eqpt_num': total_active_eqpt_num, 'has_upload_temperature_num': has_upload_temperature_num, 'not_upload_temperature_num': total_active_eqpt_num - has_upload_temperature_num, 'normal_num': has_upload_temperature_num - fever_num, 'fever_num': fever_num, 'update_time': tc.local_string(), } @logit def screen_eqpt_result(request): point_id = request.POST.get('point_id', '') screen_info = get_screen_info(point_id) if screen_info: return response(data=screen_info) try: point = IsolationPointInfo.objects.get(point_id=point_id, status=True) except IsolationPointInfo.DoesNotExist: return response(IsolationPointStatusCode.ISOLATIONPOINT_NOT_FOUND) screen_data = get_screen_data(point) return response(data=screen_data) @logit def upload_temperature(request): return response() def mqtt_upload_temperature(payload): # Received `{"mac":"A4DA324E7A63","pkt":"215","chg_sta":true,"bat":"100","raw_temp":"4697,4696,4697","sta":"0","alg_temp":"4697,4696,4697","alg_gstr":0,"ble_rssi":-21,"wifi_rssi":-68,"current_time":"2021-08-08 15:22:59"}` from `esp/240AC4D3C1AC` topic # # { # "mac": "A4DA324E7A63", # 体温贴 mac,固定 6 个字节,12 个字符 # "pkt": "215", # 广播包包序为 85,有效包序范围[1, 255] # "chg_sta": true, # 充电状态,true 充电,false 未充电 # "bat": "100", # 电量剩余 65%,有效电量范围[0, 100] # "raw_temp": "4697,4696,4697", # 三个原始温度数 # "sta": "0", # 算法返回状态 # "alg_temp": "4697,4696,4697", # 算法返回三个温度 # "alg_gstr": 0, # 算法手臂姿态 # "ble_rssi": -21, # 体温贴相对于底座的信号强度 # "wifi_rssi": -68, # 底座网络信号强度 # "current_time": "2021-08-08 15:22:59" # 底座接收到体温贴信息的实时时间 # } try: payload = json.loads(payload) except Exception: return alg_temp = payload.get('alg_temp', '') temp = alg_temp.split(',') temp = [int(t) for t in temp if t] if not temp: return temperature = max(temp) / 100 # 充电状态,true 充电,false 未充电 chg_sta = payload.get('chg_sta', False) # 电量剩余 65%,有效电量范围[0, 100] bat = payload.get('bat', 0) # 充电状态 or (电量剩余 100% + 温度超过 37 度),温度忽略 ignore_temperature = False if chg_sta or (bat == 100 and temperature > 37): ignore_temperature = True chg_sta = True macid = payload.get('mac', '') macid = f'{macid[:2]}:{macid[2:4]}:{macid[4:6]}:{macid[6:8]}:{macid[8:10]}:{macid[10:12]}' current_time = payload.get('current_time', '') start_stamp = end_stamp = tc.string_to_timestamp(current_time) try: eqpt = ThermometerEquipmentInfo.objects.get(macid=macid, status=True) except ThermometerEquipmentInfo.DoesNotExist: # ThermometerMeasureLogInfo.objects.create(macid=macid, start_stamp=start_stamp, end_stamp=end_stamp, temperature=temperature, temperature_src=ThermometerMeasureLogInfo.MQTT, upload_temperature_info=payload, status=False) return try: point = IsolationPointInfo.objects.get(point_id=eqpt.point_id, status=True) except IsolationPointInfo.DoesNotExist: return ThermometerMeasureLogInfo.objects.create(point_id=eqpt.point_id, macid=macid, start_stamp=start_stamp, end_stamp=end_stamp, temperature=temperature, temperature_src=ThermometerMeasureLogInfo.MQTT, upload_temperature_info=payload, chg_sta=chg_sta) try: ipui = IsolationPointUserInfo.objects.get(pk=eqpt.ipui_pk) except IsolationPointUserInfo.DoesNotExist: ipui = None if ipui: if not ignore_temperature: temperature__max = ThermometerMeasureLogInfo.objects.filter( point_id=eqpt.point_id, macid=macid, chg_sta=False, created_at__gte=tc.utc_datetime(hours=-1), ).aggregate(Max('temperature')).get('temperature__max') or 0 ipui.observed_ymds = list(set(ipui.observed_ymds + [tc.local_string(format='%Y-%m-%d')])) ipui.observed_days = len(ipui.observed_ymds) ipui.temperature = temperature__max or ipui.temperature ipui.last_submit_at = tc.utc_datetime() ipui.chg_sta = chg_sta ipui.save() set_screen_info(point.point_id, get_screen_data(point))