WXL (wul)
2025-08-27 f4609c62152cab3bd9b7f8efd3f967f82650ee40
测试完成
已添加8个文件
已修改20个文件
已重命名1个文件
4202 ■■■■ 文件已修改
.gitconfig 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dist.zip 补丁 | 查看 | 原始文档 | blame | 历史
e -i HEAD~1 补丁 | 查看 | 原始文档 | blame | 历史
e -i HEAD~7 442 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
et --hard HEAD@{1} 559 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h origin --force --all 258 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/AiCentre/EChartsdata.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/AiCentre/index.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/AiCentre/satisfactionse.js 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/order/example.mp3 补丁 | 查看 | 原始文档 | blame | 历史
src/components/CallButton/index.vue 199 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/Sidebar/SidebarItem.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/user.js 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/sipService-cs.js 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/sipService.js 284 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/discharge/index.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/record/detailpage/index.vue 186 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/tasklist/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/index.vue 397 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/knowledge/education/compilequer/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/knowledge/education/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/patient/hospital.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/Missioncreation.vue 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/QuestionnaireTask.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sfstatistics/percentage/index.vue 713 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/shortmessage/healthinformation/compilequer/index.vue 713 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/shortmessage/healthinformation/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitconfig
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
[user]
    name = WXL (wul)
    email = wl_5969728@163.com
dist.zip
Binary files differ
e -i HEAD~1
e -i HEAD~7
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,442 @@
ac8b123 - WXL (wul) <wl_5969728@163.com> : æµ‹è¯•完成
cd51caf - å´é¾™ <wl_5969728@163.com> : æµ‹è¯•完成
b685449 - WXL (wul) <wl_5969728@163.com> : æµ‹è¯•完成
8220a01 - WXL (wul) <wl_5969728@163.com> : æµ‹è¯•完成
488008e - WXL <wl_5969728@163.com> : ä½ çš„æäº¤ä¿¡æ¯
9a164d2 - WXL <wl_5969728@163.com> : ä½ çš„æäº¤ä¿¡æ¯
9403890 - å´é¾™ <wl_5969728@163.com> : æµ‹è¯•完成
022e803 - WXL <1785969728@qq.com> : æµ‹è¯•完成
4898664 - WXL <1785969728@qq.com> : æµ‹è¯•完成
337fb92 - WXL <1785969728@qq.com> : æµ‹è¯•完成
a7a20b2 - WXL <1785969728@qq.com> : æµ‹è¯•完成
6f1e7a6 - WXL <1785969728@qq.com> : æµ‹è¯•完成
5fba330 - WXL <1785969728@qq.com> : æµ‹è¯•完成
209b2f7 - WXL <1785969728@qq.com> : æµ‹è¯•完成
53f4f0a - WXL <1785969728@qq.com> : æµ‹è¯•完成
2eff945 - WXL <1785969728@qq.com> : æµ‹è¯•完成
b6c854d - WXL <1785969728@qq.com> : æµ‹è¯•完成
ec2f429 - WXL <1785969728@qq.com> : æµ‹è¯•完成
c1f1ecb - WXL <1785969728@qq.com> : æµ‹è¯•完成
7449ee9 - WXL <1785969728@qq.com> : æµ‹è¯•完成
9ed874d - WXL <1785969728@qq.com> : æµ‹è¯•完成
6253746 - WXL <1785969728@qq.com> : æµ‹è¯•完成
5fb8598 - WXL <1785969728@qq.com> : æµ‹è¯•完成
aa06424 - WXL <1785969728@qq.com> : æµ‹è¯•完成
5733abb - WXL <1785969728@qq.com> : æµ‹è¯•完成
9668152 - WXL <1785969728@qq.com> : æµ‹è¯•完成
f06ac34 - WXL <1785969728@qq.com> : æµ‹è¯•完成
20cd2de - WXL <1785969728@qq.com> : æµ‹è¯•完成
fe379fd - WXL <1785969728@qq.com> : æµ‹è¯•完成
9cc3dcf - WXL <1785969728@qq.com> : æµ‹è¯•完成
3ae495d - WXL <1785969728@qq.com> : æµ‹è¯•完成
dafbb90 - WXL <1785969728@qq.com> : æµ‹è¯•完成
665ac63 - WXL <1785969728@qq.com> : æµ‹è¯•完成
9a5dd25 - WXL <1785969728@qq.com> : æµ‹è¯•完成
880e036 - WXL <1785969728@qq.com> : æµ‹è¯•完成
e10381f - WXL <1785969728@qq.com> : æµ‹è¯•完成
c7c591d - WXL <1785969728@qq.com> : æµ‹è¯•完成
af3ff15 - WXL <1785969728@qq.com> : æµ‹è¯•完成
36d1334 - WXL <1785969728@qq.com> : æµ‹è¯•完成
a22820c - WXL <1785969728@qq.com> : æµ‹è¯•完成
f3f7256 - WXL <1785969728@qq.com> : æµ‹è¯•完成
84e20d0 - WXL <1785969728@qq.com> : æµ‹è¯•完成
572a624 - WXL <1785969728@qq.com> : æµ‹è¯•完成
a5bc95e - WXL <1785969728@qq.com> : æµ‹è¯•完成
be764ba - WXL <1785969728@qq.com> : æµ‹è¯•完成
e46bb66 - WXL <1785969728@qq.com> : æµ‹è¯•完成
8ed125f - WXL <1785969728@qq.com> : ç»Ÿè®¡å®Œæˆ
37d2ba3 - WXL <1785969728@qq.com> : æµ‹è¯•完成
45f9797 - WXL <1785969728@qq.com> : æµ‹è¯•完成
0e3739a - WXL <1785969728@qq.com> : æµ‹è¯•完成
54489da - WXL <1785969728@qq.com> : æµ‹è¯•完成
303d443 - WXL <1785969728@qq.com> : æµ‹è¯•完成
5a8e93d - WXL <1785969728@qq.com> : æµ‹è¯•完成
4413b46 - WXL <1785969728@qq.com> : æµ‹è¯•完成
0529f31 - WXL <1785969728@qq.com> : æµ‹è¯•完成
08c27c1 - WXL <1785969728@qq.com> : æµ‹è¯•完成
6d7cd13 - WXL <1785969728@qq.com> : æµ‹è¯•完成
8e71817 - WXL <1785969728@qq.com> : æµ‹è¯•完成
b7092c2 - WXL <1785969728@qq.com> : æµ‹è¯•完成
bc241c4 - WXL <1785969728@qq.com> : æµ‹è¯•完成
5e17454 - WXL <1785969728@qq.com> : æµ‹è¯•完成
186b271 - WXL <1785969728@qq.com> : æµ‹è¯•完成
6535680 - WXL <1785969728@qq.com> : æµ‹è¯•完成
6be4939 - WXL <1785969728@qq.com> : æµ‹è¯•完成
400d13d - WXL <1785969728@qq.com> : æµ‹è¯•完成
3877190 - WXL <1785969728@qq.com> : æµ‹è¯•完成
78f514b - WXL <1785969728@qq.com> : æµ‹è¯•完成
fecb2f5 - WXL <1785969728@qq.com> : æµ‹è¯•完成
4395f0d - WXL <1785969728@qq.com> : æµ‹è¯•完成
327d234 - WXL <1785969728@qq.com> : æµ‹è¯•完成
56b8443 - WXL <1785969728@qq.com> : æµ‹è¯•完成
8d0f7fc - WXL <1785969728@qq.com> : æµ‹è¯•完成
38c9042 - WXL <1785969728@qq.com> : æµ‹è¯•完成
7d47700 - WXL <1785969728@qq.com> : æµ‹è¯•完成
273e2fa - WXL <1785969728@qq.com> : æµ‹è¯•完成
401c835 - WXL <1785969728@qq.com> : æµ‹è¯•完成
60e5b16 - WXL <1785969728@qq.com> : æµ‹è¯•完成
6e54a66 - WXL <1785969728@qq.com> : æµ‹è¯•完成
ee8f1a0 - WXL <1785969728@qq.com> : æµ‹è¯•完成
5f3691d - WXL <1785969728@qq.com> : æµ‹è¯•完成
4b60348 - WXL <1785969728@qq.com> : æµ‹è¯•完成
418e3a7 - WXL <1785969728@qq.com> : æµ‹è¯•完成
4c9eab7 - WXL <1785969728@qq.com> : æµ‹è¯•完成
15e42d9 - WXL <1785969728@qq.com> : æµ‹è¯•完成
9f5b4e2 - WXL <1785969728@qq.com> : æµ‹è¯•完成
99a916e - WXL <1785969728@qq.com> : æµ‹è¯•完成
abde816 - WXL <1785969728@qq.com> : æµ‹è¯•完成
81ffbda - WXL <1785969728@qq.com> : æµ‹è¯•完成
935e93f - WXL <1785969728@qq.com> : æµ‹è¯•完成
b73b5dd - WXL <1785969728@qq.com> : æµ‹è¯•完成
2daa54c - WXL <1785969728@qq.com> : æµ‹è¯•完成
073edc9 - WXL <1785969728@qq.com> : æµ‹è¯•完成
838d8b5 - WXL <1785969728@qq.com> : æµ‹è¯•完成
3fd01fa - WXL <1785969728@qq.com> : æµ‹è¯•完成
88481a3 - WXL <1785969728@qq.com> : æµ‹è¯•完成
12eb16c - WXL <1785969728@qq.com> : æµ‹è¯•完成
083ae82 - WXL <1785969728@qq.com> : æµ‹è¯•完成
36b7179 - WXL <1785969728@qq.com> : æµ‹è¯•完成
03a3eff - WXL <1785969728@qq.com> : æµ‹è¯•完成
2b1cfea - WXL <1785969728@qq.com> : æµ‹è¯•完成
ff99a9b - WXL <1785969728@qq.com> : æµ‹è¯•完成
cf2c2a9 - WXL <1785969728@qq.com> : æµ‹è¯•完成
a77752e - WXL <1785969728@qq.com> : æµ‹è¯•完成
3bb35f1 - WXL <1785969728@qq.com> : æµ‹è¯•完成
b0dd238 - WXL <1785969728@qq.com> : æµ‹è¯•完成
57a7537 - WXL <1785969728@qq.com> : æµ‹è¯•完成
83d8322 - WXL <1785969728@qq.com> : æµ‹è¯•完成
ee1d4af - WXL <1785969728@qq.com> : æµ‹è¯•完成
bcf3cae - WXL <1785969728@qq.com> : æµ‹è¯•完成
d5f7da9 - WXL <1785969728@qq.com> : æµ‹è¯•完成
5acc6d2 - WXL <1785969728@qq.com> : æµ‹è¯•完成
355bbb7 - WXL <1785969728@qq.com> : æµ‹è¯•完成
a3d2f84 - WXL <1785969728@qq.com> : æµ‹è¯•完成
ee31f47 - WXL <1785969728@qq.com> : æµ‹è¯•完成
bc99b53 - WXL <1785969728@qq.com> : æµ‹è¯•完成
84b1d28 - WXL <1785969728@qq.com> : æµ‹è¯•完成
bfce8d1 - WXL <1785969728@qq.com> : æµ‹è¯•完成
44d24a2 - WXL <1785969728@qq.com> : æµ‹è¯•完成
17edb0e - WXL <1785969728@qq.com> : æµ‹è¯•完成
891f159 - WXL <1785969728@qq.com> : æµ‹è¯•完成
5f4c59e - WXL <1785969728@qq.com> : æµ‹è¯•完成
4f3692a - WXL <1785969728@qq.com> : æµ‹è¯•完成
321891f - WXL <1785969728@qq.com> : æµ‹è¯•完成
3b8d057 - WXL <1785969728@qq.com> : æµ‹è¯•完成
50873f4 - WXL <1785969728@qq.com> : æµ‹è¯•完成
ec64a69 - WXL <1785969728@qq.com> : æµ‹è¯•完成
8aa0592 - WXL <1785969728@qq.com> : æµ‹è¯•完成
a5faf6e - WXL <1785969728@qq.com> : æµ‹è¯•完成
f6bc6ed - WXL <1785969728@qq.com> : æµ‹è¯•完成
46784b2 - WXL <1785969728@qq.com> : æµ‹è¯•完成
e48362d - WXL <1785969728@qq.com> : æµ‹è¯•完成
f4e079f - WXL <1785969728@qq.com> : æµ‹è¯•完成
dea82b7 - WXL <1785969728@qq.com> : æµ‹è¯•完成
4cd2bfd - WXL <1785969728@qq.com> : æµ‹è¯•完成
7cfedaa - WXL <1785969728@qq.com> : æµ‹è¯•完成
0c2a0bd - WXL <1785969728@qq.com> : æµ‹è¯•完成
48e96f3 - WXL <1785969728@qq.com> : æµ‹è¯•完成
98589bb - WXL <1785969728@qq.com> : æµ‹è¯•完成
fc63b5b - WXL <1785969728@qq.com> : æµ‹è¯•完成
981fbdd - WXL <1785969728@qq.com> : æµ‹è¯•完成
6de02b3 - WXL <1785969728@qq.com> : æµ‹è¯•完成
9896138 - WXL <1785969728@qq.com> : æµ‹è¯•完成
aca3443 - WXL <1785969728@qq.com> : æµ‹è¯•完成
1a090a4 - WXL <1785969728@qq.com> : æµ‹è¯•完成
8c79267 - WXL <1785969728@qq.com> : æµ‹è¯•完成
4a7648d - WXL <1785969728@qq.com> : æµ‹è¯•完成
09a1bd5 - WXL <1785969728@qq.com> : æµ‹è¯•完成
4492ab0 - WXL <1785969728@qq.com> : æµ‹è¯•完成
eef0168 - WXL <1785969728@qq.com> : æµ‹è¯•完成
080186b - WXL <1785969728@qq.com> : æµ‹è¯•完成
0a4cc3c - WXL <1785969728@qq.com> : æµ‹è¯•完成
1cb1fbf - WXL <1785969728@qq.com> : æµ‹è¯•完成
3dcfdb6 - WXL <1785969728@qq.com> : ä¸½æ°´æäº¤
77fb64c - WXL <1785969728@qq.com> : æ–°åŽæäº¤
9507541 - WXL <1785969728@qq.com> : æ— é”¡æäº¤
07e07d6 - WXL <1785969728@qq.com> : æ–°åŽæäº¤
b26c48a - WXL <1785969728@qq.com> : æµ‹è¯•完成
c1139d1 - WXL <1785969728@qq.com> : æµ‹è¯•完成
b1d81d0 - WXL <1785969728@qq.com> : æµ‹è¯•完成
ae117f0 - WXL <1785969728@qq.com> : æµ‹è¯•完成
5dc9d1b - WXL <1785969728@qq.com> : æµ‹è¯•完成
9a1a82e - WXL <1785969728@qq.com> : æµ‹è¯•完成
294e513 - WXL <1785969728@qq.com> : æµ‹è¯•完成
007d388 - WXL <1785969728@qq.com> : æµ‹è¯•完成
bf6643a - WXL <1785969728@qq.com> : æµ‹è¯•完成
2a39af9 - WXL <1785969728@qq.com> : æµ‹è¯•完成
0c26cb5 - WXL <1785969728@qq.com> : æµ‹è¯•完成
196465c - WXL <1785969728@qq.com> : æµ‹è¯•完成
9a9bd52 - WXL <1785969728@qq.com> : æµ‹è¯•完成
7611c86 - WXL <1785969728@qq.com> : æµ‹è¯•完成
b557dde - WXL <1785969728@qq.com> : æµ‹è¯•完成
021f489 - WXL <1785969728@qq.com> : æµ‹è¯•完成
df311bf - WXL <1785969728@qq.com> : æµ‹è¯•完成
7fca01a - WXL <1785969728@qq.com> : æµ‹è¯•完成
a7c11f4 - WXL <1785969728@qq.com> : æµ‹è¯•完成
f2d3945 - WXL <1785969728@qq.com> : æµ‹è¯•完成
f1d0ce1 - WXL <1785969728@qq.com> : æµ‹è¯•完成
b229d5e - WXL <1785969728@qq.com> : æµ‹è¯•完成
0a9c173 - WXL <1785969728@qq.com> : æµ‹è¯•完成
6f35ca7 - WXL <1785969728@qq.com> : æµ‹è¯•完成
b10795e - WXL <1785969728@qq.com> : æµ‹è¯•完成
cdba63e - WXL <1785969728@qq.com> : æµ‹è¯•完成
83598fa - WXL <1785969728@qq.com> : æµ‹è¯•完成
9da8c98 - WXL <1785969728@qq.com> : æµ‹è¯•完成
39bb435 - WXL <1785969728@qq.com> : æµ‹è¯•完成
2fe94c2 - WXL <1785969728@qq.com> : æµ‹è¯•完成
7e1ced1 - WXL <1785969728@qq.com> : æµ‹è¯•完成
476569c - WXL <1785969728@qq.com> : æµ‹è¯•完成
83898e6 - WXL <1785969728@qq.com> : æµ‹è¯•完成
2c4c416 - WXL <1785969728@qq.com> : æµ‹è¯•完成
b5a56d5 - WXL <1785969728@qq.com> : æµ‹è¯•完成
2073439 - WXL <1785969728@qq.com> : æµ‹è¯•完成
5c35457 - WXL <1785969728@qq.com> : æµ‹è¯•完成
4e6c841 - WXL <1785969728@qq.com> : æµ‹è¯•完成
d27e3ad - WXL <1785969728@qq.com> : æµ‹è¯•完成
9ff0d92 - WXL <1785969728@qq.com> : æµ‹è¯•完成
a49ce34 - WXL <1785969728@qq.com> : æµ‹è¯•完成
88d423c - WXL <1785969728@qq.com> : æµ‹è¯•完成
df59cae - WXL <1785969728@qq.com> : æµ‹è¯•完成
44fe7b7 - WXL <1785969728@qq.com> : æµ‹è¯•完成
7eaee92 - WXL <1785969728@qq.com> : æµ‹è¯•完成
aa055fa - WXL <1785969728@qq.com> : æµ‹è¯•完成
d03829b - WXL <1785969728@qq.com> : æµ‹è¯•完成
a346cfb - WXL <1785969728@qq.com> : æµ‹è¯•完成
8dcf298 - WXL <1785969728@qq.com> : æµ‹è¯•完成
c73a2c3 - WXL <1785969728@qq.com> : æµ‹è¯•完成
c4f2875 - WXL <1785969728@qq.com> : æµ‹è¯•完成
b50917f - WXL <1785969728@qq.com> : æµ‹è¯•完成
62bfa86 - WXL <1785969728@qq.com> : æµ‹è¯•完成
0733833 - WXL <1785969728@qq.com> : æµ‹è¯•完成
09b701d - WXL <1785969728@qq.com> : æµ‹è¯•完成
adf7c94 - WXL <1785969728@qq.com> : æµ‹è¯•完成
9bc2723 - WXL <1785969728@qq.com> : æµ‹è¯•完成
720f7c4 - WXL <1785969728@qq.com> : æµ‹è¯•完成
8904734 - WXL <1785969728@qq.com> : æµ‹è¯•完成
8aca823 - WXL <1785969728@qq.com> : æµ‹è¯•完成
d1367a2 - WXL <1785969728@qq.com> : æµ‹è¯•完成
1b7eb08 - WXL <1785969728@qq.com> : æµ‹è¯•完成
fe7f65e - WXL <1785969728@qq.com> : æµ‹è¯•完成
77a9385 - WXL <1785969728@qq.com> : æµ‹è¯•完成
17b041e - WXL <1785969728@qq.com> : æµ‹è¯•完成
e13d441 - WXL <1785969728@qq.com> : æµ‹è¯•完成
ad0ecac - WXL <1785969728@qq.com> : æµ‹è¯•完成
9201094 - WXL <1785969728@qq.com> : æµ‹è¯•完成
d96a756 - WXL <1785969728@qq.com> : æµ‹è¯•完成
1811ac2 - WXL <1785969728@qq.com> : æµ‹è¯•完成
a9a1a5c - WXL <1785969728@qq.com> : æµ‹è¯•完成
bac13bc - WXL <1785969728@qq.com> : æµ‹è¯•完成
41b1f52 - WXL <1785969728@qq.com> : æµ‹è¯•完成
2599fae - WXL <1785969728@qq.com> : æµ‹è¯•完成
8ec6407 - WXL <1785969728@qq.com> : æµ‹è¯•完成
3d50e2c - WXL <1785969728@qq.com> : æµ‹è¯•完成
2c9ddeb - WXL <1785969728@qq.com> : æµ‹è¯•完成
dad71d3 - WXL <1785969728@qq.com> : æµ‹è¯•完成
40bdf0b - WXL <1785969728@qq.com> : æµ‹è¯•完成
841b389 - WXL <1785969728@qq.com> : æµ‹è¯•完成
b5f603e - WXL <1785969728@qq.com> : æµ‹è¯•完成
a4dff39 - WXL <1785969728@qq.com> : æµ‹è¯•完成
6b6cc07 - WXL <1785969728@qq.com> : æµ‹è¯•完成
b14bdee - WXL <1785969728@qq.com> : æµ‹è¯•完成
e717068 - WXL <1785969728@qq.com> : æµ‹è¯•完成
bc8e3ab - WXL <1785969728@qq.com> : æµ‹è¯•完成
8f7984b - WXL <1785969728@qq.com> : æµ‹è¯•完成
9f4da36 - WXL <1785969728@qq.com> : æµ‹è¯•完成
76196fb - WXL <1785969728@qq.com> : æµ‹è¯•完成
49299bb - WXL <1785969728@qq.com> : æµ‹è¯•完成
452e7fb - WXL <1785969728@qq.com> : æµ‹è¯•完成
193b6ba - WXL <1785969728@qq.com> : æµ‹è¯•完成
96915c5 - WXL <1785969728@qq.com> : æµ‹è¯•完成
b09476a - WXL <1785969728@qq.com> : æµ‹è¯•完成
0e4451c - WXL <1785969728@qq.com> : æµ‹è¯•完成
cc73ea5 - WXL <1785969728@qq.com> : æµ‹è¯•完成
df21bfb - WXL <1785969728@qq.com> : æµ‹è¯•完成
c936ac9 - WXL <1785969728@qq.com> : æµ‹è¯•完成
3207bfd - WXL <1785969728@qq.com> : æµ‹è¯•完成
43bb102 - WXL <1785969728@qq.com> : æµ‹è¯•完成
fdf8b9c - WXL <1785969728@qq.com> : æµ‹è¯•完成
0700456 - WXL <1785969728@qq.com> : æµ‹è¯•完成
1bbfe08 - WXL <1785969728@qq.com> : æµ‹è¯•完成
814116f - WXL <1785969728@qq.com> : æµ‹è¯•完成
e60efcf - WXL <1785969728@qq.com> : æµ‹è¯•完成
9d01523 - WXL <1785969728@qq.com> : æµ‹è¯•完成
a46f200 - WXL <1785969728@qq.com> : æµ‹è¯•完成
1e78fbf - WXL <1785969728@qq.com> : æµ‹è¯•完成
387d9eb - WXL <1785969728@qq.com> : æµ‹è¯•完成
245a920 - WXL <1785969728@qq.com> : æµ‹è¯•完成
f77e656 - WXL <1785969728@qq.com> : æµ‹è¯•完成
1f644c6 - WXL <1785969728@qq.com> : æµ‹è¯•完成
9955d35 - WXL <1785969728@qq.com> : æµ‹è¯•完成
76c3072 - WXL <1785969728@qq.com> : æµ‹è¯•完成
4fffa66 - WXL <1785969728@qq.com> : æµ‹è¯•完成
0c80816 - WXL <1785969728@qq.com> : æµ‹è¯•完成
8d2e62d - WXL <1785969728@qq.com> : æµ‹è¯•完成
1be7d1d - WXL <1785969728@qq.com> : æµ‹è¯•完成
46c0208 - WXL <1785969728@qq.com> : æµ‹è¯•完成
253d66f - WXL <1785969728@qq.com> : æµ‹è¯•完成
1589350 - WXL <1785969728@qq.com> : æµ‹è¯•完成
247854b - WXL <1785969728@qq.com> : æµ‹è¯•完成
b032588 - WXL <1785969728@qq.com> : æµ‹è¯•完成
e5f6689 - WXL <1785969728@qq.com> : æµ‹è¯•完成
43988e7 - WXL <1785969728@qq.com> : æµ‹è¯•完成
b33fce1 - WXL <1785969728@qq.com> : æµ‹è¯•完成
968d62e - WXL <1785969728@qq.com> : æµ‹è¯•完成
f9e7074 - WXL <1785969728@qq.com> : æµ‹è¯•完成
f488fea - WXL <1785969728@qq.com> : æµ‹è¯•完成
75f1a2d - WXL <1785969728@qq.com> : æµ‹è¯•完成
f357f41 - WXL <1785969728@qq.com> : æµ‹è¯•完成
711c995 - WXL <1785969728@qq.com> : æµ‹è¯•完成
90610c8 - WXL <1785969728@qq.com> : æµ‹è¯•完成
5041f08 - WXL <1785969728@qq.com> : æµ‹è¯•完成
6bc5561 - WXL <1785969728@qq.com> : æµ‹è¯•完成
d811436 - WXL <1785969728@qq.com> : æµ‹è¯•完成
a85d70f - WXL <1785969728@qq.com> : æµ‹è¯•完成
628fd01 - WXL <1785969728@qq.com> : æµ‹è¯•完成
e7d8000 - WXL <1785969728@qq.com> : æµ‹è¯•完成
48f86b3 - WXL <1785969728@qq.com> : æµ‹è¯•完成
4e7be54 - WXL <1785969728@qq.com> : æµ‹è¯•完成
4e9179c - WXL <1785969728@qq.com> : æµ‹è¯•完成
49fcdb7 - WXL <1785969728@qq.com> : æµ‹è¯•完成
5d6b3e5 - WXL <1785969728@qq.com> : æµ‹è¯•完成
998b86e - WXL <1785969728@qq.com> : æµ‹è¯•完成
1f7e676 - WXL <1785969728@qq.com> : æµ‹è¯•完成
e6af7e6 - WXL <1785969728@qq.com> : æµ‹è¯•完成
f6cedc2 - WXL <1785969728@qq.com> : æµ‹è¯•完成
97eaf47 - WXL <1785969728@qq.com> : æµ‹è¯•完成
9eec698 - WXL <1785969728@qq.com> : æµ‹è¯•完成
e4f0f4a - WXL <1785969728@qq.com> : æµ‹è¯•完成
257f46b - WXL <1785969728@qq.com> : æµ‹è¯•完成
5c559f7 - WXL <1785969728@qq.com> : æµ‹è¯•完成
b2278ee - WXL <1785969728@qq.com> : æµ‹è¯•完成
5339f63 - WXL <1785969728@qq.com> : æµ‹è¯•完成
c437204 - WXL <1785969728@qq.com> : æµ‹è¯•完成
4065fe2 - WXL <1785969728@qq.com> : æµ‹è¯•完成
e014c6f - WXL <1785969728@qq.com> : æµ‹è¯•完成
47efee4 - WXL <1785969728@qq.com> : æµ‹è¯•完成
4dc66a6 - WXL <1785969728@qq.com> : æµ‹è¯•完成
7d77cff - WXL <1785969728@qq.com> : æµ‹è¯•完成
554cfce - WXL <1785969728@qq.com> : æµ‹è¯•完成
4bc27ca - WXL <1785969728@qq.com> : æµ‹è¯•完成
c1857ba - WXL <1785969728@qq.com> : æµ‹è¯•完成
ddd5408 - WXL <1785969728@qq.com> : æµ‹è¯•完成
f4dcb9c - WXL <1785969728@qq.com> : æµ‹è¯•完成
f3bf996 - WXL <1785969728@qq.com> : æµ‹è¯•完成
b5c6bd9 - WXL <1785969728@qq.com> : æµ‹è¯•完成
cd3f1d6 - WXL <1785969728@qq.com> : æµ‹è¯•完成
e98f65f - WXL <1785969728@qq.com> : æµ‹è¯•完成
ca4592d - WXL <1785969728@qq.com> : æµ‹è¯•完成
e8fb5c1 - WXL <1785969728@qq.com> : æµ‹è¯•完成
a46348a - WXL <1785969728@qq.com> : æµ‹è¯•完成
32d69fc - WXL <1785969728@qq.com> : æµ‹è¯•完成
412ecc2 - WXL <1785969728@qq.com> : æµ‹è¯•完成
8ec0ecf - WXL <1785969728@qq.com> : æµ‹è¯•完成
399367e - WXL <1785969728@qq.com> : æµ‹è¯•完成
8f4cb95 - WXL <1785969728@qq.com> : æµ‹è¯•完成
da407d5 - WXL <1785969728@qq.com> : æŒ‡æ ‡å®Œæˆ
ca2d35a - WXL <1785969728@qq.com> : æŒ‡æ ‡å®Œæˆ
d84cde7 - WXL <1785969728@qq.com> : æŒ‡æ ‡å®Œæˆ
59953d5 - WXL <1785969728@qq.com> : æŒ‡æ ‡å®Œæˆ
cf9259c - WXL <1785969728@qq.com> : æŒ‡æ ‡å®Œæˆ
7992520 - WXL <1785969728@qq.com> : æŒ‡æ ‡å®Œæˆ
59272d9 - WXL <1785969728@qq.com> : æŒ‡æ ‡å®Œæˆ
ad70f14 - WXL <1785969728@qq.com> : æŒ‡æ ‡å®Œæˆ
3b774a1 - WXL <1785969728@qq.com> : æŒ‡æ ‡å®Œæˆ
f93cb40 - WXL <1785969728@qq.com> : æŒ‡æ ‡å®Œæˆ
2ef938e - WXL <1785969728@qq.com> : æŒ‡æ ‡å®Œæˆ
0d74436 - WXL <1785969728@qq.com> : æŒ‡æ ‡å®Œæˆ
d94d00d - WXL <1785969728@qq.com> : éšè®¿é¢˜åº“完成
4e32f11 - WXL <1785969728@qq.com> : å®Œæˆ
04332cb - WXL <1785969728@qq.com> : å®Œæˆ
dc3d15d - WXL <1785969728@qq.com> : éšè®¿é¢˜åº“完成
c50a8b1 - WXL <1785969728@qq.com> : æäº¤ä¿¡æ¯
3b7c66d - WXL <1785969728@qq.com> : æäº¤ä¿¡æ¯
0b750c8 - WXL <1785969728@qq.com> : æäº¤ä¿¡æ¯
6b39414 - WXL <1785969728@qq.com> : æäº¤ä¿¡æ¯
0d95833 - WXL <1785969728@qq.com> : æäº¤ä¿¡æ¯
8399d18 - WXL <1785969728@qq.com> : æäº¤ä¿¡æ¯
32cb501 - WXL <1785969728@qq.com> : æäº¤ä¿¡æ¯
8a980bd - WXL <1785969728@qq.com> : æäº¤ä¿¡æ¯
ea19bff - WXL <1785969728@qq.com> : æäº¤ä¿¡æ¯
d28d837 - WXL <1785969728@qq.com> : éšè®¿ã€å¤è¯Šå¤æŸ¥ã€ä½“检通知、问卷列表
b509c45 - WXL <1785969728@qq.com> : éšè®¿ã€å¤è¯Šå¤æŸ¥ã€ä½“检通知、问卷列表
58f5620 - WXL <1785969728@qq.com> : æäº¤ä¿¡æ¯
ac84e78 - WXL <1785969728@qq.com> : æäº¤ä¿¡æ¯
be170d2 - WXL <1785969728@qq.com> : æäº¤ä¿¡æ¯
40e3b74 - WXL <1785969728@qq.com> : æäº¤ä¿¡æ¯
42419e9 - WXL <1785969728@qq.com> : æäº¤ä¿¡æ¯
6d3e75d - WXL <1785969728@qq.com> : æäº¤ä¿¡æ¯
f76f423 - WXL <1785969728@qq.com> : 11
2aecb22 - heimawl <1785969728@qq.com> : 11
d29df60 - heimawl <1785969728@qq.com> : 11
f719b59 - heimawl <1785969728@qq.com> : 11
351fc95 - heimawl <1785969728@qq.com> : 11
66223fb - heimawl <1785969728@qq.com> : 11
40df27a - heimawl <1785969728@qq.com> : 11
c81b2f6 - heimawl <1785969728@qq.com> : 11
2d2377d - heimawl <1785969728@qq.com> : å®Œæˆç»Ÿè®¡æ¨¡å—基本搭建
b77e396 - heimawl <1785969728@qq.com> : 11
54d166e - heimawl <1785969728@qq.com> : 11
a879953 - heimawl <1785969728@qq.com> : 11
8cdcc9b - heimawl <1785969728@qq.com> : 11
958f682 - heimawl <1785969728@qq.com> : å¤‡æ³¨ä¿¡æ¯
a91ca68 - heimawl <1785969728@qq.com> : æ›´æ–°ä¸»é¢˜
eb29d75 - heimawl <1785969728@qq.com> : å®Œæˆè¯æœ¯åº“、指标库、模板库、页面及其子页面搭建
363e9da - heimawl <1785969728@qq.com> : æ›´æ”¹ç¼–辑器样式
12cf420 - heimawl <1785969728@qq.com> : é…ç½®ä»£ç ç¼–辑依赖
39ad2d8 - heimawl <1785969728@qq.com> : 11
696e74d - heimawl <1785969728@qq.com> : 11
0db1337 - heimawl <1785969728@qq.com> : æ™ºèƒ½ä¸­å¿ƒé¡µæ›´æ–°
a1e3f22 - heimawl <1785969728@qq.com> : äºŒç»´ç é¢„览页
bd5fbcf - heimawl <1785969728@qq.com> : 11
55b71c3 - heimawl <1785969728@qq.com> : å®Œæˆéƒ¨åˆ†æ‚£è€…数据交互api封装,创建ai知识库相关路由页面
d9a8691 - heimawl <1785969728@qq.com> : å®Œæˆæ ‡ç­¾ç®¡ç†æ¨¡å—数据交互
92301a6 - heimawl <1785969728@qq.com> : æµ‹è¯•接口
f98059f - heimawl <1785969728@qq.com> : å®Œæˆé¢˜åº“管理模块搭建
26ac0c2 - heimawl <1785969728@qq.com> : å°è£…api接口,宣教管理模块搭建
d9cbb5e - heimawl <1785969728@qq.com> : å®Œæˆæ ‡ç­¾ç®¡ç†æ¨¡å—搭建
3ddea12 - heimawl <1785969728@qq.com> : è¡¥å……问卷管理编辑页面布局
b850b4c - heimawl <1785969728@qq.com> : å®Œæˆé¢˜åº“管理页面路由设置,问卷查看页面布局
8d7b4ba - heimawl <1785969728@qq.com> : å®Œæˆå®£æ•™ã€é—®å·è·¯ç”±è®¾ç½®ã€é—®å·æ¨¡å—页面及其添加/修改页面部分布局开发
cb0e31a - heimawl <1785969728@qq.com> : ä¼˜åŒ–页面主题
792c283 - heimawl <1785969728@qq.com> : å®Œæˆä¸Šä¼ æ–‡ä»¶å„步骤页面及标签管理模块初步搭建
61cb6f1 - heimawl <1785969728@qq.com> : å®‰è£…echarts5.4.0依赖,完整患者管理主页面及其个人信息及附属页面基础开发
6e7acd5 - heimawl <1785969728@qq.com> : ç»„件库整理,依赖安装、excel导入导入方法整理
4de052a - heimawl <1785969728@qq.com> : å´é¾™åˆ†æ”¯åˆå§‹æäº¤
8b50c04 - yxh <172933527@qq.com> : yxh
66db2bb - yxh <172933527@qq.com> : yxh
4fd8412 - yxh <172933527@qq.com> : yxh
a6f4edd - yxh <172933527@qq.com> : Merge branch 'master' of http://116.62.18.175:6699/r/~yxh/smartor-web
cfd89f9 - yxh <172933527@qq.com> : yxh
a742ab9 - qianxj <qianxj15@sina.com> : hide id
58c7cea - yxh <172933527@qq.com> : yxh
5bedda9 - yxh <172933527@qq.com> : yxh
acd7802 - yxh <172933527@qq.com> : Merge branch 'master' of http://116.62.18.175:6699/r/~yxh/smartor-web
af1f597 - yxh <172933527@qq.com> : yxh
79f2ded - yxh <172933527@qq.com> : yxh
7fac76a - qianxj <qianxj15@sina.com> : Merge branch 'master' of http://116.62.18.175:6699/r/~yxh/smartor-web
d49d271 - qianxj <qianxj15@sina.com> : update svytopic
76bd95c - yxh <172933527@qq.com> : Merge branch 'master' of http://116.62.18.175:6699/r/~yxh/smartor-web
c57d049 - qianxj <qianxj15@sina.com> : update svytopic
72c05d4 - qianxj <qianxj15@sina.com> : update svytopic
a8c0f41 - qianxj <qianxj15@sina.com> : update svytopic
164feee - qianxj <qianxj15@sina.com> : update svytopic
2e5dd70 - qianxj <qianxj15@sina.com> : update topic
eb692fd - qianxj <qianxj15@sina.com> : update topic
d274e9d - qianxj <qianxj15@sina.com> : qianxj
a9ade10 - qianxj <qianxj15@sina.com> : update
2b1c001 - yxh <172933527@qq.com> : yxh
1bd342d - qianxj <qianxj15@sina.com> : update1
26b67ee - qianxj <qianxj15@sina.com> : update patarchive
3db1d85 - qianxj <qianxj15@sina.com> : update
110790e - qianxj <qianxj15@sina.com> : update patarchive
57b6bce - qianxj <qianxj15@sina.com> : update face
93cff80 - yxh <172933527@qq.com> : yxh
aad1dc2 - yxh <172933527@qq.com> : yxh
0a31e0b - yxh <172933527@qq.com> : yxh
5ce577d - yxh <172933527@qq.com> : yxh
f65cbb4 - yxh <172933527@qq.com> : yxh
b83120c - yxh <172933527@qq.com> : yxh
878850a - yxh <172933527@qq.com> : yxh
877300e - qianxj <qianxj15@sina.com> : update step1
8b4c8fc - qianxj <qianxj15@sina.com> : update title
621c4bb - yxh <172933527@qq.com> : ç¬¬ä¸€æ¬¡ä¿®æ”¹
et --hard HEAD@{1}
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,559 @@
022e803 (HEAD -> lishui-Smartor, origin/lishui-Smartor, lishui-sf) HEAD@{0}: rebase (finish): returning to refs/heads/lishui-Smartor
022e803 (HEAD -> lishui-Smartor, origin/lishui-Smartor, lishui-sf) HEAD@{1}: rebase (start): checkout HEAD~5
022e803 (HEAD -> lishui-Smartor, origin/lishui-Smartor, lishui-sf) HEAD@{2}: reset: moving to origin/lishui-Smartor
a65bf99 HEAD@{3}: rebase (continue) (finish): returning to refs/heads/lishui-Smartor
a65bf99 HEAD@{4}: commit (amend): æµ‹è¯•完成
95948fe HEAD@{5}: rebase (continue) (edit): æµ‹è¯•完成
745b9af HEAD@{6}: commit (amend): æµ‹è¯•完成
6f917a9 HEAD@{7}: rebase (continue) (edit): æµ‹è¯•完成
960960c HEAD@{8}: commit (amend): ä½ çš„æäº¤ä¿¡æ¯
488008e HEAD@{9}: rebase: fast-forward
9a164d2 HEAD@{10}: rebase (start): checkout HEAD~5
01e7b73 HEAD@{11}: rebase (continue) (finish): returning to refs/heads/lishui-Smartor
01e7b73 HEAD@{12}: commit (amend): æµ‹è¯•完成
748b8c4 HEAD@{13}: rebase (continue) (edit): æµ‹è¯•完成
ad098d5 HEAD@{14}: commit (amend): æµ‹è¯•完成
8220a01 HEAD@{15}: rebase: fast-forward
488008e HEAD@{16}: rebase: fast-forward
9a164d2 HEAD@{17}: rebase: fast-forward
9403890 HEAD@{18}: rebase: fast-forward
022e803 (HEAD -> lishui-Smartor, origin/lishui-Smartor, lishui-sf) HEAD@{19}: rebase (start): checkout HEAD~5
b685449 HEAD@{20}: rebase (abort): updating HEAD
b685449 HEAD@{21}: rebase (abort): updating HEAD
b685449 HEAD@{22}: commit: æµ‹è¯•完成
8220a01 HEAD@{23}: commit: æµ‹è¯•完成
488008e HEAD@{24}: commit: ä½ çš„æäº¤ä¿¡æ¯
9a164d2 HEAD@{25}: commit: ä½ çš„æäº¤ä¿¡æ¯
9403890 HEAD@{26}: rebase (continue) (finish): returning to refs/heads/lishui-Smartor
9403890 HEAD@{27}: rebase (continue) (finish): refs/heads/lishui-Smartor onto 022e8035e5143328ba01d76a74ea5f86e5c994f0
9403890 HEAD@{28}: commit: æµ‹è¯•完成
022e803 (HEAD -> lishui-Smartor, origin/lishui-Smartor, lishui-sf) HEAD@{29}: checkout: moving from lishui-sf to lishui-Smartor
022e803 (HEAD -> lishui-Smartor, origin/lishui-Smartor, lishui-sf) HEAD@{30}: checkout: moving from lishui-Smartor to lishui-sf
022e803 (HEAD -> lishui-Smartor, origin/lishui-Smartor, lishui-sf) HEAD@{31}: commit: æµ‹è¯•完成
4898664 HEAD@{32}: checkout: moving from wuxi-smartor to lishui-Smartor
b7f7f38 (wuxi-smartor) HEAD@{33}: checkout: moving from lishui-Smartor to wuxi-smartor
4898664 HEAD@{34}: commit: æµ‹è¯•完成
337fb92 HEAD@{35}: commit: æµ‹è¯•完成
a7a20b2 HEAD@{36}: checkout: moving from HeNan-Smartor to lishui-Smartor
56d56f3 (HeNan-Smartor) HEAD@{37}: checkout: moving from lishui-Smartor to HeNan-Smartor
a7a20b2 HEAD@{38}: commit: æµ‹è¯•完成
6f1e7a6 HEAD@{39}: commit: æµ‹è¯•完成
5fba330 HEAD@{40}: commit: æµ‹è¯•完成
209b2f7 HEAD@{41}: commit: æµ‹è¯•完成
53f4f0a HEAD@{42}: checkout: moving from wuxi-smartor to lishui-Smartor
b7f7f38 (wuxi-smartor) HEAD@{43}: commit: æµ‹è¯•完成
e353f0e (origin/wuxi-smartor) HEAD@{44}: checkout: moving from lishui-Smartor to wuxi-smartor
53f4f0a HEAD@{45}: commit: æµ‹è¯•完成
2eff945 HEAD@{46}: commit: æµ‹è¯•完成
b6c854d HEAD@{47}: checkout: moving from HeNan-Smartor to lishui-Smartor
56d56f3 (HeNan-Smartor) HEAD@{48}: commit: æµ‹è¯•完成
b6c854d HEAD@{49}: checkout: moving from lishui-Smartor to HeNan-Smartor
b6c854d HEAD@{50}: commit: æµ‹è¯•完成
ec2f429 HEAD@{51}: commit: æµ‹è¯•完成
c1f1ecb HEAD@{52}: checkout: moving from wuxi-smartor to lishui-Smartor
e353f0e (origin/wuxi-smartor) HEAD@{53}: commit: æµ‹è¯•完成
e580006 HEAD@{54}: commit: æµ‹è¯•完成
ffdeb04 HEAD@{55}: checkout: moving from lishui-Smartor to wuxi-smartor
c1f1ecb HEAD@{56}: checkout: moving from wuxi-smartor to lishui-Smartor
ffdeb04 HEAD@{57}: commit: æµ‹è¯•完成
55c665c HEAD@{58}: checkout: moving from lishui-Smartor to wuxi-smartor
c1f1ecb HEAD@{59}: checkout: moving from wuxi-smartor to lishui-Smartor
55c665c HEAD@{60}: checkout: moving from lishui-Smartor to wuxi-smartor
c1f1ecb HEAD@{61}: commit: æµ‹è¯•完成
7449ee9 HEAD@{62}: checkout: moving from wuxi-smartor to lishui-Smartor
55c665c HEAD@{63}: commit: æµ‹è¯•完成
f93c1fb HEAD@{64}: checkout: moving from lishui-Smartor to wuxi-smartor
7449ee9 HEAD@{65}: checkout: moving from wuxi-smartor to lishui-Smartor
f93c1fb HEAD@{66}: commit: æµ‹è¯•完成
b3b10f3 HEAD@{67}: checkout: moving from lishui-Smartor to wuxi-smartor
7449ee9 HEAD@{68}: checkout: moving from wuxi-smartor to lishui-Smartor
b3b10f3 HEAD@{69}: commit: æµ‹è¯•完成
30e7ca1 HEAD@{70}: checkout: moving from lishui-Smartor to wuxi-smartor
7449ee9 HEAD@{71}: checkout: moving from wuxi-smartor to lishui-Smartor
30e7ca1 HEAD@{72}: checkout: moving from lishui-Smartor to wuxi-smartor
7449ee9 HEAD@{73}: commit: æµ‹è¯•完成
9ed874d HEAD@{74}: checkout: moving from wuxi-smartor to lishui-Smartor
30e7ca1 HEAD@{75}: checkout: moving from lishui-Smartor to wuxi-smartor
9ed874d HEAD@{76}: checkout: moving from lishui-Smartor to lishui-Smartor
9ed874d HEAD@{77}: commit: æµ‹è¯•完成
6253746 HEAD@{78}: checkout: moving from wuxi-smartor to lishui-Smartor
30e7ca1 HEAD@{79}: commit: æµ‹è¯•完成
8b120ce HEAD@{80}: checkout: moving from lishui-Smartor to wuxi-smartor
6253746 HEAD@{81}: checkout: moving from wuxi-smartor to lishui-Smartor
8b120ce HEAD@{82}: commit: æµ‹è¯•完成
d846a58 HEAD@{83}: checkout: moving from lishui-Smartor to wuxi-smartor
6253746 HEAD@{84}: commit: æµ‹è¯•完成
5fb8598 HEAD@{85}: checkout: moving from master to lishui-Smartor
f08b133 (origin/master, origin/HEAD, master) HEAD@{86}: checkout: moving from lishui-Smartor to master
5fb8598 HEAD@{87}: checkout: moving from master to lishui-Smartor
f08b133 (origin/master, origin/HEAD, master) HEAD@{88}: commit: æµ‹è¯•完成
7c5b7bd HEAD@{89}: commit: æµ‹è¯•完成
a52f35a HEAD@{90}: checkout: moving from lishui-Smartor to master
5fb8598 HEAD@{91}: commit: æµ‹è¯•完成
aa06424 HEAD@{92}: checkout: moving from master to lishui-Smartor
a52f35a HEAD@{93}: checkout: moving from lishui-Smartor to master
aa06424 HEAD@{94}: checkout: moving from master to lishui-Smartor
a52f35a HEAD@{95}: checkout: moving from lishui-Smartor to master
aa06424 HEAD@{96}: commit: æµ‹è¯•完成
5733abb HEAD@{97}: checkout: moving from master to lishui-Smartor
a52f35a HEAD@{98}: commit: æµ‹è¯•完成
246ad67 HEAD@{99}: checkout: moving from lishui-Smartor to master
5733abb HEAD@{100}: checkout: moving from wuxi-smartor to lishui-Smartor
d846a58 HEAD@{101}: commit: æµ‹è¯•完成
ba57b51 HEAD@{102}: checkout: moving from lishui-Smartor to wuxi-smartor
5733abb HEAD@{103}: commit: æµ‹è¯•完成
9668152 HEAD@{104}: checkout: moving from wuxi-smartor to lishui-Smartor
ba57b51 HEAD@{105}: commit: æµ‹è¯•完成
fe70ca5 HEAD@{106}: checkout: moving from lishui-Smartor to wuxi-smartor
9668152 HEAD@{107}: commit: æµ‹è¯•完成
f06ac34 HEAD@{108}: checkout: moving from wuxi-smartor to lishui-Smartor
fe70ca5 HEAD@{109}: commit: æµ‹è¯•完成
510b433 HEAD@{110}: checkout: moving from lishui-Smartor to wuxi-smartor
f06ac34 HEAD@{111}: commit: æµ‹è¯•完成
20cd2de HEAD@{112}: checkout: moving from wuxi-smartor to lishui-Smartor
510b433 HEAD@{113}: commit: æµ‹è¯•完成
e946f91 HEAD@{114}: checkout: moving from lishui-Smartor to wuxi-smartor
20cd2de HEAD@{115}: commit: æµ‹è¯•完成
fe379fd HEAD@{116}: checkout: moving from wuxi-smartor to lishui-Smartor
e946f91 HEAD@{117}: commit: æµ‹è¯•完成
952ce53 HEAD@{118}: checkout: moving from lishui-Smartor to wuxi-smartor
fe379fd HEAD@{119}: checkout: moving from wuxi-smartor to lishui-Smartor
952ce53 HEAD@{120}: checkout: moving from lishui-Smartor to wuxi-smartor
fe379fd HEAD@{121}: commit: æµ‹è¯•完成
9cc3dcf HEAD@{122}: checkout: moving from wuxi-smartor to lishui-Smartor
952ce53 HEAD@{123}: commit: æµ‹è¯•完成
d9004dd HEAD@{124}: checkout: moving from lishui-Smartor to wuxi-smartor
9cc3dcf HEAD@{125}: commit: æµ‹è¯•完成
3ae495d HEAD@{126}: checkout: moving from wuxi-smartor to lishui-Smartor
d9004dd HEAD@{127}: commit: æµ‹è¯•完成
a90f11d HEAD@{128}: commit: æµ‹è¯•完成
125529d HEAD@{129}: checkout: moving from lishui-Smartor to wuxi-smartor
3ae495d HEAD@{130}: commit: æµ‹è¯•完成
dafbb90 HEAD@{131}: checkout: moving from wuxi-smartor to lishui-Smartor
125529d HEAD@{132}: commit: æµ‹è¯•完成
ce16687 HEAD@{133}: checkout: moving from lishui-Smartor to wuxi-smartor
dafbb90 HEAD@{134}: checkout: moving from wuxi-smartor to lishui-Smartor
ce16687 HEAD@{135}: commit: æµ‹è¯•完成
039c34d HEAD@{136}: checkout: moving from lishui-Smartor to wuxi-smartor
dafbb90 HEAD@{137}: checkout: moving from wuxi-smartor to lishui-Smartor
039c34d HEAD@{138}: commit: æµ‹è¯•完成
51102f4 HEAD@{139}: checkout: moving from lishui-Smartor to wuxi-smartor
dafbb90 HEAD@{140}: commit: æµ‹è¯•完成
665ac63 HEAD@{141}: commit: æµ‹è¯•完成
9a5dd25 HEAD@{142}: commit: æµ‹è¯•完成
880e036 HEAD@{143}: commit: æµ‹è¯•完成
e10381f HEAD@{144}: commit: æµ‹è¯•完成
c7c591d HEAD@{145}: commit: æµ‹è¯•完成
af3ff15 HEAD@{146}: checkout: moving from wuxi-smartor to lishui-Smartor
51102f4 HEAD@{147}: checkout: moving from lishui-Smartor to wuxi-smartor
af3ff15 HEAD@{148}: commit: æµ‹è¯•完成
36d1334 HEAD@{149}: checkout: moving from wuxi-smartor to lishui-Smartor
51102f4 HEAD@{150}: commit: æµ‹è¯•完成
d4744cf HEAD@{151}: checkout: moving from lishui-Smartor to wuxi-smartor
36d1334 HEAD@{152}: checkout: moving from wuxi-smartor to lishui-Smartor
d4744cf HEAD@{153}: commit: æµ‹è¯•完成
e750691 HEAD@{154}: checkout: moving from lishui-Smartor to wuxi-smartor
36d1334 HEAD@{155}: commit: æµ‹è¯•完成
a22820c HEAD@{156}: checkout: moving from wuxi-smartor to lishui-Smartor
e750691 HEAD@{157}: commit: æµ‹è¯•完成
ef60bc9 HEAD@{158}: commit: æµ‹è¯•完成
f37b479 HEAD@{159}: checkout: moving from lishui-Smartor to wuxi-smartor
a22820c HEAD@{160}: checkout: moving from wuxi-smartor to lishui-Smartor
f37b479 HEAD@{161}: commit: æµ‹è¯•完成
547be67 HEAD@{162}: checkout: moving from lishui-Smartor to wuxi-smartor
a22820c HEAD@{163}: commit: æµ‹è¯•完成
f3f7256 HEAD@{164}: checkout: moving from master to lishui-Smartor
246ad67 HEAD@{165}: checkout: moving from lishui-Smartor to master
f3f7256 HEAD@{166}: commit: æµ‹è¯•完成
84e20d0 HEAD@{167}: checkout: moving from master to lishui-Smartor
246ad67 HEAD@{168}: commit: æµ‹è¯•完成
c97bd0d HEAD@{169}: commit: æµ‹è¯•完成
bdb26dc HEAD@{170}: checkout: moving from lishui-Smartor to master
84e20d0 HEAD@{171}: checkout: moving from master to lishui-Smartor
bdb26dc HEAD@{172}: commit: æµ‹è¯•完成
3b6c56e HEAD@{173}: checkout: moving from lishui-Smartor to master
84e20d0 HEAD@{174}: commit: æµ‹è¯•完成
572a624 HEAD@{175}: checkout: moving from master to lishui-Smartor
3b6c56e HEAD@{176}: commit: æµ‹è¯•完成
0d18860 HEAD@{177}: checkout: moving from lishui-Smartor to master
572a624 HEAD@{178}: commit: æµ‹è¯•完成
a5bc95e HEAD@{179}: checkout: moving from wuxi-smartor to lishui-Smartor
547be67 HEAD@{180}: commit: æµ‹è¯•完成
c4fb353 HEAD@{181}: commit: æµ‹è¯•完成
a398c62 HEAD@{182}: checkout: moving from master to wuxi-smartor
0d18860 HEAD@{183}: commit: æµ‹è¯•完成
d5806f3 HEAD@{184}: commit (merge): æµ‹è¯•完成
783b99e HEAD@{185}: commit: æµ‹è¯•完成
77a8ca0 HEAD@{186}: checkout: moving from wuxi-smartor to master
a398c62 HEAD@{187}: commit: æµ‹è¯•完成
98b9fdc HEAD@{188}: commit: æµ‹è¯•完成
9dd3964 HEAD@{189}: checkout: moving from lishui-Smartor to wuxi-smartor
a5bc95e HEAD@{190}: checkout: moving from wuxi-smartor to lishui-Smartor
9dd3964 HEAD@{191}: commit: æµ‹è¯•完成
4cf6b25 HEAD@{192}: checkout: moving from lishui-Smartor to wuxi-smartor
a5bc95e HEAD@{193}: checkout: moving from wuxi-smartor to lishui-Smartor
4cf6b25 HEAD@{194}: commit: æµ‹è¯•完成
3bab592 HEAD@{195}: checkout: moving from lishui-Smartor to wuxi-smartor
a5bc95e HEAD@{196}: commit: æµ‹è¯•完成
be764ba HEAD@{197}: checkout: moving from wuxi-smartor to lishui-Smartor
3bab592 HEAD@{198}: commit: æµ‹è¯•完成
23f920e HEAD@{199}: checkout: moving from lishui-Smartor to wuxi-smartor
be764ba HEAD@{200}: checkout: moving from wuxi-smartor to lishui-Smartor
23f920e HEAD@{201}: commit: æµ‹è¯•完成
03d20b4 HEAD@{202}: checkout: moving from lishui-Smartor to wuxi-smartor
be764ba HEAD@{203}: checkout: moving from wuxi-smartor to lishui-Smartor
03d20b4 HEAD@{204}: commit: æµ‹è¯•完成
31cbe57 HEAD@{205}: checkout: moving from lishui-Smartor to wuxi-smartor
be764ba HEAD@{206}: commit: æµ‹è¯•完成
e46bb66 HEAD@{207}: checkout: moving from wuxi-smartor to lishui-Smartor
31cbe57 HEAD@{208}: checkout: moving from lishui-Smartor to wuxi-smartor
e46bb66 HEAD@{209}: commit: æµ‹è¯•完成
8ed125f HEAD@{210}: checkout: moving from wuxi-smartor to lishui-Smartor
31cbe57 HEAD@{211}: commit: æµ‹è¯•完成
66b105c HEAD@{212}: checkout: moving from lishui-Smartor to wuxi-smartor
8ed125f HEAD@{213}: checkout: moving from wuxi-smartor to lishui-Smartor
66b105c HEAD@{214}: checkout: moving from lishui-Smartor to wuxi-smartor
8ed125f HEAD@{215}: commit: ç»Ÿè®¡å®Œæˆ
37d2ba3 HEAD@{216}: checkout: moving from wuxi-smartor to lishui-Smartor
66b105c HEAD@{217}: checkout: moving from lishui-Smartor to wuxi-smartor
37d2ba3 HEAD@{218}: commit: æµ‹è¯•完成
45f9797 HEAD@{219}: checkout: moving from wuxi-smartor to lishui-Smartor
66b105c HEAD@{220}: commit: æµ‹è¯•完成
88cd1b9 HEAD@{221}: checkout: moving from master to wuxi-smartor
77a8ca0 HEAD@{222}: commit: æµ‹è¯•完成
ddba782 HEAD@{223}: checkout: moving from lishui-Smartor to master
45f9797 HEAD@{224}: commit: æµ‹è¯•完成
0e3739a HEAD@{225}: commit: æµ‹è¯•完成
54489da HEAD@{226}: commit: æµ‹è¯•完成
303d443 HEAD@{227}: checkout: moving from wuxi-smartor to lishui-Smartor
88cd1b9 HEAD@{228}: checkout: moving from lishui-Smartor to wuxi-smartor
303d443 HEAD@{229}: commit: æµ‹è¯•完成
5a8e93d HEAD@{230}: checkout: moving from wuxi-smartor to lishui-Smartor
88cd1b9 HEAD@{231}: checkout: moving from lishui-Smartor to wuxi-smartor
5a8e93d HEAD@{232}: commit: æµ‹è¯•完成
4413b46 HEAD@{233}: checkout: moving from wuxi-smartor to lishui-Smartor
88cd1b9 HEAD@{234}: commit: æµ‹è¯•完成
78fc1cf HEAD@{235}: checkout: moving from lishui-Smartor to wuxi-smartor
4413b46 HEAD@{236}: checkout: moving from wuxi-smartor to lishui-Smartor
78fc1cf HEAD@{237}: commit: æµ‹è¯•完成
901206c HEAD@{238}: checkout: moving from lishui-Smartor to wuxi-smartor
4413b46 HEAD@{239}: commit: æµ‹è¯•完成
0529f31 HEAD@{240}: checkout: moving from wuxi-smartor to lishui-Smartor
901206c HEAD@{241}: commit: æµ‹è¯•完成
f710fa7 HEAD@{242}: checkout: moving from lishui-Smartor to wuxi-smartor
0529f31 HEAD@{243}: commit: æµ‹è¯•完成
08c27c1 HEAD@{244}: checkout: moving from wuxi-smartor to lishui-Smartor
f710fa7 HEAD@{245}: commit: æµ‹è¯•完成
33c6294 HEAD@{246}: commit: æµ‹è¯•完成
55ee279 HEAD@{247}: checkout: moving from lishui-Smartor to wuxi-smartor
08c27c1 HEAD@{248}: commit: æµ‹è¯•完成
6d7cd13 HEAD@{249}: checkout: moving from wuxi-smartor to lishui-Smartor
55ee279 HEAD@{250}: commit: æµ‹è¯•完成
136b920 HEAD@{251}: checkout: moving from lishui-Smartor to wuxi-smartor
6d7cd13 HEAD@{252}: commit: æµ‹è¯•完成
8e71817 HEAD@{253}: commit: æµ‹è¯•完成
b7092c2 HEAD@{254}: commit: æµ‹è¯•完成
bc241c4 HEAD@{255}: checkout: moving from master to lishui-Smartor
ddba782 HEAD@{256}: checkout: moving from lishui-Smartor to master
bc241c4 HEAD@{257}: commit: æµ‹è¯•完成
5e17454 HEAD@{258}: checkout: moving from master to lishui-Smartor
ddba782 HEAD@{259}: checkout: moving from lishui-Smartor to master
5e17454 HEAD@{260}: checkout: moving from master to lishui-Smartor
ddba782 HEAD@{261}: commit: æµ‹è¯•完成
552e2c4 HEAD@{262}: checkout: moving from lishui-Smartor to master
5e17454 HEAD@{263}: commit: æµ‹è¯•完成
186b271 HEAD@{264}: checkout: moving from wuxi-smartor to lishui-Smartor
136b920 HEAD@{265}: checkout: moving from lishui-Smartor to wuxi-smartor
186b271 HEAD@{266}: commit: æµ‹è¯•完成
6535680 HEAD@{267}: commit: æµ‹è¯•完成
6be4939 HEAD@{268}: commit: æµ‹è¯•完成
400d13d HEAD@{269}: checkout: moving from wuxi-smartor to lishui-Smartor
136b920 HEAD@{270}: checkout: moving from lishui-Smartor to wuxi-smartor
400d13d HEAD@{271}: commit: æµ‹è¯•完成
3877190 HEAD@{272}: checkout: moving from wuxi-smartor to lishui-Smartor
136b920 HEAD@{273}: commit: æµ‹è¯•完成
55c064e HEAD@{274}: checkout: moving from lishui-Smartor to wuxi-smartor
3877190 HEAD@{275}: checkout: moving from wuxi-smartor to lishui-Smartor
55c064e HEAD@{276}: checkout: moving from lishui-Smartor to wuxi-smartor
3877190 HEAD@{277}: commit: æµ‹è¯•完成
78f514b HEAD@{278}: checkout: moving from wuxi-smartor to lishui-Smartor
55c064e HEAD@{279}: commit: æµ‹è¯•完成
2b67e58 HEAD@{280}: checkout: moving from lishui-Smartor to wuxi-smartor
78f514b HEAD@{281}: commit: æµ‹è¯•完成
fecb2f5 HEAD@{282}: checkout: moving from wuxi-smartor to lishui-Smartor
2b67e58 HEAD@{283}: commit: æµ‹è¯•完成
91dc8cc HEAD@{284}: checkout: moving from lishui-Smartor to wuxi-smartor
fecb2f5 HEAD@{285}: checkout: moving from wuxi-smartor to lishui-Smartor
91dc8cc HEAD@{286}: checkout: moving from lishui-Smartor to wuxi-smartor
fecb2f5 HEAD@{287}: commit: æµ‹è¯•完成
4395f0d HEAD@{288}: checkout: moving from wuxi-smartor to lishui-Smartor
91dc8cc HEAD@{289}: commit: æµ‹è¯•完成
6a1bafa HEAD@{290}: checkout: moving from lishui-Smartor to wuxi-smartor
4395f0d HEAD@{291}: checkout: moving from wuxi-smartor to lishui-Smartor
6a1bafa HEAD@{292}: commit: æµ‹è¯•完成
d74a76f HEAD@{293}: checkout: moving from lishui-Smartor to wuxi-smartor
4395f0d HEAD@{294}: commit: æµ‹è¯•完成
327d234 HEAD@{295}: commit: æµ‹è¯•完成
56b8443 HEAD@{296}: checkout: moving from wuxi-smartor to lishui-Smartor
d74a76f HEAD@{297}: checkout: moving from lishui-Smartor to wuxi-smartor
56b8443 HEAD@{298}: commit: æµ‹è¯•完成
8d0f7fc HEAD@{299}: commit: æµ‹è¯•完成
38c9042 HEAD@{300}: commit: æµ‹è¯•完成
7d47700 HEAD@{301}: commit: æµ‹è¯•完成
273e2fa HEAD@{302}: commit: æµ‹è¯•完成
401c835 HEAD@{303}: commit: æµ‹è¯•完成
60e5b16 HEAD@{304}: commit: æµ‹è¯•完成
6e54a66 HEAD@{305}: commit: æµ‹è¯•完成
ee8f1a0 HEAD@{306}: commit: æµ‹è¯•完成
5f3691d HEAD@{307}: commit: æµ‹è¯•完成
4b60348 HEAD@{308}: commit: æµ‹è¯•完成
418e3a7 HEAD@{309}: checkout: moving from wuxi-smartor to lishui-Smartor
d74a76f HEAD@{310}: commit: æµ‹è¯•完成
a022656 HEAD@{311}: checkout: moving from lishui-Smartor to wuxi-smartor
418e3a7 HEAD@{312}: commit: æµ‹è¯•完成
4c9eab7 HEAD@{313}: commit: æµ‹è¯•完成
15e42d9 HEAD@{314}: checkout: moving from master to lishui-Smartor
552e2c4 HEAD@{315}: commit: æµ‹è¯•完成
823bd7c HEAD@{316}: checkout: moving from lishui-Smartor to master
15e42d9 HEAD@{317}: commit: æµ‹è¯•完成
9f5b4e2 HEAD@{318}: checkout: moving from wuxi-smartor to lishui-Smartor
a022656 HEAD@{319}: commit: æµ‹è¯•完成
9259056 HEAD@{320}: checkout: moving from lishui-Smartor to wuxi-smartor
9f5b4e2 HEAD@{321}: commit: æµ‹è¯•完成
99a916e HEAD@{322}: commit: æµ‹è¯•完成
abde816 HEAD@{323}: commit: æµ‹è¯•完成
81ffbda HEAD@{324}: checkout: moving from master to lishui-Smartor
823bd7c HEAD@{325}: commit: æµ‹è¯•完成
84f0f55 HEAD@{326}: checkout: moving from lishui-Smartor to master
81ffbda HEAD@{327}: checkout: moving from master to lishui-Smartor
84f0f55 HEAD@{328}: checkout: moving from lishui-Smartor to master
81ffbda HEAD@{329}: commit: æµ‹è¯•完成
935e93f HEAD@{330}: checkout: moving from master to lishui-Smartor
84f0f55 HEAD@{331}: checkout: moving from lishui-Smartor to master
935e93f HEAD@{332}: commit: æµ‹è¯•完成
b73b5dd HEAD@{333}: checkout: moving from master to lishui-Smartor
84f0f55 HEAD@{334}: checkout: moving from lishui-Smartor to master
b73b5dd HEAD@{335}: commit: æµ‹è¯•完成
2daa54c HEAD@{336}: checkout: moving from master to lishui-Smartor
84f0f55 HEAD@{337}: checkout: moving from lishui-Smartor to master
2daa54c HEAD@{338}: commit: æµ‹è¯•完成
073edc9 HEAD@{339}: checkout: moving from wuxi-smartor to lishui-Smartor
9259056 HEAD@{340}: checkout: moving from master to wuxi-smartor
84f0f55 HEAD@{341}: commit: æµ‹è¯•完成
d7b9ffb HEAD@{342}: checkout: moving from lishui-Smartor to master
073edc9 HEAD@{343}: commit: æµ‹è¯•完成
838d8b5 HEAD@{344}: checkout: moving from master to lishui-Smartor
d7b9ffb HEAD@{345}: checkout: moving from lishui-Smartor to master
838d8b5 HEAD@{346}: checkout: moving from master to lishui-Smartor
d7b9ffb HEAD@{347}: commit: æµ‹è¯•完成
b8085c1 HEAD@{348}: checkout: moving from wuxi-smartor to master
9259056 HEAD@{349}: checkout: moving from lishui-Smartor to wuxi-smartor
838d8b5 HEAD@{350}: checkout: moving from wuxi-smartor to lishui-Smartor
9259056 HEAD@{351}: commit: æµ‹è¯•完成
d9a95a7 HEAD@{352}: checkout: moving from master to wuxi-smartor
b8085c1 HEAD@{353}: checkout: moving from lishui-Smartor to master
838d8b5 HEAD@{354}: checkout: moving from master to lishui-Smartor
b8085c1 HEAD@{355}: commit: æµ‹è¯•完成
baeeb80 HEAD@{356}: checkout: moving from lishui-Smartor to master
838d8b5 HEAD@{357}: commit: æµ‹è¯•完成
3fd01fa HEAD@{358}: checkout: moving from wuxi-smartor to lishui-Smartor
d9a95a7 HEAD@{359}: checkout: moving from lishui-Smartor to wuxi-smartor
3fd01fa HEAD@{360}: commit: æµ‹è¯•完成
88481a3 HEAD@{361}: checkout: moving from wuxi-smartor to lishui-Smartor
d9a95a7 HEAD@{362}: commit: æµ‹è¯•完成
ffb5cf7 HEAD@{363}: checkout: moving from master to wuxi-smartor
baeeb80 HEAD@{364}: commit: æµ‹è¯•完成
5271bf2 HEAD@{365}: checkout: moving from lishui-Smartor to master
88481a3 HEAD@{366}: checkout: moving from wuxi-smartor to lishui-Smartor
ffb5cf7 HEAD@{367}: commit: æµ‹è¯•完成
f5c2015 HEAD@{368}: checkout: moving from DeBug to wuxi-smartor
6d3e75d (origin/DeBug, DeBug) HEAD@{369}: checkout: moving from lishui-Smartor to DeBug
88481a3 HEAD@{370}: checkout: moving from wuxi-smartor to lishui-Smartor
f5c2015 HEAD@{371}: checkout: moving from master to wuxi-smartor
5271bf2 HEAD@{372}: commit: æµ‹è¯•完成
0516a6b HEAD@{373}: checkout: moving from lishui-Smartor to master
88481a3 HEAD@{374}: commit: æµ‹è¯•完成
12eb16c HEAD@{375}: commit: æµ‹è¯•完成
083ae82 HEAD@{376}: checkout: moving from wuxi-smartor to lishui-Smartor
f5c2015 HEAD@{377}: commit: æµ‹è¯•完成
28f8a2e HEAD@{378}: checkout: moving from lishui-Smartor to wuxi-smartor
083ae82 HEAD@{379}: commit: æµ‹è¯•完成
36b7179 HEAD@{380}: checkout: moving from wuxi-smartor to lishui-Smartor
28f8a2e HEAD@{381}: commit: æµ‹è¯•完成
5e20020 HEAD@{382}: checkout: moving from lishui-Smartor to wuxi-smartor
36b7179 HEAD@{383}: checkout: moving from master to lishui-Smartor
0516a6b HEAD@{384}: checkout: moving from wuxi-smartor to master
5e20020 HEAD@{385}: checkout: moving from lishui-Smartor to wuxi-smartor
36b7179 HEAD@{386}: commit: æµ‹è¯•完成
03a3eff HEAD@{387}: checkout: moving from master to lishui-Smartor
0516a6b HEAD@{388}: commit: æµ‹è¯•完成
32674b0 HEAD@{389}: checkout: moving from lishui-Smartor to master
03a3eff HEAD@{390}: checkout: moving from master to lishui-Smartor
32674b0 HEAD@{391}: checkout: moving from lishui-Smartor to master
03a3eff HEAD@{392}: commit: æµ‹è¯•完成
2b1cfea HEAD@{393}: commit: æµ‹è¯•完成
ff99a9b HEAD@{394}: checkout: moving from master to lishui-Smartor
32674b0 HEAD@{395}: checkout: moving from lishui-Smartor to master
ff99a9b HEAD@{396}: commit: æµ‹è¯•完成
cf2c2a9 HEAD@{397}: checkout: moving from wuxi-smartor to lishui-Smartor
5e20020 HEAD@{398}: checkout: moving from lishui-Smartor to wuxi-smartor
cf2c2a9 HEAD@{399}: checkout: moving from wuxi-smartor to lishui-Smartor
5e20020 HEAD@{400}: checkout: moving from lishui-Smartor to wuxi-smartor
cf2c2a9 HEAD@{401}: commit: æµ‹è¯•完成
a77752e HEAD@{402}: commit: æµ‹è¯•完成
3bb35f1 HEAD@{403}: commit: æµ‹è¯•完成
b0dd238 HEAD@{404}: commit: æµ‹è¯•完成
57a7537 HEAD@{405}: commit: æµ‹è¯•完成
83d8322 HEAD@{406}: checkout: moving from master to lishui-Smartor
32674b0 HEAD@{407}: commit: æµ‹è¯•完成
f6bc6ed HEAD@{408}: checkout: moving from lishui-Smartor to master
83d8322 HEAD@{409}: commit: æµ‹è¯•完成
ee1d4af HEAD@{410}: checkout: moving from master to lishui-Smartor
f6bc6ed HEAD@{411}: checkout: moving from lishui-Smartor to master
ee1d4af HEAD@{412}: commit: æµ‹è¯•完成
bcf3cae HEAD@{413}: commit: æµ‹è¯•完成
d5f7da9 HEAD@{414}: checkout: moving from wuxi-smartor to lishui-Smartor
5e20020 HEAD@{415}: commit: æµ‹è¯•完成
ee31f47 HEAD@{416}: checkout: moving from lishui-Smartor to wuxi-smartor
d5f7da9 HEAD@{417}: commit (merge): æµ‹è¯•完成
5acc6d2 HEAD@{418}: commit: æµ‹è¯•完成
355bbb7 HEAD@{419}: commit: æµ‹è¯•完成
a3d2f84 HEAD@{420}: checkout: moving from wuxi-smartor to lishui-Smartor
ee31f47 HEAD@{421}: checkout: moving from lishui-Smartor to wuxi-smartor
a3d2f84 HEAD@{422}: commit: æµ‹è¯•完成
bc99b53 HEAD@{423}: checkout: moving from wuxi-smartor to lishui-Smartor
ee31f47 HEAD@{424}: commit: æµ‹è¯•完成
84b1d28 HEAD@{425}: checkout: moving from lishui-Smartor to wuxi-smartor
bc99b53 HEAD@{426}: commit: æµ‹è¯•完成
17edb0e HEAD@{427}: checkout: moving from wuxi-smartor to lishui-Smartor
84b1d28 HEAD@{428}: commit: æµ‹è¯•完成
bfce8d1 HEAD@{429}: checkout: moving from lishui-Smartor to wuxi-smartor
17edb0e HEAD@{430}: checkout: moving from wuxi-smartor to lishui-Smartor
bfce8d1 HEAD@{431}: commit: æµ‹è¯•完成
44d24a2 HEAD@{432}: checkout: moving from lishui-Smartor to wuxi-smartor
17edb0e HEAD@{433}: checkout: moving from wuxi-smartor to lishui-Smartor
44d24a2 HEAD@{434}: commit: æµ‹è¯•完成
5f4c59e HEAD@{435}: checkout: moving from lishui-Smartor to wuxi-smartor
17edb0e HEAD@{436}: commit: æµ‹è¯•完成
891f159 HEAD@{437}: commit: æµ‹è¯•完成
50873f4 HEAD@{438}: checkout: moving from wuxi-smartor to lishui-Smartor
5f4c59e HEAD@{439}: commit: æµ‹è¯•完成
4f3692a HEAD@{440}: checkout: moving from lishui-Smartor to wuxi-smartor
50873f4 HEAD@{441}: checkout: moving from wuxi-smartor to lishui-Smartor
4f3692a HEAD@{442}: commit: æµ‹è¯•完成
321891f HEAD@{443}: commit: æµ‹è¯•完成
3b8d057 HEAD@{444}: commit: æµ‹è¯•完成
f6bc6ed HEAD@{445}: merge master: Fast-forward
9507541 HEAD@{446}: checkout: moving from lishui-Smartor to wuxi-smartor
50873f4 HEAD@{447}: commit: æµ‹è¯•完成
ec64a69 HEAD@{448}: commit: æµ‹è¯•完成
8aa0592 HEAD@{449}: checkout: moving from master to lishui-Smartor
f6bc6ed HEAD@{450}: checkout: moving from lishui-Smartor to master
8aa0592 HEAD@{451}: checkout: moving from master to lishui-Smartor
f6bc6ed HEAD@{452}: checkout: moving from lishui-Smartor to master
8aa0592 HEAD@{453}: checkout: moving from master to lishui-Smartor
f6bc6ed HEAD@{454}: checkout: moving from lishui-Smartor to master
8aa0592 HEAD@{455}: checkout: moving from master to lishui-Smartor
f6bc6ed HEAD@{456}: checkout: moving from lishui-Smartor to master
8aa0592 HEAD@{457}: commit: æµ‹è¯•完成
a5faf6e HEAD@{458}: commit (merge): æµ‹è¯•完成
46784b2 HEAD@{459}: checkout: moving from master to lishui-Smartor
f6bc6ed HEAD@{460}: commit: æµ‹è¯•完成
f4e079f HEAD@{461}: checkout: moving from lishui-Smartor to master
46784b2 HEAD@{462}: commit: æµ‹è¯•完成
e48362d HEAD@{463}: commit (merge): æµ‹è¯•完成
4cd2bfd HEAD@{464}: checkout: moving from master to lishui-Smartor
f4e079f HEAD@{465}: commit: æµ‹è¯•完成
dea82b7 HEAD@{466}: commit: æµ‹è¯•完成
0c2a0bd HEAD@{467}: checkout: moving from lishui-Smartor to master
4cd2bfd HEAD@{468}: commit: æµ‹è¯•完成
7cfedaa HEAD@{469}: commit (merge): æµ‹è¯•完成
98589bb HEAD@{470}: checkout: moving from master to lishui-Smartor
0c2a0bd HEAD@{471}: commit: æµ‹è¯•完成
48e96f3 HEAD@{472}: checkout: moving from lishui-Smartor to master
98589bb HEAD@{473}: checkout: moving from master to lishui-Smartor
48e96f3 HEAD@{474}: commit: æµ‹è¯•完成
fc63b5b HEAD@{475}: checkout: moving from lishui-Smartor to master
98589bb HEAD@{476}: commit: æµ‹è¯•完成
981fbdd HEAD@{477}: pull --tags origin lishui-Smartor: Fast-forward
8c79267 HEAD@{478}: reset: moving to 8c79267eb478e2986c5293d3fb48f1c3da18c544
981fbdd HEAD@{479}: checkout: moving from linshi-smartor to lishui-Smartor
981fbdd HEAD@{480}: checkout: moving from linshi-smartor to linshi-smartor
981fbdd HEAD@{481}: checkout: moving from lishui-Smartor to linshi-smartor
981fbdd HEAD@{482}: checkout: moving from master to lishui-Smartor
fc63b5b HEAD@{483}: commit: æµ‹è¯•完成
aca3443 HEAD@{484}: checkout: moving from lishui-Smartor to master
981fbdd HEAD@{485}: commit: æµ‹è¯•完成
6de02b3 HEAD@{486}: checkout: moving from master to lishui-Smartor
aca3443 HEAD@{487}: checkout: moving from lishui-Smartor to master
6de02b3 HEAD@{488}: checkout: moving from master to lishui-Smartor
aca3443 HEAD@{489}: checkout: moving from lishui-Smartor to master
6de02b3 HEAD@{490}: commit: æµ‹è¯•完成
9896138 HEAD@{491}: commit (merge): æµ‹è¯•完成
4a7648d HEAD@{492}: checkout: moving from master to lishui-Smartor
aca3443 HEAD@{493}: commit: æµ‹è¯•完成
1a090a4 HEAD@{494}: commit: æµ‹è¯•完成
8c79267 HEAD@{495}: commit: æµ‹è¯•完成
080186b HEAD@{496}: checkout: moving from lishui-Smartor to master
4a7648d HEAD@{497}: commit: æµ‹è¯•完成
09a1bd5 HEAD@{498}: commit: æµ‹è¯•完成
4492ab0 HEAD@{499}: commit: æµ‹è¯•完成
eef0168 HEAD@{500}: commit (merge): æµ‹è¯•完成
3dcfdb6 HEAD@{501}: checkout: moving from master to lishui-Smartor
080186b HEAD@{502}: commit: æµ‹è¯•完成
0a4cc3c HEAD@{503}: checkout: moving from external to master
3a7caf4 (origin/external, external) HEAD@{504}: checkout: moving from master to external
0a4cc3c HEAD@{505}: checkout: moving from external to master
3a7caf4 (origin/external, external) HEAD@{506}: commit: æµ‹è¯•完成
5fcfaee HEAD@{507}: commit: æµ‹è¯•完成
c8204d0 HEAD@{508}: checkout: moving from master to external
0a4cc3c HEAD@{509}: checkout: moving from external to master
c8204d0 HEAD@{510}: checkout: moving from master to external
0a4cc3c HEAD@{511}: checkout: moving from external to master
c8204d0 HEAD@{512}: checkout: moving from external to external
c8204d0 HEAD@{513}: checkout: moving from master to external
0a4cc3c HEAD@{514}: commit: æµ‹è¯•完成
1cb1fbf HEAD@{515}: checkout: moving from external to master
c8204d0 HEAD@{516}: commit: æµ‹è¯•完成
621935e HEAD@{517}: checkout: moving from master to external
1cb1fbf HEAD@{518}: reset: moving to HEAD
1cb1fbf HEAD@{519}: checkout: moving from external to master
621935e HEAD@{520}: checkout: moving from master to external
1cb1fbf HEAD@{521}: checkout: moving from external to master
621935e HEAD@{522}: checkout: moving from 1cb1fbf80c955986385377b5f84e8915d1e655d6 to external
1cb1fbf HEAD@{523}: checkout: moving from external to 1cb1fbf80c955986385377b5f84e8915d1e655d6
621935e HEAD@{524}: checkout: moving from wuxi-smartor to external
9507541 HEAD@{525}: checkout: moving from external to wuxi-smartor
621935e HEAD@{526}: commit: æµ‹è¯•完成
c7e1537 HEAD@{527}: checkout: moving from wuxi-smartor to external
9507541 HEAD@{528}: checkout: moving from master to wuxi-smartor
1cb1fbf HEAD@{529}: commit: æµ‹è¯•完成
77fb64c HEAD@{530}: checkout: moving from lishui-Smartor to master
3dcfdb6 HEAD@{531}: commit: ä¸½æ°´æäº¤
77fb64c HEAD@{532}: checkout: moving from master to lishui-Smartor
77fb64c HEAD@{533}: checkout: moving from wuxi-smartor to master
9507541 HEAD@{534}: checkout: moving from wuxi-smartor to wuxi-smartor
9507541 HEAD@{535}: checkout: moving from master to wuxi-smartor
77fb64c HEAD@{536}: commit: æ–°åŽæäº¤
9507541 HEAD@{537}: merge wuxi-smartor: Fast-forward
07e07d6 HEAD@{538}: checkout: moving from wuxi-smartor to master
9507541 HEAD@{539}: commit: æ— é”¡æäº¤
07e07d6 HEAD@{540}: checkout: moving from master to wuxi-smartor
07e07d6 HEAD@{541}: commit: æ–°åŽæäº¤
b26c48a HEAD@{542}: checkout: moving from external to master
c7e1537 HEAD@{543}: commit: å¤–链独立
c87c46a HEAD@{544}: commit: å¤–链独立
4fb7f36 HEAD@{545}: checkout: moving from master to external
b26c48a HEAD@{546}: commit: æµ‹è¯•完成
c1139d1 HEAD@{547}: checkout: moving from external to master
4fb7f36 HEAD@{548}: checkout: moving from master to external
c1139d1 HEAD@{549}: checkout: moving from external to master
4fb7f36 HEAD@{550}: commit: æµ‹è¯•完成
c1139d1 HEAD@{551}: checkout: moving from master to external
c1139d1 HEAD@{552}: commit: æµ‹è¯•完成
b1d81d0 HEAD@{553}: commit: æµ‹è¯•完成
ae117f0 HEAD@{554}: commit: æµ‹è¯•完成
5dc9d1b HEAD@{555}: commit: æµ‹è¯•完成
9a1a82e HEAD@{556}: commit: æµ‹è¯•完成
294e513 HEAD@{557}: commit: æµ‹è¯•完成
007d388 HEAD@{558}: commit: æµ‹è¯•完成
h origin --force --all
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,258 @@
                   SSUUMMMMAARRYY OOFF LLEESSSS CCOOMMMMAANNDDSS
      Commands marked with * may be preceded by a number, _N.
      Notes in parentheses indicate the behavior if _N is given.
      A key preceded by a caret indicates the Ctrl key; thus ^K is ctrl-K.
  h  H                 Display this help.
  q  :q  Q  :Q  ZZ     Exit.
 ---------------------------------------------------------------------------
                           MMOOVVIINNGG
  e  ^E  j  ^N  CR  *  Forward  one line   (or _N lines).
  y  ^Y  k  ^K  ^P  *  Backward one line   (or _N lines).
  f  ^F  ^V  SPACE  *  Forward  one window (or _N lines).
  b  ^B  ESC-v      *  Backward one window (or _N lines).
  z                 *  Forward  one window (and set window to _N).
  w                 *  Backward one window (and set window to _N).
  ESC-SPACE         *  Forward  one window, but don't stop at end-of-file.
  d  ^D             *  Forward  one half-window (and set half-window to _N).
  u  ^U             *  Backward one half-window (and set half-window to _N).
  ESC-)  RightArrow *  Right one half screen width (or _N positions).
  ESC-(  LeftArrow  *  Left  one half screen width (or _N positions).
  ESC-}  ^RightArrow   Right to last column displayed.
  ESC-{  ^LeftArrow    Left  to first column.
  F                    Forward forever; like "tail -f".
  ESC-F                Like F but stop when search pattern is found.
  r  ^R  ^L            Repaint screen.
  R                    Repaint screen, discarding buffered input.
        ---------------------------------------------------
        Default "window" is the screen height.
        Default "half-window" is half of the screen height.
 ---------------------------------------------------------------------------
                          SSEEAARRCCHHIINNGG
  /_p_a_t_t_e_r_n          *  Search forward for (_N-th) matching line.
  ?_p_a_t_t_e_r_n          *  Search backward for (_N-th) matching line.
  n                 *  Repeat previous search (for _N-th occurrence).
  N                 *  Repeat previous search in reverse direction.
  ESC-n             *  Repeat previous search, spanning files.
  ESC-N             *  Repeat previous search, reverse dir. & spanning files.
  ESC-u                Undo (toggle) search highlighting.
  ESC-U                Clear search highlighting.
  &_p_a_t_t_e_r_n          *  Display only matching lines.
        ---------------------------------------------------
        A search pattern may begin with one or more of:
        ^N or !  Search for NON-matching lines.
        ^E or *  Search multiple files (pass thru END OF FILE).
        ^F or @  Start search at FIRST file (for /) or last file (for ?).
        ^K       Highlight matches, but don't move (KEEP position).
        ^R       Don't use REGULAR EXPRESSIONS.
        ^W       WRAP search if no match found.
 ---------------------------------------------------------------------------
                           JJUUMMPPIINNGG
  g  <  ESC-<       *  Go to first line in file (or line _N).
  G  >  ESC->       *  Go to last line in file (or line _N).
  p  %              *  Go to beginning of file (or _N percent into file).
  t                 *  Go to the (_N-th) next tag.
  T                 *  Go to the (_N-th) previous tag.
  {  (  [           *  Find close bracket } ) ].
  }  )  ]           *  Find open bracket { ( [.
  ESC-^F _<_c_1_> _<_c_2_>  *  Find close bracket _<_c_2_>.
  ESC-^B _<_c_1_> _<_c_2_>  *  Find open bracket _<_c_1_>.
        ---------------------------------------------------
        Each "find close bracket" command goes forward to the close bracket
          matching the (_N-th) open bracket in the top line.
        Each "find open bracket" command goes backward to the open bracket
          matching the (_N-th) close bracket in the bottom line.
  m_<_l_e_t_t_e_r_>            Mark the current top line with <letter>.
  M_<_l_e_t_t_e_r_>            Mark the current bottom line with <letter>.
  '_<_l_e_t_t_e_r_>            Go to a previously marked position.
  ''                   Go to the previous position.
  ^X^X                 Same as '.
  ESC-M_<_l_e_t_t_e_r_>        Clear a mark.
        ---------------------------------------------------
        A mark is any upper-case or lower-case letter.
        Certain marks are predefined:
             ^  means  beginning of the file
             $  means  end of the file
 ---------------------------------------------------------------------------
                        CCHHAANNGGIINNGG FFIILLEESS
  :e [_f_i_l_e]            Examine a new file.
  ^X^V                 Same as :e.
  :n                *  Examine the (_N-th) next file from the command line.
  :p                *  Examine the (_N-th) previous file from the command line.
  :x                *  Examine the first (or _N-th) file from the command line.
  :d                   Delete the current file from the command line list.
  =  ^G  :f            Print current file name.
 ---------------------------------------------------------------------------
                    MMIISSCCEELLLLAANNEEOOUUSS CCOOMMMMAANNDDSS
  -_<_f_l_a_g_>              Toggle a command line option [see OPTIONS below].
  --_<_n_a_m_e_>             Toggle a command line option, by name.
  __<_f_l_a_g_>              Display the setting of a command line option.
  ___<_n_a_m_e_>             Display the setting of an option, by name.
  +_c_m_d                 Execute the less cmd each time a new file is examined.
  !_c_o_m_m_a_n_d             Execute the shell command with $SHELL.
  |XX_c_o_m_m_a_n_d            Pipe file between current pos & mark XX to shell command.
  s _f_i_l_e               Save input to a file.
  v                    Edit the current file with $VISUAL or $EDITOR.
  V                    Print version number of "less".
 ---------------------------------------------------------------------------
                           OOPPTTIIOONNSS
        Most options may be changed either on the command line,
        or from within less by using the - or -- command.
        Options may be given in one of two forms: either a single
        character preceded by a -, or a name preceded by --.
  -?  ........  --help
                  Display help (from command line).
  -a  ........  --search-skip-screen
                  Search skips current screen.
  -A  ........  --SEARCH-SKIP-SCREEN
                  Search starts just after target line.
  -b [_N]  ....  --buffers=[_N]
                  Number of buffers.
  -B  ........  --auto-buffers
                  Don't automatically allocate buffers for pipes.
  -c  ........  --clear-screen
                  Repaint by clearing rather than scrolling.
  -d  ........  --dumb
                  Dumb terminal.
  -D xx_c_o_l_o_r  .  --color=xx_c_o_l_o_r
                  Set screen colors.
  -e  -E  ....  --quit-at-eof  --QUIT-AT-EOF
                  Quit at end of file.
  -f  ........  --force
                  Force open non-regular files.
  -F  ........  --quit-if-one-screen
                  Quit if entire file fits on first screen.
  -g  ........  --hilite-search
                  Highlight only last match for searches.
  -G  ........  --HILITE-SEARCH
                  Don't highlight any matches for searches.
  -h [_N]  ....  --max-back-scroll=[_N]
                  Backward scroll limit.
  -i  ........  --ignore-case
                  Ignore case in searches that do not contain uppercase.
  -I  ........  --IGNORE-CASE
                  Ignore case in all searches.
  -j [_N]  ....  --jump-target=[_N]
                  Screen position of target lines.
  -J  ........  --status-column
                  Display a status column at left edge of screen.
  -k [_f_i_l_e]  .  --lesskey-file=[_f_i_l_e]
                  Use a lesskey file.
  -K  ........  --quit-on-intr
                  Exit less in response to ctrl-C.
  -L  ........  --no-lessopen
                  Ignore the LESSOPEN environment variable.
  -m  -M  ....  --long-prompt  --LONG-PROMPT
                  Set prompt style.
  -n  -N  ....  --line-numbers  --LINE-NUMBERS
                  Don't use line numbers.
  -o [_f_i_l_e]  .  --log-file=[_f_i_l_e]
                  Copy to log file (standard input only).
  -O [_f_i_l_e]  .  --LOG-FILE=[_f_i_l_e]
                  Copy to log file (unconditionally overwrite).
  -p [_p_a_t_t_e_r_n]  --pattern=[_p_a_t_t_e_r_n]
                  Start at pattern (from command line).
  -P [_p_r_o_m_p_t]   --prompt=[_p_r_o_m_p_t]
                  Define new prompt.
  -q  -Q  ....  --quiet  --QUIET  --silent --SILENT
                  Quiet the terminal bell.
  -r  -R  ....  --raw-control-chars  --RAW-CONTROL-CHARS
                  Output "raw" control characters.
  -s  ........  --squeeze-blank-lines
                  Squeeze multiple blank lines.
  -S  ........  --chop-long-lines
                  Chop (truncate) long lines rather than wrapping.
  -t [_t_a_g]  ..  --tag=[_t_a_g]
                  Find a tag.
  -T [_t_a_g_s_f_i_l_e] --tag-file=[_t_a_g_s_f_i_l_e]
                  Use an alternate tags file.
  -u  -U  ....  --underline-special  --UNDERLINE-SPECIAL
                  Change handling of backspaces.
  -V  ........  --version
                  Display the version number of "less".
  -w  ........  --hilite-unread
                  Highlight first new line after forward-screen.
  -W  ........  --HILITE-UNREAD
                  Highlight first new line after any forward movement.
  -x [_N[,...]]  --tabs=[_N[,...]]
                  Set tab stops.
  -X  ........  --no-init
                  Don't use termcap init/deinit strings.
  -y [_N]  ....  --max-forw-scroll=[_N]
                  Forward scroll limit.
  -z [_N]  ....  --window=[_N]
                  Set size of window.
  -" [_c[_c]]  .  --quotes=[_c[_c]]
                  Set shell quote characters.
  -~  ........  --tilde
                  Don't display tildes after end of file.
  -# [_N]  ....  --shift=[_N]
                  Set horizontal scroll amount (0 = one half screen width).
                --file-size
                  Automatically determine the size of the input file.
                --follow-name
                  The F command changes files if the input file is renamed.
                --incsearch
                  Search file as each pattern character is typed in.
                --line-num-width=N
                  Set the width of the -N line number field to N characters.
                --mouse
                  Enable mouse input.
                --no-keypad
                  Don't send termcap keypad init/deinit strings.
                --no-histdups
                  Remove duplicates from command history.
                --rscroll=C
                  Set the character used to mark truncated lines.
                --save-marks
                  Retain marks across invocations of less.
                --status-col-width=N
                  Set the width of the -J status column to N characters.
                --use-backslash
                  Subsequent options use backslash as escape char.
                --use-color
                  Enables colored text.
                --wheel-lines=N
                  Each click of the mouse wheel moves N lines.
 ---------------------------------------------------------------------------
                          LLIINNEE EEDDIITTIINNGG
        These keys can be used to edit text being entered
        on the "command line" at the bottom of the screen.
 RightArrow ..................... ESC-l ... Move cursor right one character.
 LeftArrow ...................... ESC-h ... Move cursor left one character.
 ctrl-RightArrow  ESC-RightArrow  ESC-w ... Move cursor right one word.
 ctrl-LeftArrow   ESC-LeftArrow   ESC-b ... Move cursor left one word.
 HOME ........................... ESC-0 ... Move cursor to start of line.
 END ............................ ESC-$ ... Move cursor to end of line.
 BACKSPACE ................................ Delete char to left of cursor.
 DELETE ......................... ESC-x ... Delete char under cursor.
 ctrl-BACKSPACE   ESC-BACKSPACE ........... Delete word to left of cursor.
 ctrl-DELETE .... ESC-DELETE .... ESC-X ... Delete word under cursor.
 ctrl-U ......... ESC (MS-DOS only) ....... Delete entire line.
 UpArrow ........................ ESC-k ... Retrieve previous command line.
 DownArrow ...................... ESC-j ... Retrieve next command line.
 TAB ...................................... Complete filename & cycle.
 SHIFT-TAB ...................... ESC-TAB   Complete filename & reverse cycle.
 ctrl-L ................................... Complete filename, list all.
src/api/AiCentre/EChartsdata.js
@@ -25,6 +25,14 @@
    data: data,
  });
}
// é¦–页中部数据
export function getServiceStatistics(data) {
  return request({
    url: "/smartor/serviceSubtask/getServiceStatistics",
    method: "post",
    data: data,
  });
}
// æŸ¥è¯¢æ‚£è€…住院记录列表
export function getechartsMedInhospList(data) {
  return request({
src/api/AiCentre/index.js
@@ -9,4 +9,4 @@
export * from './external'
export * from './patientexternal'
export * from './EChartsdata'
export * from './satisfaction'
export * from './satisfactionse'
src/api/AiCentre/satisfactionse.js
src/assets/order/example.mp3
Binary files differ
src/components/CallButton/index.vue
@@ -3,17 +3,19 @@
    <div class="sip-status" :class="sipStatusClass">
      SIP状态: {{ sipStatus }}
    </div>
    <!-- å·ç è¾“å…¥ -->
    <input
      v-model="phoneNumber"
      type="text"
      placeholder="输入电话号码"
      @keyup.enter="startCall"
    />
    <!-- çŠ¶æ€æ˜¾ç¤º -->
    <div class="call-status" :class="callStatusClass">
      {{ callStatusText }}
    </div>
    <!-- å‘¼å«æŒ‰é’® -->
    <button :class="['call-btn', { calling: isCalling }]" @click="startCall">
      {{ isCalling ? "通话中..." : "一键呼叫" }}
    <button
      :class="['call-btn', { calling: isCalling }]"
      @click="startCall"
      :disabled="isCalling || sipStatus !== '已注册'"
    >
      {{ callButtonText }}
    </button>
    <!-- æŒ‚断按钮 -->
@@ -21,11 +23,6 @@
    <!-- éŸ³é¢‘元素(隐藏) -->
    <audio id="remoteAudio" autoplay></audio>
    <!-- çŠ¶æ€æ˜¾ç¤º -->
    <div class="call-status">
      {{ callStatus }}
    </div>
  </div>
</template>
@@ -33,31 +30,48 @@
import sipService from "@/utils/sipService";
export default {
  props: {
    phoneNumber: {
      type: String,
      default: "",
    },
  },
  data() {
    const randomNum = Math.floor(Math.random() * 20) + 1000; // å†…部定义
    return {
      // phoneNumber: "",
      isCalling: false,
      callStatus: "准备就绪",
      callStatus: "idle", // idle, calling, connected, ended
      sipStatus: "未连接",
      sipStatusClass: "status-disconnected",
      sipConfig: {
        wsUrl: "wss://192.168.10.124:7443",
        sipUri: "1000@192.168.10.124",
        sipUri: `${randomNum}` + "@192.168.10.124",
        password: "Smartor@2023",
        displayName: "Web å°é¾™",
        // realm: "192.168.10.124:8090",
        // realm: "9.208.5.18:8090",
      },
    };
  },
  props: {
    phoneNumber: {
      type: String,
      default: ''
    }
  computed: {
    callStatusText() {
      const statusMap = {
        idle: "准备就绪",
        calling: "呼叫中...",
        connected: "通话中",
        ended: "通话结束",
      };
      return statusMap[this.callStatus];
    },
    callStatusClass() {
      return `status-${this.callStatus}`;
    },
    callButtonText() {
      return this.isCalling ? "通话中..." : "一键呼叫";
    },
  },
  mounted() {
    // æµ‹è¯•
    const ws = new WebSocket("wss://192.168.10.124:7443");
    const ws = new WebSocket("wss://9.208.5.18:7443");
    ws.onopen = () => console.log("WebSocket è¿žæŽ¥æˆåŠŸ");
    ws.onerror = (e) => console.error("WebSocket é”™è¯¯:", e);
@@ -68,45 +82,41 @@
    sipService.onStatusChange = (status) => {
      this.sipStatus = status.text;
      this.sipStatusClass = `status-${status.type}`;
    };
      // æ ¹æ®çŠ¶æ€æ›´æ–°UI或执行其他操作
      if (status.type === "registered") {
        console.log("SIP注册成功,可以开始呼叫");
      } else if (status.type === "failed") {
        console.error("SIP注册失败");
      }
    // ç›‘听通话状态变化
    sipService.onCallStatusChange = (status) => {
      this.callStatus = status.type;
      this.isCalling = status.type === "calling" || status.type === "connected";
      // é€šçŸ¥çˆ¶ç»„件通话状态变化
      this.$emit("call-status-change", status);
    };
  },
  beforeDestroy() {
    // ç»„件销毁时结束通话
    this.endCall();
  },
  methods: {
    // å¼€å§‹å‘¼å«
    async startCall() {
      if (!this.phoneNumber) {
        this.callStatus = "请输入电话号码";
        this.$message.error("请输入电话号码");
        return;
      }
      try {
        this.isCalling = true;
        this.callStatus = "呼叫中...";
        // è°ƒç”¨SIP服务
        sipService.makeCall(this.phoneNumber);
        this.callStatus = "通话已建立";
      try {
        this.callStatus = "calling";
        this.isCalling = true;
        await sipService.makeCall(this.phoneNumber);
      } catch (error) {
        console.error("呼叫失败:", error);
        this.callStatus = `呼叫失败: ${error.message}`;
        this.callStatus = "ended";
        this.isCalling = false;
        this.$message.error(`呼叫失败: ${error.message}`);
      }
    },
    // ç»“束通话
    endCall() {
      sipService.endCall();
      this.callStatus = "ended";
      this.isCalling = false;
      this.callStatus = "通话已结束";
    },
  },
};
@@ -138,7 +148,106 @@
  border-radius: 4px;
  cursor: pointer;
}
.call-status {
  padding: 8px;
  margin: 10px 0;
  border-radius: 4px;
  text-align: center;
}
.status-idle {
  background-color: #f5f5f5;
  color: #666;
}
.status-calling {
  background-color: #fff8e1;
  color: #ff8f00;
}
.status-connected {
  background-color: #e8f5e9;
  color: #2e7d32;
}
.status-ended {
  background-color: #ffebee;
  color: #c62828;
}
/* åŽŸæœ‰æ ·å¼ä¿æŒä¸å˜ */
.call-container {
  display: flex;
  flex-direction: column;
  gap: 10px;
  max-width: 300px;
  margin: 0 auto;
  padding: 20px;
  border: 1px solid #eee;
  border-radius: 8px;
}
.call-btn {
  padding: 10px;
  background-color: #4caf50;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}
.call-btn:hover:not(:disabled) {
  background-color: #45a049;
}
.call-btn:disabled {
  background-color: #cccccc;
  cursor: not-allowed;
}
.call-btn.calling {
  background-color: #2196f3;
}
.end-call-btn {
  padding: 10px;
  background-color: #f44336;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}
.end-call-btn:hover {
  background-color: #d32f2f;
}
.sip-status {
  padding: 8px;
  margin-bottom: 10px;
  border-radius: 4px;
  text-align: center;
}
.status-disconnected {
  background-color: #ffebee;
  color: #c62828;
}
.status-connecting {
  background-color: #fff8e1;
  color: #ff8f00;
}
.status-registered {
  background-color: #e8f5e9;
  color: #2e7d32;
}
.status-failed {
  background-color: #ffebee;
  color: #c62828;
}
.call-btn:hover {
  background-color: #45a049;
}
src/layout/components/Sidebar/SidebarItem.vue
@@ -14,7 +14,6 @@
      </template>
      <sidebar-item
        v-for="child in item.children"
        :key="child.path"
        :is-nest="true"
        :item="child"
        :base-path="resolvePath(child.path)"
src/store/modules/user.js
@@ -144,11 +144,23 @@
          localStorage.setItem('deptCode', '01040201');
          }else if (orgid=='47246102433112211A2101') {
          localStorage.setItem('orgname', '缙云县中医医院');
          localStorage.setItem('ZuHuID', '1400360867068907520');
          localStorage.setItem('ZuHuID', '1429338802177000002');
          localStorage.setItem('deptCode', '');
          }else if (orgid=='47240018433118111A2101') {
          localStorage.setItem('orgname', '龙泉市中医医院');
          localStorage.setItem('ZuHuID', '1400360867068907520');
          localStorage.setItem('ZuHuID', '1429338802177000003');
          localStorage.setItem('deptCode', '');
          }else if (orgid=='47243006833112611A2101') {
          localStorage.setItem('orgname', '庆元县中医医院');
          localStorage.setItem('ZuHuID', '1429338802177000004');
          localStorage.setItem('deptCode', '');
          }else if (orgid=='47234002X33112111A2101') {
          localStorage.setItem('orgname', '青田县中医医院');
          localStorage.setItem('ZuHuID', '1429338802177000005');
          localStorage.setItem('deptCode', '');
          }else if (orgid=='47240004533118111A1001') {
          localStorage.setItem('orgname', '龙泉市人民医院');
          localStorage.setItem('ZuHuID', '1429338802177000007');
          localStorage.setItem('deptCode', '');
          }
          resolve()
src/utils/request.js
@@ -17,7 +17,7 @@
  // axios中请求配置有baseURL选项,表示请求URL公共部分
  baseURL: process.env.VUE_APP_BASE_API,
  // è¶…æ—¶
  timeout: 10000,
  timeout: 100000,
});
// request拦截器
src/utils/sipService-cs.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,200 @@
import JsSIP from "jssip";
class SipService {
  constructor() {
    this.ua = null;
    this.currentSession = null;
    this.onStatusChange = null; // çŠ¶æ€å˜åŒ–å›žè°ƒ
    this.onCallStatusChange = null; // æ–°å¢žé€šè¯çŠ¶æ€å›žè°ƒ
  }
  // åˆå§‹åŒ–SIP客户端
  init(config) {
    try {
      this.updateStatus("connecting", "连接中...");
      this.ua = new JsSIP.UA({
        sockets: [new JsSIP.WebSocketInterface(config.wsUrl)],
        uri: config.sipUri,
        password: config.password,
        display_name: config.displayName,
        iceservers: [],
        // realm: config.realm,
        register: true,
        session_expires: 180,
        sessionTimersExpires: 300, // è®¾ç½® Session-Expires=120(必须 >= Min-SE)
        extraHeaders: [
          "Min-SE: 120", // å¯é€‰ï¼šæ˜¾å¼å‘Šè¯‰æœåŠ¡å™¨ä½ æ”¯æŒçš„æœ€å°å€¼
        ],
        register_expires: 300, // æ³¨å†Œæœ‰æ•ˆæœŸ(秒)
        connection_recovery_min_interval: 2, // æœ€å°é‡è¿žé—´éš”
        connection_recovery_max_interval: 30, // æœ€å¤§é‡è¿žé—´éš”
      });
      this.ua.start();
      // æ³¨å†Œäº‹ä»¶ç›‘听
      this.ua.on("registered", () => {
        this.updateStatus("registered", "已注册");
      });
      this.ua.on("registrationFailed", (e) => {
        this.updateStatus("failed", `注册失败: ${e.cause}`);
      });
      this.ua.on("disconnected", () => {
        this.updateStatus("disconnected", "连接断开");
      });
      this.ua.on("connected", () => {
        this.updateStatus("connecting", "重新连接中...");
      });
      // ç›‘听来电
      this.ua.on("newRTCSession", (data) => {
        this.handleIncomingCall(data.session);
      });
    } catch (error) {
      this.updateStatus("failed", `初始化失败: ${error.message}`);
      console.error("SIP初始化失败:", error);
    }
  }
  handleIncomingCall(session) {
    if (session.direction === "incoming") {
      console.log("来电:", session.remote_identity.uri.toString());
      // å¯ä»¥åœ¨è¿™é‡Œè§¦å‘ UI é€šçŸ¥
      if (this.onIncomingCall) {
        this.onIncomingCall(session);
      }
    }
  }
  // æ›´æ–°çŠ¶æ€å¹¶é€šçŸ¥UI
  updateStatus(type, text) {
    console.log(`SIP状态更新: ${type} - ${text}`);
    if (this.onStatusChange) {
      this.onStatusChange({ type, text });
    }
  }
  // ä¸€é”®æ‹¨å· - å¢žåŠ æ³¨å†ŒçŠ¶æ€æ£€æŸ¥
  makeCall(targetNumber) {
    if (!this.ua) {
      throw new Error("SIP客户端未初始化");
    }
    if (!this.ua.isRegistered()) {
      throw new Error("SIP未注册,无法呼叫");
    }
    const options = {
      sessionTimers: true,
      sessionTimersExpires: 300,
      extraHeaders: [
        "Min-SE: 120",
        "Route: <sip:@192.168.100.6>",
        "Accept: application/sdp",
        "Supported: replaces, timer",
        "Allow: INVITE, ACK, BYE, CANCEL, OPTIONS",
      ],
      eventHandlers: {
        progress: (e) => {
          this.updateCallStatus("calling", "呼叫中...");
        },
        failed: (e) => {
          this.updateCallStatus("ended", `呼叫失败: ${e.cause}`);
        },
        ended: (e) => {
          this.updateCallStatus("ended", "通话结束");
        },
        confirmed: (e) => {
          this.updateCallStatus("connected", "通话已接通");
        },
      },
      mediaConstraints: {
        audio: true,
        video: false,
      },
      rtcOfferConstraints: {
        offerToReceiveAudio: 1,
        offerToReceiveVideo: 0,
        mandatory: {
          OfferToReceiveAudio: true,
          OfferToReceiveVideo: false,
        },
      },
      pcConfig: {
        iceServers: [{ urls: "stun:stun.l.google.com:19302" }],
        iceTransportPolicy: "all",
        bundlePolicy: "balanced",
        rtcpMuxPolicy: "require",
        codecs: {
          audio: [
            { name: "PCMU", clockRate: 8000, payloadType: 0 },
            { name: "PCMA", clockRate: 8000, payloadType: 8 },
          ],
          video: [],
        },
      },
    };
    this.currentSession = this.ua.call(
      `sip:${targetNumber}@192.168.100.6`,
      options
    );
    // åœ¨ä¼šè¯åˆ›å»ºåŽä¿®æ”¹ SDP
    this.currentSession.on("peerconnection", (pc) => {
       this.updateCallStatus('calling', '呼叫中...');
      pc.createOffer = (offerOptions) => {
        return RTCPeerConnection.prototype.createOffer
          .call(pc, offerOptions)
          .then((offer) => {
            const modifiedSdp = offer.sdp
              .replace(/c=IN IP4 192\.168\.100\.10/g, "c=IN IP4 192.168.100.6")
              .replace(/m=audio \d+ RTP\/AVP.*/, "m=audio 7078 RTP/AVP 0 8");
            return new RTCSessionDescription({
              type: "offer",
              sdp: modifiedSdp,
            });
          });
      };
    });
    this.currentSession.on('failed', (e) => {
        this.updateCallStatus('failed', `呼叫失败2: ${e}`);
      });
      this.currentSession.on('ended', () => {
        this.updateCallStatus('ended', '通话已结束');
      });
      this.currentSession.on('confirmed', () => {
        this.updateCallStatus('connected', '通话已接通');
      });
    this.setupAudio(this.currentSession);
  }
  setupAudio(session) {
    session.connection.addEventListener("addstream", (e) => {
      const audioElement = document.getElementById("remoteAudio");
      if (audioElement) {
        audioElement.srcObject = e.stream;
      }
    });
  }
  // æŒ‚断当前通话
  endCall() {
  if (this.currentSession) {
      this.currentSession.terminate();
      this.updateCallStatus('ended', '通话已结束');
      this.currentSession = null;
    }
  }
  // æ–°å¢žæ–¹æ³•:更新通话状态
  updateCallStatus(type, text) {
    console.log(`通话状态更新: ${type} - ${text}`);
    if (this.onCallStatusChange) {
      this.onCallStatusChange({ type, text });
    }
  }
}
export default new SipService();
src/utils/sipService.js
@@ -4,153 +4,174 @@
  constructor() {
    this.ua = null;
    this.currentSession = null;
    this.onStatusChange = null; // çŠ¶æ€å˜åŒ–å›žè°ƒ
    this.onStatusChange = null;
    this.onCallStatusChange = null;
    this.onIncomingCall = null;
  }
  // åˆå§‹åŒ–SIP客户端
  init(config) {
    try {
      this.updateStatus("connecting", "连接中...");
      this.updateStatus("connecting", "连接中;...");
      this.ua = new JsSIP.UA({
        sockets: [new JsSIP.WebSocketInterface(config.wsUrl)],
        uri: config.sipUri,
        password: config.password,
        display_name: config.displayName,
        iceservers:[],
        // realm: config.realm,
        iceServers: [],
        register: true,
        session_expires: 180,
        sessionTimersExpires: 300, // è®¾ç½® Session-Expires=120(必须 >= Min-SE)
        extraHeaders: [
          "Min-SE: 120", // å¯é€‰ï¼šæ˜¾å¼å‘Šè¯‰æœåŠ¡å™¨ä½ æ”¯æŒçš„æœ€å°å€¼
        ],
        register_expires: 300, // æ³¨å†Œæœ‰æ•ˆæœŸ(秒)
        connection_recovery_min_interval: 2, // æœ€å°é‡è¿žé—´éš”
        connection_recovery_max_interval: 30, // æœ€å¤§é‡è¿žé—´éš”
        sessionExpires: 1800,
        minSessionExpires: 90,
        register_expires: 300,
      });
      this.ua.start();
      // æ³¨å†Œäº‹ä»¶ç›‘听
      this.ua.on("registered", () => {
        this.updateStatus("registered", "已注册");
      });
      this.ua.on("registrationFailed", (e) => {
        this.updateStatus("failed", `注册失败: ${e.cause}`);
      });
      this.ua.on("disconnected", () => {
        this.updateStatus("disconnected", "连接断开");
      });
      this.ua.on("connected", () => {
        this.updateStatus("connecting", "重新连接中...");
      });
      // ç›‘听来电
      this.ua.on("newRTCSession", (data) => {
        this.handleIncomingCall(data.session);
      });
      // äº‹ä»¶ç›‘听
      this.ua.on("registered", () =>
        this.updateStatus("registered", "已注册56")
      );
      this.ua.on("registrationFailed", (e) =>
        this.updateStatus("failed", `注册失败11: ${e.cause}`)
      );
      this.ua.on("disconnected", () =>
        this.updateStatus("disconnected", "连接断开")
      );
      this.ua.on("connected", () =>
        this.updateStatus("connecting", "重新连接中...")
      );
      this.ua.on("newRTCSession", (data) =>
        this.handleIncomingCall(data.session)
      );
    } catch (error) {
      this.updateStatus("failed", `初始化失败: ${error.message}`);
      console.error("SIP初始化失败:", error);
    }
  }
  handleIncomingCall(session) {
    if (session.direction === "incoming") {
      console.log("来电:", session.remote_identity.uri.toString());
      // å¯ä»¥åœ¨è¿™é‡Œè§¦å‘ UI é€šçŸ¥
      if (this.onIncomingCall) {
        this.onIncomingCall(session);
      }
      throw error;
    }
  }
  // æ›´æ–°çŠ¶æ€å¹¶é€šçŸ¥UI
  updateStatus(type, text) {
    console.log(`SIP状态更新: ${type} - ${text}`);
    if (this.onStatusChange) {
      this.onStatusChange({ type, text });
    }
  }
  // ä¸€é”®æ‹¨å· - å¢žåŠ æ³¨å†ŒçŠ¶æ€æ£€æŸ¥
  makeCall(targetNumber) {
    if (!this.ua) {
      throw new Error("SIP客户端未初始化");
    }
    return new Promise((resolve, reject) => {
      try {
        if (!this.ua) {
          throw new Error("SIP客户端未初始化");
        }
    if (!this.ua.isRegistered()) {
      throw new Error("SIP未注册,无法呼叫");
    }
        if (!this.ua.isRegistered()) {
          throw new Error("SIP未注册,无法呼叫");
        }
    const options = {
      sessionTimers: true,
      sessionTimersExpires: 300,
      extraHeaders: [
        "Min-SE: 120",
        "Route: <sip:@192.168.100.6>",
        "Accept: application/sdp",
        "Supported: replaces, timer",
        "Allow: INVITE, ACK, BYE, CANCEL, OPTIONS",
      ],
      eventHandlers: {
        progress: (e) => console.log("呼叫中..."),
        failed: (e) => console.error("呼叫失败:", e),
        ended: (e) => console.log("通话结束"),
        confirmed: (e) => console.log("通话已接通"),
      },
      mediaConstraints: {
        audio: true,
        video: false,
      },
      rtcOfferConstraints: {
        offerToReceiveAudio: 1,
        offerToReceiveVideo: 0,
        mandatory: {
          OfferToReceiveAudio: true,
          OfferToReceiveVideo: false,
        },
      },
      pcConfig: {
        iceServers: [{ urls: "stun:stun.l.google.com:19302" }],
        iceTransportPolicy: "all",
        bundlePolicy: "balanced",
        rtcpMuxPolicy: "require",
        codecs: {
          audio: [
            { name: "PCMU", clockRate: 8000, payloadType: 0 },
            { name: "PCMA", clockRate: 8000, payloadType: 8 },
          ],
          video: [],
        },
      },
    };
        const options = {
          sessionTimers: true, // å¯ç”¨ä¼šè¯è®¡æ—¶å™¨
          sessionTimersExpires: 150,
          extraHeaders: ["Accept: application/sdp"],
          mediaConstraints: { audio: true, video: false },
          rtcOfferConstraints: {
            offerToReceiveAudio: true,
            offerToReceiveVideo: false,
          },
          eventHandlers: {
            progress: () => this.updateCallStatus("calling", "呼叫中..."),
            failed: (e) => {
              this.handleCallFailure(e, reject);
            },
            ended: () => this.updateCallStatus("ended", "通话结束"),
            confirmed: () => {
              this.updateCallStatus("connected", "通话已接通");
              resolve();
            },
          },
        };
    this.currentSession = this.ua.call(
      `sip:${targetNumber}@192.168.100.6`,
      options
    );
    // åœ¨ä¼šè¯åˆ›å»ºåŽä¿®æ”¹ SDP
    this.currentSession.on("peerconnection", (pc) => {
      pc.createOffer = (offerOptions) => {
        return RTCPeerConnection.prototype.createOffer
          .call(pc, offerOptions)
          .then((offer) => {
            const modifiedSdp = offer.sdp
              .replace(/c=IN IP4 192\.168\.100\.10/g, "c=IN IP4 192.168.100.6")
              .replace(/m=audio \d+ RTP\/AVP.*/, "m=audio 7078 RTP/AVP 0 8");
            return new RTCSessionDescription({
              type: "offer",
              sdp: modifiedSdp,
            });
          });
        this.currentSession = this.ua.call(
          `sip:${targetNumber}@192.168.10.124`,
          options
        );
        this.setupPeerConnection(this.currentSession);
        this.setupAudio(this.currentSession);
      } catch (error) {
        this.updateCallStatus("failed", `呼叫失败22: ${error.message}`);
        reject(error);
      }
    });
  }
  setupPeerConnection(session) {
    session.on("peerconnection", (pc) => {
      const originalCreateOffer = pc.createOffer.bind(pc);
      pc.createOffer = async (offerOptions) => {
        try {
          const offer = await originalCreateOffer(offerOptions);
          return this.normalizeSDP(offer);
        } catch (error) {
          console.error("创建Offer失败:", error);
          throw error;
        }
      };
    });
    this.setupAudio(this.currentSession);
  }
  normalizeSDP(offer) {
    let sdp = offer.sdp;
    // æ ‡å‡†åŒ–SDP
    sdp = sdp.replace(/c=IN IP4.*\r\n/, "c=IN IP4 0.0.0.0\r\n");
    sdp = sdp.replace(
      /m=audio \d+.*\r\n/,
      "m=audio 9 UDP/TLS/RTP/SAVPF 0 8\r\n"
    );
    // ç¡®ä¿åŒ…含基本编解码器
    if (!sdp.includes("PCMU/8000")) sdp += "a=rtpmap:0 PCMU/8000\r\n";
    if (!sdp.includes("PCMA/8000")) sdp += "a=rtpmap:8 PCMA/8000\r\n";
    // æ·»åŠ å¿…è¦å±žæ€§
    sdp += "a=rtcp-mux\r\n";
    sdp += "a=sendrecv\r\n";
    console.log("标准化后的SDP:", sdp);
    return new RTCSessionDescription({
      type: offer.type,
      sdp: sdp,
    });
  }
  handleCallFailure(e, reject) {
    if (e.response?.status_code === 422) {
      const serverMinSE = e.response.headers["Min-SE"]?.[0]?.raw || "未知";
      console.error(`服务器要求 Min-SE â‰¤ ${serverMinSE},当前设置: 120`);
    }
    console.error("呼叫失败详情:", {
      cause: e.cause,
      message: e.message,
      response: e.response && {
        status: e.response.status_code,
        reason: e.response.reason_phrase,
      },
    });
    let errorMessage = "呼叫失败";
    switch (e.cause) {
      case "Incompatible SDP":
        errorMessage = "媒体协商失败,请检查编解码器配置";
        break;
      case "488":
      case "606":
        errorMessage = "对方设备不支持当前媒体配置";
        break;
      case "422":
        errorMessage = "会话参数不满足服务器要求";
        break;
      default:
        errorMessage = `呼叫失败: ${e.cause || e.message}`;
    }
    this.updateCallStatus("failed55", errorMessage);
    reject(new Error(errorMessage));
  }
  setupAudio(session) {
    session.connection.addEventListener("addstream", (e) => {
      const audioElement = document.getElementById("remoteAudio");
@@ -159,14 +180,37 @@
      }
    });
  }
  // æŒ‚断当前通话
  endCall() {
    if (this.currentSession) {
      this.currentSession.terminate();
      this.updateCallStatus("ended", "通话已结束");
      this.currentSession = null;
    }
  }
  updateStatus(type, text) {
    console.log(`SIP状态更新: ${type} - ${text}`);
    if (this.onStatusChange) {
      this.onStatusChange({ type, text });
    }
  }
  updateCallStatus(type, text) {
    console.log(`通话状态更新: ${type} - ${text}`);
    if (this.onCallStatusChange) {
      this.onCallStatusChange({ type, text });
    }
  }
  handleIncomingCall(session) {
    if (session.direction === "incoming") {
      console.log("来电:", session.remote_identity.uri.toString());
      if (this.onIncomingCall) {
        this.onIncomingCall(session);
      }
    }
  }
}
export default new SipService();
src/views/followvisit/discharge/index.vue
@@ -126,6 +126,12 @@
            placeholder="请输入主治医生"
          ></el-input>
        </el-form-item>
        <el-form-item label="经管医生" prop="managementDoctor">
          <el-input
            v-model="topqueryParams.managementDoctor"
            placeholder="请输入主治医生"
          ></el-input>
        </el-form-item>
        <el-form-item label="患者范围" prop="status">
          <el-cascader
@@ -437,6 +443,13 @@
          align="center"
          key="updateBy"
          prop="updateBy"
          width="120"
        />
        <el-table-column
          label="经管医生"
          align="center"
          key="managementDoctor"
          prop="managementDoctor"
          width="120"
        />
        <el-table-column
@@ -1397,6 +1410,7 @@
    affiliation() {
      this.topqueryParams.drcode = store.getters.hisUserId;
      this.topqueryParams.nurseId = store.getters.hisUserId;
      this.topqueryParams.managementDoctor = store.getters.name;
      this.getList(1);
    },
    onthatday() {
src/views/followvisit/record/detailpage/index.vue
@@ -260,13 +260,37 @@
                  ></el-input> </el-form-item
              ></el-col>
            </el-row>
            <div style="margin-left: 30px">
              <el-button type="primary" plain @click="Editsingletasksonyic('')"
                >保存服务</el-button
              >
            </div>
          </div>
          <el-row :gutter="20" v-if="callStatus !== 'idle'">
            <el-col :span="24">
              <el-alert
                :title="callStatusText"
                :type="callStatusType"
                :closable="false"
                show-icon
              />
            </el-col>
          </el-row>
          <!-- æŒ‚断按钮(仅在通话中显示) -->
          <el-row :gutter="20" v-if="callStatus === 'connected'">
            <el-col :span="24" style="text-align: center; margin-top: 10px">
              <el-button
                type="danger"
                icon="el-icon-phone"
                @click="endCurrentCall"
                :loading="isEndingCall"
              >
                æŒ‚断电话
              </el-button>
            </el-col>
          </el-row>
          <el-form-item label="随访记录">
            <el-input type="textarea" v-model="form.remark"></el-input>
          </el-form-item>
@@ -563,7 +587,7 @@
              å®Œæ•´è¯­éŸ³ï¼š
              <mini-audio
                :audio-source="
                  voice ? voice : 'https://example.com/example.mp3'
                  voice ? voice : '@assets/order/example.mp3'
                "
              ></mini-audio>
            </div>
@@ -587,7 +611,7 @@
                        :audio-source="
                          item.questionvoice
                            ? item.questionvoice
                            : 'https://example.com/example.mp3'
                            : '@assets/order/example.mp3'
                        "
                      ></mini-audio>
                    </div>
@@ -796,6 +820,10 @@
      userid: "",
      currentPhoneNumber: "",
      callType: "", // ç”¨äºŽåŒºåˆ†æ˜¯å“ªä¸ªç”µè¯
      // å·²æœ‰æ•°æ®...
      callStatus: "idle", // idle, calling, connected, ended, failed
      isEndingCall: false,
      currentCall: null, // å½“前通话对象
      input: "今天身体还不错",
      radio: "2",
      taskname: "",
@@ -854,9 +882,9 @@
      },
      pickerOptions: {
        disabledDate(time) {
        // ç¦ç”¨ä»Šå¤©åŠä¹‹å‰çš„æ—¥æœŸ
        return time.getTime() < Date.now() - 24 * 60 * 60 * 1000;
      },
          // ç¦ç”¨ä»Šå¤©åŠä¹‹å‰çš„æ—¥æœŸ
          return time.getTime() < Date.now() - 24 * 60 * 60 * 1000;
        },
        shortcuts: [
          {
            text: "七天后",
@@ -948,7 +976,28 @@
      patid: null,
    };
  },
  computed: {
    callStatusText() {
      const statusMap = {
        idle: "准备呼叫",
        calling: `正在呼叫 ${this.currentPhoneNumber}...`,
        connected: `已接通 ${this.currentPhoneNumber}`,
        ended: "通话已结束",
        failed: "呼叫失败",
      };
      return statusMap[this.callStatus];
    },
    callStatusType() {
      const typeMap = {
        idle: "info",
        calling: "warning",
        connected: "success",
        ended: "info",
        failed: "error",
      };
      return typeMap[this.callStatus];
    },
  },
  created() {
    this.taskid = this.$route.query.taskid;
    this.id = this.$route.query.id;
@@ -1190,7 +1239,7 @@
            })
            .catch(() => {
              if (this.form.serviceType == 13) {
                if (this.visitCount) {
                if (this.visitCount!=1) {
                  this.$router.push({
                    path: "/logisticsservice/zbAgain",
                  });
@@ -1200,7 +1249,7 @@
                  });
                }
              } else if (this.form.serviceType == 2) {
                if (this.visitCount) {
                if (this.visitCount!=1) {
                  this.$router.push({
                    path: "/logisticsservice/again",
                  });
@@ -1217,28 +1266,95 @@
          console.error("发生错误:", error);
        });
    },
    // éªŒè¯æ‰‹æœºå·æ ¼å¼
    isValidPhone(phone) {
      return /^1[3-9]\d{9}$/.test(phone);
    },
    // å‘¼å«å¤„理
    handleCall(phone, type) {
      if (this.isValidPhone(phone)) {
        this.currentPhoneNumber = phone;
        this.callType = type;
        // ç­‰å¾…下一个tick确保值已更新
        this.$nextTick(() => {
          this.$refs.callButton.startCall();
          // å¯é€‰ï¼šæ ¹æ®ä¸åŒç±»åž‹åšä¸åŒå¤„理
          if (type === "tel") {
            console.log("正在呼叫患者本人:", phone);
          } else {
            console.log("正在呼叫联系人:", phone);
          }
        });
    // éªŒè¯ç”µè¯å·ç æ ¼å¼å¹¶è¿”回错误信息
    validatePhoneNumber(phone) {
      if (!phone) {
        return { isValid: false, message: "请输入电话号码" };
      }
      // æ‰‹æœºå·æ­£åˆ™
      const mobileRegex = /^1[3-9]\d{9}$/;
      // å¸¦åŒºå·çš„固定电话(完整格式)
      const landlineFullRegex = /^0\d{2,3}-?\d{7,8}$/;
      // ä¸å¸¦åŒºå·çš„固定电话(仅本地号码)
      const landlineLocalRegex = /^\d{7,8}$/;
      if (mobileRegex.test(phone)) {
        return { isValid: true, type: "mobile" };
      } else if (landlineFullRegex.test(phone)) {
        return { isValid: true, type: "landline" };
      } else if (landlineLocalRegex.test(phone)) {
        return {
          isValid: false,
          message: "本地号码请添加区号(如028-1234567)",
        };
      } else {
        return {
          isValid: false,
          message: "请输入正确的电话号码(手机号或带区号的固定电话)",
        };
      }
    },
    // ä½¿ç”¨ç¤ºä¾‹
    isValidPhone(phone) {
      return this.validatePhoneNumber(phone).isValid;
    },
    handleCall(phone, type) {
      if (!this.isValidPhone(phone)) {
        this.$message.error("请输入正确的手机号码");
        return;
      }
      this.currentPhoneNumber = phone;
      this.callType = type;
      this.callStatus = "calling";
      this.$nextTick(() => {
        this.$refs.callButton.startCall();
        // ç›‘听通话状态变化
        this.$refs.callButton.$on("call-status-change", (status) => {
          this.handleCallStatusChange(status);
        });
      });
    },
    // å¤„理通话状态变化
    handleCallStatusChange(status) {
      console.log(status, "status");
      this.callStatus = status.type;
      if (status.type === "connected") {
        this.currentCall = {
          phone: this.currentPhoneNumber,
          type: this.callType,
          startTime: new Date(),
        };
      } else if (status.type === "ended" || status.type === "failed") {
        this.currentCall = null;
      }
      // å¯ä»¥æ ¹æ®çŠ¶æ€æ‰§è¡Œå…¶ä»–æ“ä½œ
      if (status.type === "failed") {
        this.$message.error(`呼叫失败: ${status.text}`);
      }
    },
    // ç»“束当前通话
    endCurrentCall() {
      if (!this.currentCall) return;
      this.isEndingCall = true;
      this.$refs.callButton.endCall();
      // 3秒后重置状态
      setTimeout(() => {
        this.isEndingCall = false;
      }, 3000);
    },
    yuyingetdetail() {
      this.tableDatatop.forEach((item, index) => {
@@ -1285,7 +1401,7 @@
            })
            .catch(() => {
              if (this.form.serviceType == 13) {
                if (this.visitCount!=1) {
                if (this.visitCount != 1) {
                  this.$router.push({
                    path: "/logisticsservice/zbAgain",
                  });
@@ -1295,7 +1411,7 @@
                  });
                }
              } else if (form.serviceType == 2) {
                if (this.visitCount!=1) {
                if (this.visitCount != 1) {
                  this.$router.push({
                    path: "/followvisit/again",
                  });
@@ -1331,7 +1447,7 @@
          this.form = res.rows[0].serviceSubtaskList.find(
            (item) => item.id == this.id
          );
          console.log(this.form.serviceType,'serviceType');
          console.log(this.form.serviceType, "serviceType");
          this.logsheetlist = res.rows[0].serviceSubtaskList;
          this.templateid = this.logsheetlist[0].templateid;
@@ -1481,6 +1597,10 @@
    setupsubtask() {
      this.$refs["zcform"].validate((valid) => {
        if (valid) {
          if (this.form.date1 && new Date(this.form.date1) < new Date()) {
            this.$message.error("随访时间不能小于当前时间");
            return false;
          }
          this.form.remark =
            this.form.remark + "【" + this.getCurrentTime() + "】";
          let form = structuredClone(this.form);
@@ -1500,7 +1620,7 @@
          }
          // form.id = null;
          form.sendstate = 2;
          console.log(form.serviceType,'form.serviceType');
          console.log(form.serviceType, "form.serviceType");
          addserviceSubtask(form).then((res) => {
            if (res.code == 200) {
src/views/followvisit/tasklist/index.vue
@@ -732,6 +732,7 @@
            label: "问卷随访",
          },
        ];
        this.topqueryParams.type=2;
      } else if (this.tasktopic == 4 || this.tasktopic == 8) {
        if (!this.topqueryParams.type) this.topqueryParams.type = "3";
        this.longtermlist = [
@@ -740,6 +741,7 @@
            label: "宣教关怀",
          },
        ];
        this.topqueryParams.type=3;
      } else if (this.tasktopic == 5) {
        if (!this.topqueryParams.type) this.topqueryParams.type = "1";
        this.longtermlist = [
@@ -753,10 +755,6 @@
          },
        ];
      }
      // this.topqueryParams.typename = this.findLabelByValue(
      //   this.taskoptions,
      //   this.tasktopic
      // );
      this.topqueryParams.beginTime = this.dateRange[0];
      this.topqueryParams.endTime = this.dateRange[1];
      getTasklist(this.topqueryParams).then((response) => {
src/views/index.vue
@@ -20,7 +20,7 @@
            <el-row :gutter="20">
              <el-col :span="10">
                <div class="home-user-task-stats">
                  <p>{{ OutpatientData.rs }}</p>
                  <p>{{ OutpatientData.rc }}</p>
                  <div class="text-color2">
                    <p>门诊就诊量(人次)</p>
                  </div>
@@ -28,7 +28,7 @@
              </el-col>
              <el-col :span="10">
                <div class="home-user-task-stats">
                  <p>{{ OutpatientData.rc }}</p>
                  <p>{{ OutpatientData.rs }}</p>
                  <div class="text-color2">
                    <p>门诊服务量(人次)</p>
                  </div>
@@ -62,7 +62,7 @@
            <el-row :gutter="20">
              <el-col :span="10">
                <div class="home-user-task-stats">
                  <p style="color: red">{{ DischargeData.rs }}</p>
                  <p style="color: red">{{ DischargeData.rc }}</p>
                </div>
                <div class="text-color2">
                  <p>出院就诊量(人次)</p>
@@ -70,7 +70,7 @@
              </el-col>
              <el-col :span="10">
                <div class="home-user-task-stats">
                  <p style="color: red">{{ DischargeData.rc }}</p>
                  <p style="color: red">{{ DischargeData.rs }}</p>
                  <div class="text-color2">
                    <p>出院服务量(人次)</p>
                  </div>
@@ -94,32 +94,52 @@
                style="margin-left: 390px"
                @change="changes"
              >
                <el-radio-button label="周" @click="dyat = 7"></el-radio-button>
                <el-radio-button
                  label="月"
                  @click="dyat = 30"
                  label="近一周"
                  @click="dyat = 7"
                ></el-radio-button>
                <el-radio-button
                  label="å¹´"
                  @click="dyat = 360"
                  label="近一月"
                  @click="dyat = 31"
                ></el-radio-button>
                <el-radio-button
                  label="近一年"
                  @click="dyat = 365"
                ></el-radio-button>
                <el-radio-button label="自定义">
                  <el-date-picker
                    v-if="radio1 === '自定义'"
                    v-model="customDateRange"
                    type="daterange"
                    range-separator="至"
                    start-placeholder="开始日期"
                    end-placeholder="结束日期"
                    value-format="yyyy-MM-dd"
                    @change="handleCustomDateChange"
                  ></el-date-picker>
                </el-radio-button>
              </el-radio-group>
            </div>
            <!-- ä¸­é—´echars -->
            <!-- ä¸­éƒ¨çº¿æ€§æŸ±çж图 -->
            <div class="boxEchars">
              <div class="echars1" id="echars"></div>
            </div>
          </div>
        </el-col>
        <!-- ä¸­é—´å’Œå³è¾¹ -->
        <!-- å³è¾¹åˆ—表 -->
        <el-col :span="4" class="aside">
          <div class="grid-content bg-purple" style="margin-top: -180px">
          <div class="grid-contentsa bg-purple" style="margin-top: -180px">
            <div class="title">
              ç§‘室服务量
              <span>{{ endatd }} ~ {{ statd }}</span>
            </div>
            <div style="max-height: 690px; width: 100%; overflow: auto">
              <el-table style="width: 100%" :data="SkuTop">
            <div class="dept-table-container">
              <el-table
                v-if="SkuTop.length > 0"
                style="width: 100%"
                :data="SkuTop"
                :height="tableHeight"
              >
                <template v-for="(item, index) in SkuTop"></template>
                <el-table-column
                  prop="order"
@@ -129,34 +149,34 @@
                ></el-table-column>
                <el-table-column
                  prop="deptname"
                  width="88"
                  width="120"
                  class-name="name"
                ></el-table-column>
                <el-table-column prop="rc" class-name="rc">
                  <template slot-scope="scope">
                    {{ scope.row.rc }}次
                  </template>
                  <template slot-scope="scope"> {{ scope.row.rc }}次 </template>
                </el-table-column>
              </el-table>
              <div v-else class="empty-tip">
                <el-empty description="暂无科室服务数据"></el-empty>
              </div>
            </div>
          </div>
        </el-col>
      </el-row>
      <!-- åº•部一个 -->
      <el-row :gutter="20" style="margin-bottom: 20px">
        <el-col :span="24">
        <!-- <el-col :span="24">
          <div class="grid-content bg-purple" style="min-height: 300px">
            <div class="title">
              å®£æ•™ç»Ÿè®¡
              <span class="el-icon-s-unfold moreIcon"></span>
            </div>
            <div class="cooperate">
              <!-- åˆä½œåŒºåŸŸ -->
              <div class="pieChart" id="pieCharts"></div>
            </div>
          </div>
        </el-col>
        </el-col> -->
        <!-- <el-col :span="9">
          <div class="grid-content bg-purple" style="min-height: 300px">
            <div class="title">
@@ -292,7 +312,7 @@
  getechartsListCountdata,
  getechartsMedOuthospList,
  getechartsMedInhospList,
  getechartsandData,
  getServiceStatistics,
  getDeptRanking,
} from "@/api/AiCentre/index";
import dayjs from "dayjs";
@@ -308,8 +328,13 @@
      mypPieCharts: null,
      lastWidth: window.innerWidth,
      lastHeight: window.innerHeight,
      radio1: "月",
      radio1: "近一年",
      ticketStatistics: {},
      timeTypeMap: {
        å‘¨: "day",
        æœˆ: "month",
        å¹´: "year",
      },
      DischargeData: {
        rs: "",
        rc: "",
@@ -327,7 +352,8 @@
      SkuTop: [],
      cylinderSeries: [],
      cylinderXAxis: [],
      dyat: 30,
      customDateRange: [], // è‡ªå®šä¹‰æ—¥æœŸèŒƒå›´
      dyat: 365,
      intervalId: null,
    };
  },
@@ -341,18 +367,34 @@
      return dayjs().subtract(this.dyat, "day").format("YYYY-MM-DD HH:mm:ss");
    },
    statd() {
      if (this.radio1 === "自定义" && this.customDateRange.length > 0) {
        return this.customDateRange[1];
      }
      return dayjs().format("YYYY-MM-DD");
    },
    endatd() {
      if (this.radio1 === "自定义" && this.customDateRange.length > 0) {
        return this.customDateRange[0];
      }
      return dayjs().subtract(this.dyat, "day").format("YYYY-MM-DD");
    },
    tableHeight() {
      // æ ¹æ®æ•°æ®é‡åŠ¨æ€è®¡ç®—é«˜åº¦
      const rowHeight = 40; // æ¯è¡Œå¤§çº¦é«˜åº¦
      const headerHeight = 40; // è¡¨å¤´é«˜åº¦
      const minHeight = 500; // æœ€å°é«˜åº¦
      const maxHeight = 600; // æœ€å¤§é«˜åº¦
      const calculatedHeight = this.SkuTop.length * rowHeight + headerHeight;
      return Math.min(Math.max(calculatedHeight, minHeight), maxHeight);
    },
  },
  created() {
    this.getTopdata();
    this.getgraphdata();
    this.getranking();
    // this.getranking();
    this.$nextTick(function () {
      this.getregionAmountCollect();
      this.myEcharts2();
      this.getnodeCollect();
      this.getSkuTop();
    });
@@ -369,17 +411,37 @@
  methods: {
    // æ”¹å˜æ—¶é—´äº‹ä»¶
    changes() {
      if (this.radio1 == "周") {
        this.dyat = 7;
      } else if (this.radio1 == "月") {
        this.dyat = 30;
      } else {
        this.dyat = 360;
      switch (this.radio1) {
        case "近一周":
          this.dyat = 7;
          break;
        case "近一月":
          this.dyat = 30;
          break;
        case "近一年":
          this.dyat = 365;
          break;
        case "自定义":
          // è‡ªå®šä¹‰æ—¥æœŸå¤„理在handleCustomDateChange方法中
          return;
      }
      this.refreshData();
    },
    // å¤„理自定义日期变化
    handleCustomDateChange(range) {
      if (!range || range.length !== 2) return;
      this.customDateRange = range;
      this.refreshData();
    },
    // ç»Ÿä¸€åˆ·æ–°æ•°æ®çš„æ–¹æ³•
    refreshData() {
      this.getgraphdata();
      this.getranking();
      // this.getranking();
      this.getTopdata();
      this.getregionAmountCollect();
      this.myEcharts2();
      this.getnodeCollect();
      this.getSkuTop();
    },
@@ -396,15 +458,15 @@
    },
    // top排行
    async getSkuTop() {
       let Rankingdata = {
      let Rankingdata = {
        startDate: this.endatd,
        endDate: this.statd,
        cy: 1,
      };
      await getDeptRanking(Rankingdata).then((res) => {
        if (res.code == 200) {
          this.SkuTop=res.rows.sort((a, b) => b.rc - a.rc);
          console.log(this.SkuTop,'this.SkuTop');
          this.SkuTop = res.rows.sort((a, b) => b.rc - a.rc);
          console.log(this.SkuTop, "this.SkuTop");
        }
      });
@@ -451,26 +513,155 @@
        }
      });
    },
    // èŽ·å–å°±è¯Šæ•°é‡
    getranking() {
    },
    // èŽ·å–ä¸­éƒ¨çº¿æŸ±å›¾æ•°æ®
    getgraphdata() {
      let Outhospdata = {
    getranking() {},
    async getgraphdata() {
      let params = {
        startDate: this.endatd,
        endDate: this.statd,
        cy: 1,
        timeType: this.getTimeType(),
      };
      let Inhospdata = {
        startDate: this.endatd,
        endDate: this.statd,
        cy: 1,
      };
      getechartsMedOuthospList(Outhospdata).then((res) => {});
      getechartsMedInhospList(Inhospdata).then((res) => {});
      try {
        const res = await getServiceStatistics(params);
        if (res.code === 200) {
          this.processChartData(res.data);
        }
      } catch (error) {
        console.error("获取图表数据失败:", error);
      }
    },
    // èŽ·å–æ—¶é—´ç±»åž‹
    getTimeType() {
      if (this.radio1 === "近一周" || this.radio1 === "近一月") {
        return "day";
      }
      if (this.radio1 === "近一年") {
        return "month";
      }
      // è‡ªå®šä¹‰æ—¥æœŸèŒƒå›´
      if (this.radio1 === "自定义" && this.customDateRange.length === 2) {
        const start = dayjs(this.customDateRange[0]);
        const end = dayjs(this.customDateRange[1]);
        const diffDays = end.diff(start, "day");
        return diffDays > 60 ? "month" : "day";
      }
      return "day"; // é»˜è®¤è¿”回day类型
    },
    processChartData(data) {
      // æŒ‰æ—¶é—´æŽ’序确保数据顺序正确
      const sortedData = [...data].sort(
        (a, b) => new Date(a.timePeriod) - new Date(b.timePeriod)
      );
      const xAxisData = [];
      const dischargeFollowData = [];
      const outpatientFollowData = [];
      const pmiData = [];
      const pmoData = [];
      sortedData.forEach((item) => {
        // æ ¹æ®æ—¶é—´ç±»åž‹æ ¼å¼åŒ–显示
        const timeType = this.getTimeType();
        const timeLabel =
          timeType === "day"
            ? dayjs(item.timePeriod).format("MM-DD")
            : dayjs(item.timePeriod).format("YYYY-MM");
        xAxisData.push(timeLabel);
        dischargeFollowData.push(item.dischargeFollowCount);
        outpatientFollowData.push(item.outpatientFollowCount);
        pmiData.push(item.pmiCount);
        pmoData.push(item.pmoCount);
      });
      // æ›´æ–°å›¾è¡¨
      this.updateChart(
        xAxisData,
        dischargeFollowData,
        outpatientFollowData,
        pmiData,
        pmoData
      );
    },
    updateChart(
      xAxisData,
      dischargeFollowData,
      outpatientFollowData,
      pmiData,
      pmoData
    ) {
      if (!this.myChart2) {
        this.myEcharts2();
        return;
      }
      // è®¡ç®—随访量的最大值
      const maxFollow = Math.max(
        ...dischargeFollowData,
        ...outpatientFollowData
      );
      // è®¡ç®—服务人次的最大值
      const maxService = Math.max(...pmiData, ...pmoData);
      // åŠ¨æ€è®¡ç®—interval值
      const followInterval = this.calculateOptimalInterval(maxFollow);
      const serviceInterval = this.calculateOptimalInterval(maxService);
      const option = {
        xAxis: {
          data: xAxisData,
        },
        yAxis: [
          {
            interval: followInterval,
            max: Math.ceil(maxFollow / followInterval) * followInterval,
          },
          {
            interval: serviceInterval,
            max: Math.ceil(maxService / serviceInterval) * serviceInterval,
          },
        ],
        series: [
          { data: dischargeFollowData },
          { data: outpatientFollowData },
          { data: pmiData },
          { data: pmoData },
        ],
      };
      this.myChart2.setOption(option);
    },
    // è®¡ç®—最优的interval值
    calculateOptimalInterval(maxValue) {
      if (maxValue <= 0) return 50; // é»˜è®¤å€¼
      // æ ¹æ®æœ€å¤§å€¼è®¡ç®—合适的间隔
      const magnitude = Math.pow(10, Math.floor(Math.log10(maxValue)));
      const stepRatio = maxValue / magnitude;
      let interval;
      if (stepRatio > 5) {
        interval = magnitude;
      } else if (stepRatio > 2) {
        interval = magnitude / 2;
      } else {
        interval = magnitude / 5;
      }
      // ç¡®ä¿interval是整数
      interval = Math.round(interval);
      // é™åˆ¶æœ€å°é—´éš”
      return Math.max(interval, 50);
    },
    // èŽ·å–çº¿çŠ¶å›¾æ—¶é—´
    async getregionAmountCollect() {
      //getregionAmountCollect(1, this.endatd, this.statd);
@@ -480,11 +671,12 @@
      this.series = [123, 123, 223, 212, 432, 123, 442, 234];
      this.myEcharts2();
    },
    // çº¿æ€§å›¾
    // çº¿æ€§å›¾åŠæŸ±çж图
    myEcharts2() {
      var echarts = require("echarts");
      var myChart2 = echarts.init(document.getElementById("echars"));
      this.myChart2 = myChart2;
      var option2 = {
        tooltip: {
          trigger: "axis",
@@ -504,30 +696,12 @@
          },
        },
        legend: {
          data: [
            "出院随访量",
            "门诊随访量",
            // "在院随访量",
            // "门诊复诊通知",
            "出院服务人次",
            "门诊服务人次",
          ],
          data: ["出院服务量", "门诊服务量", "出院就诊人次", "门诊就诊人次"],
        },
        xAxis: [
          {
            type: "category",
            data: [
              "一月",
              "二月",
              "三月",
              "四月",
              "五月",
              "六月",
              "七月",
              "八月",
              "九月",
              "十月",
            ],
            data: [], // åˆå§‹ä¸ºç©ºï¼Œå°†é€šè¿‡API数据填充
            axisPointer: {
              type: "shadow",
            },
@@ -538,18 +712,14 @@
            type: "value",
            name: "随访量",
            min: 0,
            max: 250,
            interval: 50,
            axisLabel: {
              formatter: "{value} äºº",
            },
          },
          {
            type: "value",
            name: "复诊/评估次数",
            name: "服务人次",
            min: 0,
            max: 250,
            interval: 50,
            axisLabel: {
              formatter: "{value} æ¬¡",
            },
@@ -558,50 +728,27 @@
        grid: { top: "35%" },
        series: [
          {
            name: "出院随访量",
            name: "出院服务量",
            type: "bar",
            tooltip: {
              valueFormatter: function (value) {
                return value + " äºº";
              },
            },
            data: [120, 150, 165, 90, 140, 200, 130, 85, 175, 95, 110, 160],
            data: [], // åˆå§‹ä¸ºç©ºï¼Œå°†é€šè¿‡API数据填充
          },
          // {
          //   name: "影像随访量",
          //   type: "bar",
          //   tooltip: {
          //     valueFormatter: function (value) {
          //       return value + " äºº";
          //     },
          //   },
          //   data: [102, 190, 135, 88, 175, 160, 83, 145, 200, 110, 97, 180],
          // },
          {
            name: "门诊随访量",
            name: "门诊服务量",
            type: "bar",
            tooltip: {
              valueFormatter: function (value) {
                return value + " äºº";
              },
            },
            data: [145, 92, 178, 134, 167, 85, 199, 112, 156, 88, 120, 145],
            data: [], // åˆå§‹ä¸ºç©ºï¼Œå°†é€šè¿‡API数据填充
          },
          // {
          //   name: "出院复诊通知",
          //   type: "line",
          //   smooth: 0.3,
          //   yAxisIndex: 1,
          //   tooltip: {
          //     valueFormatter: function (value) {
          //       return value + " æ¬¡";
          //     },
          //   },
          //   data: [45, 123, 78, 156, 89, 34, 199, 112, 67, 145, 88, 175],
          // },
          {
            name: "出院服务人次",
            name: "出院就诊人次",
            type: "line",
            smooth: 0.3,
            yAxisIndex: 1,
@@ -610,10 +757,10 @@
                return value + " æ¬¡";
              },
            },
            data: [102, 190, 135, 88, 175, 160, 83, 145, 200, 110, 97, 180],
            data: [], // åˆå§‹ä¸ºç©ºï¼Œå°†é€šè¿‡API数据填充
          },
          {
            name: "门诊服务人次",
            name: "门诊就诊人次",
            type: "line",
            smooth: 0.3,
            yAxisIndex: 1,
@@ -622,29 +769,15 @@
                return value + " æ¬¡";
              },
            },
            data: [120, 150, 165, 90, 140, 200, 130, 85, 175, 95, 110, 160],
            data: [], // åˆå§‹ä¸ºç©ºï¼Œå°†é€šè¿‡API数据填充
          },
        ],
      };
      myChart2.on("updateAxisPointer", function (event) {
        const xAxisInfo = event.axesInfo[0];
        if (xAxisInfo) {
          const dimension = xAxisInfo.value + 1;
          myChart2.setOption({
            series: {
              id: "pie",
              label: {
                formatter: "{b}: {@[" + dimension + "]} ",
              },
              encode: {
                value: dimension,
                tooltip: dimension,
              },
            },
          });
        }
      });
      myChart2.setOption(option2);
      // åˆå§‹åŠ è½½æ•°æ®
      this.getgraphdata();
    },
    // é¥¼çж图
    myPieChart() {
@@ -776,6 +909,12 @@
  .echars1 {
    flex: 1;
  }
}
.dept-table-container {
  flex: 1;
  display: flex;
  flex-direction: column;
  min-height: 0; /* é‡è¦ï¼šå…è®¸å†…容收缩 */
}
::v-deep .el-table {
  td:first-child {
@@ -1034,6 +1173,12 @@
  padding: 0 10px;
  text-align: center;
}
.grid-contentsa {
  min-height: 600px;
  border-radius: 20px;
  padding: 0 10px;
  text-align: center;
}
.grid-contents {
  min-height: 36px;
src/views/knowledge/education/compilequer/index.vue
@@ -703,7 +703,7 @@
        });
      }
      // å®£æ•™åˆ†ç±»
      getheLibraryAssort({}).then((res) => {
      getheLibraryAssort({ hetype: 1 }).then((res) => {
        this.sortlist = res.rows;
        console.log(this.sortlist);
      });
src/views/knowledge/education/index.vue
@@ -88,7 +88,6 @@
                >
                  <el-option
                    v-for="item in courtyardlist"
                    :key="item.label"
                    :label="item.label"
                    :value="item.label"
                  >
@@ -112,7 +111,6 @@
                >
                  <el-option
                    v-for="(item, index) in qyoptions"
                    :key="item.value"
                    :label="item.label"
                    :value="item.value"
                  >
src/views/login.vue
@@ -119,6 +119,9 @@
        { value: "47231022633110211A2101", label: "丽水市中医院" },
        { value: "47246102433112211A2101", label: "缙云县中医医院 " },
        { value: "47240018433118111A2101", label: "龙泉市中医医院 " },
        { value: "47240004533118111A1001", label: "龙泉市人民医院 " },
        { value: "47243006833112611A2101", label: "庆元县中医医院 " },
        { value: "47234002X33112111A2101", label: "青田县中医医院 " },
       ],
      loginRules: {
        username: [
src/views/patient/patient/hospital.vue
@@ -268,6 +268,13 @@
            width="120"
          />
          <el-table-column
            label="经管医生"
            align="center"
            key="managementDoctor"
            prop="managementDoctor"
            width="120"
          />
          <el-table-column
            label="主治医生"
            align="center"
            key="drname"
src/views/patient/propaganda/Missioncreation.vue
@@ -124,7 +124,7 @@
                      </el-select> </el-form-item
                  ></el-col>
                </el-row>
                    <el-form-item label="执行周期" prop="longTask">
                <el-form-item label="执行周期" prop="longTask">
                  <el-radio-group v-model="form.longTask">
                    <el-radio :label="0">自定义周期</el-radio>
                    <el-radio :label="1">长期任务</el-radio>
@@ -147,7 +147,10 @@
                    <el-radio :label="2">即刻发送</el-radio>
                  </el-radio-group>
                </el-form-item>
                <el-form-item label="执行日期:" v-if="form.sendType == 1&& !form.longTask">
                <el-form-item
                  label="执行日期:"
                  v-if="form.sendType == 1 && !form.longTask"
                >
                  <el-date-picker
                    v-model="daytime"
                    @change="changeTimeday"
@@ -160,7 +163,10 @@
                  </el-date-picker>
                </el-form-item>
                <el-form-item label="执行时间点:" v-if="form.sendType == 3&& !form.longTask">
                <el-form-item
                  label="执行时间点:"
                  v-if="form.sendType == 3 && !form.longTask"
                >
                  <div style="display: flex">
                    <div style="margin-right: 10px">
                      <el-date-picker
@@ -175,7 +181,10 @@
                  </div>
                </el-form-item>
                <el-form-item label="执行时间段:" v-if="form.sendType == 1&& !form.longTask">
                <el-form-item
                  label="执行时间段:"
                  v-if="form.sendType == 1 && !form.longTask"
                >
                  <div style="display: flex">
                    <div style="margin-right: 10px">
                      <span style="font-size: 18px; margin-right: 10px">①</span>
@@ -406,7 +415,6 @@
                        icon="el-icon-upload2"
                        size="medium"
                        @click="handleImport"
                        >导入</el-button
                      >
                    </el-col>
@@ -530,11 +538,19 @@
    <!-- æ¨¡æ¿é¢„览 -->
    <el-dialog title="模板预览" :visible.sync="previewtf" width="60%">
      <div class="preview-left">
        <!-- å•选 -->
        <div v-html="htmlRichText"></div>
        <!-- æ ¹æ®æ¨¡æ¿ç±»åž‹æ˜¾ç¤ºä¸åŒå†…容 -->
        <div v-if="currentTemplateType == '2'">
          <!-- é€šçŸ¥æ¨¡æ¿åªæ˜¾ç¤ºçº¯æ–‡æœ¬å†…容 -->
          <div style="white-space: pre-wrap; font-size: 16px; line-height: 1.6">
            {{ plainTextContent }}
          </div>
        </div>
        <div v-else>
          <!-- å…¶ä»–类型模板显示富文本内容 -->
          <div v-html="htmlRichText"></div>
        </div>
      </div>
      <span slot="footer" class="dialog-footer">
        <!-- <el-button @click="previewGo">前往模板详情修改</el-button> -->
        <el-button type="primary" @click="previewFn">确认使用</el-button>
      </span>
    </el-dialog>
@@ -606,13 +622,16 @@
        <el-table :data="uploadingData" style="width: 100%">
          <el-table-column prop="serial" label="患者id"> </el-table-column>
          <el-table-column prop="name" label="姓名"
          width="100"> </el-table-column>
          <el-table-column prop="sex" label="性别"width="100"> </el-table-column>
          <el-table-column prop="idcardno" width="300" label="证件号码"> </el-table-column>
          <el-table-column prop="name" label="姓名" width="100">
          </el-table-column>
          <el-table-column prop="sex" label="性别" width="100">
          </el-table-column>
          <el-table-column prop="idcardno" width="300" label="证件号码">
          </el-table-column>
          <el-table-column prop="goday" label="出生日期"> </el-table-column>
          <el-table-column prop="telcode" width="200" label="联系方式"> </el-table-column>
          <el-table-column prop="createTime"  width="200" label="创建日期">
          <el-table-column prop="telcode" width="200" label="联系方式">
          </el-table-column>
          <el-table-column prop="createTime" width="200" label="创建日期">
          </el-table-column>
        </el-table>
        <!-- <pagination
@@ -653,26 +672,20 @@
              <el-form-item label="宣教名称">
                <el-input v-model="topqueryParams.preachname"></el-input>
              </el-form-item>
              <el-form-item label="宣教分类" prop="region">
              <el-form-item label="宣教类型" prop="region">
                <el-select
                  v-model="topqueryParams.assortid"
                  v-model="topqueryParams.hetype"
                  size="medium"
                  filterable
                  placeholder="请选择分类"
                >
                  <el-option-group
                    v-for="group in sortlist"
                    :key="group.id"
                    :label="group.assortname"
                  <el-option
                    v-for="item in heLibraryAssortList"
                    :key="item.id"
                    :label="item.value"
                    :value="item.id"
                  >
                    <el-option
                      v-for="item in group.heLibraryAssortList"
                      :key="item.id"
                      :label="item.assortname"
                      :value="item.id"
                    >
                    </el-option>
                  </el-option-group>
                  </el-option>
                </el-select>
              </el-form-item>
@@ -767,6 +780,8 @@
    return {
      title: "宣教内容列表",
      currenttype: 1, //1宣教2门诊3出院4复诊5体检6问卷
      currentTemplateType: "", // å½“前模板类型
      plainTextContent: "", // çº¯æ–‡æœ¬å†…容
      id: "", //
      previewid: "", //任务模板传递id
      libName: "",
@@ -816,7 +831,7 @@
      tableLabelxj: [
        { label: "创建人", width: "", prop: "createBy" },
        { label: "宣教名称", width: "180", prop: "preachname" },
        { label: "宣教描述", width: "180", prop: "preachcontent" },
        { label: "宣教内容", width: "180", prop: "preachcontent" },
        // { label: "宣教形式", width: "", prop: "playType" },
        { label: "适用方式", width: "", prop: "suitway" },
        { label: "修改日期", width: "", prop: "uploadTime" },
@@ -930,6 +945,10 @@
      ],
      variableListTime: [],
      sortlist: [],
      heLibraryAssortList: [
        { id: 1, value: "宣教" },
        { id: 2, value: "通知" },
      ],
      tasktopic: null, //新增类型
      SelectPatientslist: [],
      form: {
@@ -939,7 +958,10 @@
        templatename: "",
        templateid: null,
        libtemplateid: null,
        kcb: "亲爱的患者-家属,我们是"+localStorage.getItem("orgname")+"的医护人员,为了更好地了解您的康复情况,请您抽一点宝贵时间,观看这份宣教资讯。",
        kcb:
          "亲爱的患者-家属,我们是" +
          localStorage.getItem("orgname") +
          "的医护人员,为了更好地了解您的康复情况,请您抽一点宝贵时间,观看这份宣教资讯。",
        jsy: "生活上要劳逸结合,注意休息和营养,适当锻炼,戒烟限酒,保持心情舒畅,定期复诊。那本次宣教内容就到这里,祝您身体健康!",
      },
      taskoptions: [
@@ -1104,7 +1126,7 @@
    submitForm(formName) {
      this.form.preachform = this.checkList.join(",");
      // this.formatFn(1);
      if (!this.form.patTaskRelevances[0]) {
      if (!this.form.patTaskRelevances[0]&&this.form.longTask==0) {
        this.$modal.msgError("请选择病人");
        return;
      }
@@ -1122,7 +1144,7 @@
        this.form.isoperation = 2;
      } else {
        this.form.isoperation = 1;
        this.form.sendState=1;
        this.form.sendState = 1;
      }
      if (!this.form.type) {
        this.form.type = this.$route.query.type;
@@ -1150,28 +1172,33 @@
    // ----------------------表格子组件事件
    // é€‰æ‹©æ¨¡æ¿å¹¶é¢„览
    selectfn(row, type) {
      // æ¨¡æ¿æƒ…况下获取模板信息
      this.libName = row.preachname;
      this.htmlRichText = null;
      this.libId = row.id;
      console.log(row, "row");
      this.Tasktemplate = row;
      // è®¾ç½®å½“前模板类型
      this.currentTemplateType = row.hetype || "1"; // é»˜è®¤ä¸ºå®£æ•™ç±»åž‹
      this.previewtf = true;
      this.previewid = row.svyid;
      console.log(this.questionList, "questionList");
      // this.Variablehandling(row.svyLibScripts, 1);
      console.log(row.htmlRichText);
      axios
        .get(row.htmlRichText)
        .then((response) => {
          console.log(response.data, "数据"); // è¾“出获取到的文件内容
          this.htmlRichText = response.data;
          this.htmlRichText = this.addStyleToImages(this.htmlRichText);
        })
        .catch((error) => {
          this.$modal.msgError("获取富文本失败");
          console.error("Failed to fetch file:", error);
        });
      if (this.currentTemplateType == "2") {
        // å¦‚果是通知模板,获取纯文本内容
        this.plainTextContent = row.preachcontent;
      } else {
        // å…¶ä»–类型模板获取富文本内容
        axios
          .get(row.htmlRichText)
          .then((response) => {
            this.htmlRichText = response.data;
            this.htmlRichText = this.addStyleToImages(this.htmlRichText);
          })
          .catch((error) => {
            this.$modal.msgError("获取富文本失败");
            console.error("Failed to fetch file:", error);
          });
      }
    },
    // é¢„览模板
    previewfnm() {
@@ -1182,16 +1209,24 @@
        this.Tasktemplate = res.rows[0];
        this.previewtf = true;
        this.previewid = res.rows[0].svyid;
        axios
          .get(res.rows[0].htmlRichText)
          .then((response) => {
            this.htmlRichText = response.data;
            this.htmlRichText = this.addStyleToImages(this.htmlRichText);
          })
          .catch((error) => {
            this.$modal.msgError("获取富文本失败");
            console.error("Failed to fetch file:", error);
          });
        this.currentTemplateType = res.rows[0].hetype || "1"; // é»˜è®¤ä¸ºå®£æ•™ç±»åž‹
        if (this.currentTemplateType == "2") {
          // å¦‚果是通知模板,获取纯文本内容
          this.plainTextContent = res.rows[0].preachcontent;
        } else {
          // å…¶ä»–类型模板获取富文本内容
          axios
            .get(res.rows[0].htmlRichText)
            .then((response) => {
              this.htmlRichText = response.data;
              this.htmlRichText = this.addStyleToImages(this.htmlRichText);
            })
            .catch((error) => {
              this.$modal.msgError("获取富文本失败");
              console.error("Failed to fetch file:", error);
            });
        }
      });
    },
    addStyleToImages(html) {
@@ -1274,7 +1309,7 @@
    handleExport() {},
    // é€‰æ‹©æ‚£è€…表数据
    handleSelectionChange(selection,type) {
    handleSelectionChange(selection, type) {
      console.log("多选患者");
      this.SelectPatientslist = selection;
      this.multiple = !selection.length;
@@ -1289,8 +1324,8 @@
            item.sfzh = item.idcardno;
          }
          if (type) {
            item.hospType=type
          }else{
            item.hospType = type;
          } else {
            item.hospType = this.patientqueryParams.allhosp;
          }
          this.overallCase.push(item);
@@ -1368,7 +1403,10 @@
        templateid: null,
        libtemplateid: null,
        serviceType: Number(this.$route.query.serviceType),
        kcb: "亲爱的患者-家属,我们是"+localStorage.getItem("orgname")+"的医护人员,为了更好地了解您的康复情况,请您抽一点宝贵时间,完成这份随访问卷。",
        kcb:
          "亲爱的患者-家属,我们是" +
          localStorage.getItem("orgname") +
          "的医护人员,为了更好地了解您的康复情况,请您抽一点宝贵时间,观看这份宣教资讯。",
        jsy: "生活上要劳逸结合,注意休息和营养,适当锻炼,戒烟限酒,保持心情舒畅,定期复诊。那本次回访就到这里,祝您身体健康!",
      };
@@ -1601,9 +1639,9 @@
        this.$refs.upload.submit();
        this.dractive++;
      } else if (this.dractive == 2) {
        this.handleSelectionChange(this.uploadingData,4);
        this.handleSelectionChange(this.uploadingData, 4);
        this.upload.open = false;
        this.dractive = 1
        this.dractive = 1;
      }
    },
@@ -1754,6 +1792,23 @@
    }
  }
}
/* æ–°å¢žæ ·å¼ */
.preview-left {
  padding: 20px;
  max-height: 70vh;
  overflow-y: auto;
}
/* çº¯æ–‡æœ¬å†…容样式 */
.plain-text-content {
  white-space: pre-wrap;
  font-size: 16px;
  line-height: 1.6;
  padding: 15px;
  background: #f9f9f9;
  border-radius: 4px;
}
.download {
  text-align: center;
  .el-upload__tip {
src/views/patient/propaganda/QuestionnaireTask.vue
@@ -84,6 +84,7 @@
                  <el-radio-group v-model="form.longTask">
                    <el-radio :label="0">自定义周期</el-radio>
                    <el-radio :label="1">长期任务</el-radio>
                    <el-radio :label="2">固定任务</el-radio>
                  </el-radio-group>
                </el-form-item>
                <el-row :gutter="20" v-if="form.longTask">
src/views/sfstatistics/percentage/index.vue
@@ -1,37 +1,6 @@
<template>
  <div class="Questionnairemanagement">
    <!-- å·¦ä¾§æ  -->
    <!-- <div class="sidecolumn">
      <div class="sidecolumn-top">
        <div class="top-wj">患者范围</div>
      </div>
      <div class="bottom-fl">
        <el-tabs
          tab-position="right"
          v-model="activeName"
          @tab-click="handleClick"
        >
          <el-tab-pane label="全部" name="first"></el-tab-pane>
          <el-tab-pane label="住院" name="bhospitalized"></el-tab-pane>
          <el-tab-pane label="在院" name="Inhospital"></el-tab-pane>
          <el-tab-pane label="门诊" name="outpatient"></el-tab-pane>
          <el-tab-pane label="体检" name="physical"></el-tab-pane>
        </el-tabs>
      </div>
    </div> -->
    <!-- å³ä¾§æ•°æ® -->
    <div class="leftvlue">
      <!-- <div class="leftvlue-top">
        <el-tabs v-model="topactiveName" @tab-click="tophandleClick">
          <el-tab-pane name="Local">
            <span class="mulsz" slot="label">按出院病区统计 </span>
          </el-tab-pane>
          <el-tab-pane name="sharing">
            <span class="mulsz" slot="label">按出院科室统计 </span>
          </el-tab-pane>
        </el-tabs>
      </div> -->
      <div class="leftvlue-bg">
        <el-row :gutter="20">
          <!--标签数据-->
@@ -44,12 +13,6 @@
              v-show="showSearch"
              label-width="98px"
            >
              <!-- <el-form-item label="责任医生" prop="userName">
                <el-input
                  v-model="queryParams.drname"
                  placeholder="请输入主治医生"
                ></el-input>
              </el-form-item> -->
              <el-form-item label="统计类型" prop="userName">
                <el-select
                  v-model="queryParams.statisticaltype"
@@ -153,19 +116,230 @@
                  @click="handleExport"
                  >导出</el-button
                >
                <el-button
                  type="primary"
                  plain
                  icon="el-icon-data-line"
                  size="medium"
                  @click="showChartDialog"
                  >统计趋势图</el-button
                >
              </el-col>
            </el-form>
            <!-- <right-toolbar
          :showSearch.sync="showSearch"
          @queryTable="getList"
          :columns="columns"
        ></right-toolbar> -->
            <el-table
              v-loading="loading"
              :data="userList"
              :border="true"
              @selection-change="handleSelectionChange"
              @row-click="handleRowClick"
              @expand-change="handleRowClick"
              :row-key="getRowKey"
              :expand-row-keys="expands"
            >
              <!-- å±•开行箭头列 -->
              <el-table-column type="expand">
                <template slot-scope="props">
                  <el-table
                    :data="props.row.doctorStats"
                    border
                    style="width: 95%; margin: 0 auto"
                    class="inner-table"
                  >
                    <el-table-column
                      label="医生姓名"
                      prop="drname"
                      align="center"
                    />
                    <el-table-column
                      label="科室"
                      width="120"
                      prop="deptname"
                      align="center"
                    />
                    <el-table-column
                      label="出院人次"
                      prop="dischargeCount"
                      align="center"
                    />
                    <el-table-column
                      label="出院人次"
                      align="center"
                      key="dischargeCount"
                      prop="dischargeCount"
                    >
                    </el-table-column>
                    <el-table-column
                      label="无需随访人次"
                      align="center"
                      width="100"
                      key="nonFollowUp"
                      prop="nonFollowUp"
                    >
                    </el-table-column>
                    <el-table-column
                      label="应随访人次"
                      align="center"
                      width="100"
                      key="followUpNeeded"
                      prop="followUpNeeded"
                    >
                    </el-table-column>
                    <el-table-column align="center" label="首次出院随访">
                      <el-table-column
                        label="应随访"
                        align="center"
                        key="needFollowUp"
                        prop="needFollowUp"
                      >
                      </el-table-column>
                      <el-table-column
                        label="待随访"
                        align="center"
                        key="pendingFollowUp"
                        prop="pendingFollowUp"
                      >
                      </el-table-column>
                      <el-table-column
                        label="随访成功"
                        align="center"
                        key="followUpSuccess"
                        prop="followUpSuccess"
                      >
                      </el-table-column>
                      <el-table-column
                        label="随访失败"
                        align="center"
                        key="followUpFail"
                        prop="followUpFail"
                      >
                      </el-table-column>
                      <el-table-column
                        label="随访率"
                        align="center"
                        width="120"
                        key="followUpRate"
                        prop="followUpRate"
                      >
                        <!-- <template slot-scope="scope">
                    <span
                      >{{
                        (Number(scope.row.followUpRate) * 100).toFixed(2)
                      }}%</span
                    >
                  </template> -->
                      </el-table-column>
                      <el-table-column
                        label="及时率"
                        align="center"
                        width="120"
                        key="rate"
                        prop="rate"
                      >
                        <template slot-scope="scope">
                          <el-button
                            size="medium"
                            type="text"
                            @click="Seedetails(scope.row)"
                            ><span class="button-zx"
                              >{{
                                (Number(scope.row.rate) * 100).toFixed(2)
                              }}%</span
                            ></el-button
                          >
                        </template>
                      </el-table-column>
                      <el-table-column
                        label="人工"
                        align="center"
                        key="manual"
                        prop="manual"
                      >
                      </el-table-column>
                      <el-table-column
                        label="短信"
                        align="center"
                        key="sms"
                        prop="sms"
                      >
                      </el-table-column>
                      <el-table-column
                        label="微信"
                        align="center"
                        key="weChat"
                        prop="weChat"
                      >
                      </el-table-column>
                    </el-table-column>
                    <el-table-column align="center" label="再次出院随访">
                      <el-table-column
                        label="应随访"
                        align="center"
                        key="needFollowUpAgain"
                        prop="needFollowUpAgain"
                      >
                      </el-table-column>
                      <el-table-column
                        label="待随访"
                        align="center"
                        key="pendingFollowUpAgain"
                        prop="pendingFollowUpAgain"
                      >
                      </el-table-column>
                      <el-table-column
                        label="随访成功"
                        align="center"
                        key="followUpSuccessAgain"
                        prop="followUpSuccessAgain"
                      >
                      </el-table-column>
                      <el-table-column
                        label="随访失败"
                        align="center"
                        key="followUpFailAgain"
                        prop="followUpFailAgain"
                      >
                      </el-table-column>
                      <el-table-column
                        label="随访率"
                        align="center"
                        width="120"
                        key="followUpRateAgain"
                        prop="followUpRateAgain"
                      >
                        <!-- <template slot-scope="scope">
                    <span
                      >{{
                        (Number(scope.row.FollowUpRateAgain) * 100).toFixed(2)
                      }}%</span
                    >
                  </template> -->
                      </el-table-column>
                      <el-table-column
                        label="人工"
                        align="center"
                        key="manualAgain"
                        prop="manualAgain"
                      >
                      </el-table-column>
                      <el-table-column
                        label="短信"
                        align="center"
                        key="smsAgain"
                        prop="smsAgain"
                      >
                      </el-table-column>
                      <el-table-column
                        label="微信"
                        align="center"
                        key="weChatAgain"
                        prop="weChatAgain"
                      >
                      </el-table-column>
                    </el-table-column>
                  </el-table>
                </template>
              </el-table-column>
              <el-table-column
                label="出院病区"
                align="center"
@@ -369,6 +543,26 @@
        </el-row>
      </div>
    </div>
    <!-- ç»Ÿè®¡è¶‹åŠ¿å›¾å¼¹çª— -->
    <el-dialog
      title="随访统计趋势图"
      :visible.sync="chartDialogVisible"
      width="80%"
      :close-on-click-modal="false"
    >
      <div class="chart-container">
        <el-row :gutter="20">
          <el-col :span="12">
            <div class="chart-title">随访状态分布</div>
            <div id="pieChart" style="width: 100%; height: 400px"></div>
          </el-col>
          <el-col :span="12">
            <div class="chart-title">随访趋势分析</div>
            <div id="barLineChart" style="width: 100%; height: 400px"></div>
          </el-col>
        </el-row>
      </div>
    </el-dialog>
    <el-dialog
      title="未及时随访患者服务"
      :visible.sync="SeedetailsVisible"
@@ -644,9 +838,13 @@
    return {
      topactiveName: "Local", //顶部选择
      activeName: "first", //侧边选择
      expands: [],
      // é®ç½©å±‚
      loading: false,
      Seedloading: false,
      chartDialogVisible: false,
      pieChart: null,
      barLineChart: null,
      // é€‰ä¸­æ•°ç»„
      ids: [],
      // éžå•个禁用
@@ -784,7 +982,7 @@
        dateRange: [],
        statisticaltype: 1,
        leavehospitaldistrictcodes: ["all"], // é»˜è®¤é€‰ä¸­å…¨éƒ¨ç—…区
        deptcodes: ["all"], // é»˜è®¤é€‰ä¸­å…¨éƒ¨ç§‘室
        deptcodes: [], // é»˜è®¤é€‰ä¸­å…¨éƒ¨ç§‘室
      },
      // åˆ—信息
      columns: [
@@ -829,6 +1027,40 @@
        this.userList = response.data;
      });
    },
    getRowKey(row) {
      return row.statisticaltype === 1
        ? row.leavehospitaldistrictcode
        : row.deptcode;
    },
    // å¤„理行点击展开
    handleRowClick(row) {
      console.log(row, "row");
      // å¦‚果已经展开则收起
      if (this.expands.includes(this.getRowKey(row))) {
        this.expands = [];
        return;
      }
      // å¤„理查询参数
      const params = {
        ...this.queryParams,
        // å¦‚果选择了"全部",则传所有病区/科室代码
        leavehospitaldistrictcodes: [row.leavehospitaldistrictcode],
        drcode: "1",
      };
      // å¦‚果该行还没有加载医生数据,则加载
      if (!row.doctorStats) {
        this.loading = true;
        getSfStatistics(params).then((res) => {
          this.$set(row, "doctorStats", res.data);
          this.expands = [this.getRowKey(row)];
          this.loading = false;
        });
      } else {
        this.expands = [this.getRowKey(row)];
      }
    },
    /** ä¿®æ”¹æ ‡ç­¾ */
    handleUpdate(row) {
      console.log(row, "修改标签");
@@ -870,7 +1102,6 @@
      );
      this.flatArraydept.push({ label: "全部", value: "all" });
      this.flatArrayhospit.push({ label: "全部", value: "all" });
    },
    flattenArray(multiArray) {
      let result = [];
@@ -1064,6 +1295,354 @@
        `user_${new Date().getTime()}.xlsx`
      );
    },
    // æ˜¾ç¤ºå›¾è¡¨å¼¹çª—
    showChartDialog() {
      this.chartDialogVisible = true;
      this.$nextTick(() => {
        this.initPieChart();
        this.initBarLineChart();
      });
    },
    // åœ¨methods中修改统计方法
    showChartDialog() {
      this.chartDialogVisible = true;
      this.$nextTick(() => {
        console.log(this.userList, "this.userList");
        this.initCharts();
      });
    },
    // æ–°å¢žåˆå§‹åŒ–图表方法
    initCharts() {
      this.initPieChart();
      this.initBarLineChart();
    },
    // åˆå§‹åŒ–饼图
initPieChart() {
  const echarts = require("echarts");
  const pieDom = document.getElementById("pieChart");
  if (!pieDom) return;
  if (this.pieChart) {
    this.pieChart.dispose();
  }
  this.pieChart = echarts.init(pieDom);
  // è®¡ç®—饼图数据
  const followUpData = {
    pending: 0,
    success: 0,
    fail: 0,
  };
  this.userList.forEach((item) => {
    followUpData.pending += item.pendingFollowUp || 0;
    followUpData.success += item.followUpSuccess || 0;
    followUpData.fail += item.followUpFail || 0;
  });
  // ä½¿ç”¨æ›´ç¾Žè§‚的颜色方案
  const pieOption = {
    title: {
      text: "随访状态分布",
      left: "center",
      textStyle: {
        color: '#333',
        fontSize: 16
      }
    },
    tooltip: {
      trigger: "item",
      formatter: "{a} <br/>{b}: {c} ({d}%)",
    },
    legend: {
      orient: "vertical",
      left: "left",
      data: ["待随访", "随访成功", "随访失败"],
      textStyle: {
        color: '#666'
      }
    },
    color: ['#FF9D4D', '#36B37E', '#FF5C5C'], // æ–°çš„配色方案
    series: [
      {
        name: "随访状态",
        type: "pie",
        radius: ["40%", "70%"],
        avoidLabelOverlap: true,
        itemStyle: {
          borderRadius: 10,
          borderColor: "#fff",
          borderWidth: 2
        },
        label: {
          show: true,
          formatter: "{b}: {c} ({d}%)",
          color: '#333'
        },
        emphasis: {
          label: {
            show: true,
            fontSize: "18",
            fontWeight: "bold"
          },
          itemStyle: {
            shadowBlur: 10,
            shadowOffsetX: 0,
            shadowColor: 'rgba(0, 0, 0, 0.5)'
          }
        },
        data: [
          {
            value: followUpData.pending,
            name: "待随访"
          },
          {
            value: followUpData.success,
            name: "随访成功"
          },
          {
            value: followUpData.fail,
            name: "随访失败"
          }
        ]
      }
    ]
  };
  this.pieChart.setOption(pieOption);
  window.addEventListener("resize", this.resizePieChart);
},
// åˆå§‹åŒ–柱状折线图
initBarLineChart() {
  const echarts = require("echarts");
  const barDom = document.getElementById("barLineChart");
  if (!barDom) return;
  if (this.barLineChart) {
    this.barLineChart.dispose();
  }
  this.barLineChart = echarts.init(barDom);
  // å‡†å¤‡æ•°æ®
  const categories = this.userList.map(
    (item) => item.leavehospitaldistrictname || item.deptname
  );
  const dischargeData = this.userList.map(
    (item) => item.dischargeCount || 0
  );
  const followUpData = this.userList.map(
    (item) => item.followUpNeeded || 0
  );
  // æ–°å¢žä¸¤æ¡æŠ˜çº¿æ•°æ®
 const followUpRateData = this.userList.map(item => {
    if (!item.followUpRate) return 0;
    // åŽ»æŽ‰ç™¾åˆ†å·å¹¶è½¬ä¸ºæ•°å­—
    const rateStr = String(item.followUpRate).replace('%', '');
    return parseFloat(rateStr) || 0;
  });
  const timelyRateData = this.userList.map(item =>
    item.rate ? (Number(item.rate) * 100).toFixed(2) : 0
  );
  const option = {
    title: {
      text: "科室/病区随访趋势",
      left: "center",
      textStyle: {
        color: '#333',
        fontSize: 16
      }
    },
    tooltip: {
      trigger: "axis",
      axisPointer: {
        type: "cross",
        crossStyle: {
          color: "#999",
        },
      },
    },
    legend: {
      data: ["出院人次", "应随访人次", "随访率(%)", "及时率(%)"],
      top: "bottom",
      textStyle: {
        color: '#666'
      }
    },
    color: ['#5470C6', '#91CC75', '#EE6666', '#9A60B4'], // æ–°å¢žç´«è‰²ç”¨äºŽåŠæ—¶çއ
    xAxis: {
      type: "category",
      data: categories,
      axisLabel: {
        interval: 0,
        rotate: 30,
        color: '#666'
      },
      axisLine: {
        lineStyle: {
          color: '#ddd'
        }
      }
    },
    yAxis: [
      {
        type: "value",
        name: "人次",
        min: 0,
        axisLabel: {
          color: '#666'
        },
        axisLine: {
          lineStyle: {
            color: '#ddd'
          }
        },
        splitLine: {
          lineStyle: {
            color: '#f0f0f0'
          }
        }
      },
      {
        type: "value",
        name: "百分比(%)",
        min: 0,
        max: 100,
        axisLabel: {
          color: '#666',
          formatter: '{value}%'
        },
        axisLine: {
          lineStyle: {
            color: '#ddd'
          }
        },
        splitLine: {
          show: false
        }
      }
    ],
    series: [
      {
        name: "出院人次",
        type: "bar",
        barWidth: "25%",
        data: dischargeData,
        itemStyle: {
          borderRadius: [4, 4, 0, 0]
        }
      },
      {
        name: "应随访人次",
        type: "bar",
        barWidth: "25%",
        data: followUpData,
        itemStyle: {
          borderRadius: [4, 4, 0, 0]
        }
      },
      {
        name: "随访率(%)",
        type: "line",
        yAxisIndex: 1,
        data: followUpRateData,
        symbolSize: 8,
        lineStyle: {
          width: 3
        },
        markLine: {
          silent: true,
          data: [{
            yAxis: 80,
            lineStyle: {
              color: '#EE6666',
              type: 'dashed'
            },
            // label: {
            //   position: 'end',
            //   formatter: '目标80%'
            // }
          }]
        }
      },
      {
        name: "及时率(%)",
        type: "line",
        yAxisIndex: 1,
        data: timelyRateData,
        symbolSize: 8,
        lineStyle: {
          width: 3,
          type: 'dotted' // ä½¿ç”¨è™šçº¿åŒºåˆ†
        },
        markLine: {
          silent: true,
          data: [{
            yAxis: 90,
            lineStyle: {
              color: '#9A60B4',
              type: 'dashed'
            },
            // label: {
            //   position: 'end',
            //   formatter: '目标90%'
            // }
          }]
        }
      }
    ],
    grid: {
      top: '15%',
      left: '3%',
      right: '4%',
      bottom: '15%',
      containLabel: true
    }
  };
  this.barLineChart.setOption(option);
  window.addEventListener("resize", this.resizeBarLineChart);
},
    // å›¾è¡¨å“åº”式调整方法
    resizePieChart() {
      if (this.pieChart) {
        this.pieChart.resize();
      }
    },
    resizeBarLineChart() {
      if (this.barLineChart) {
        this.barLineChart.resize();
      }
    },
    // åœ¨ç»„件销毁时清理
    beforeDestroy() {
      // ç§»é™¤äº‹ä»¶ç›‘听
      window.removeEventListener("resize", this.resizePieChart);
      window.removeEventListener("resize", this.resizeBarLineChart);
      // é”€æ¯å›¾è¡¨å®žä¾‹
      if (this.pieChart) {
        this.pieChart.dispose();
        this.pieChart = null;
      }
      if (this.barLineChart) {
        this.barLineChart.dispose();
        this.barLineChart = null;
      }
    },
  },
};
</script>
@@ -1160,6 +1739,52 @@
    font-size: 20px;
  }
}
/* ä½¿è¡Œæœ‰æ‰‹åž‹æŒ‡é’ˆ */
.el-table__row {
  cursor: pointer;
}
/* å†…层医生表格样式 */
.inner-table {
  // è¡¨å¤´èƒŒæ™¯è‰²
  ::v-deep .el-table__header-wrapper {
    background-color: #f0f7ff !important;
    th {
      background-color: #f0f7ff !important;
    }
  }
  // è¡¨æ ¼è¡ŒèƒŒæ™¯è‰²
  ::v-deep .el-table__body-wrapper {
    tr {
      background-color: #f9fbfe !important;
      &:hover {
        background-color: #e6f1ff !important;
      }
    }
  }
  // è¾¹æ¡†é¢œè‰²
  ::v-deep .el-table--border {
    border-color: #d9e8ff !important;
    td,
    th {
      border-color: #d9e8ff !important;
    }
  }
  // æ–‘马纹效果
  ::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td {
    background-color: #f5f9ff !important;
  }
}
/* å±•开行样式 */
.el-table__expanded-cell {
  padding: 10px 0 !important;
  background: #f8f8f8;
}
.document {
  width: 100px;
  height: 50px;
src/views/shortmessage/healthinformation/compilequer/index.vue
@@ -1,5 +1,5 @@
<template>
  <div class="Questionnairemanagement">
  <div class="NotificationManagement">
    <!-- å·¦ä¾§æ  -->
    <div class="sidecolumn">
      <el-steps finish-status="success" :active="Editprogress" simple>
@@ -10,13 +10,6 @@
            >
          </template>
        </el-step>
        <el-step>
          <template slot="title">
            <span style="cursor: pointer" @click="Editprogress = 2"
              >通知内容</span
            >
          </template>
        </el-step>
      </el-steps>
    </div>
    <!-- å³ä¾§æ•°æ® -->
@@ -24,6 +17,7 @@
      <!-- åŸºæœ¬ä¿¡æ¯ -->
      <div v-if="Editprogress == 1">
        <div class="leftvlue-jbxx">基本信息</div>
        <el-divider></el-divider>
        <el-form
          :model="ruleForm"
          :rules="rules"
@@ -58,20 +52,20 @@
            <el-col :span="12"> </el-col>
          </el-row>
          <el-form-item label="通知标题" prop="preachname">
            <div style="width: 30%">
            <div style="width: 60%">
              <el-input
                v-model="ruleForm.preachname"
                placeholder="请输入标题"
              ></el-input>
            </div>
          </el-form-item>
          <el-form-item label="通知描述" prop="preachcontent">
            <div style="width: 60%">
          <el-form-item label="通知内容" prop="preachcontent">
            <div style="width: 80%">
              <el-input
                type="textarea"
                :rows="2"
                :rows="5"
                v-model="ruleForm.preachcontent"
                placeholder="请输入描述"
                placeholder="请输入通知内容"
              ></el-input>
            </div>
          </el-form-item>
@@ -109,21 +103,6 @@
            </div>
          </el-form-item>
          <el-form-item label="文件" prop="sickness">
            <div style="width: 40%">
              <el-upload
                class="upload-demo"
                action="https://jsonplaceholder.typicode.com/posts/"
                :on-change="handleChange"
                :file-list="fileList"
              >
                <el-button size="small" type="primary">点击上传</el-button>
                <div slot="tip" class="el-upload__tip">
                  åªèƒ½ä¸Šä¼ jpg/png/xsl文件,且不超过50mb
                </div>
              </el-upload>
            </div>
          </el-form-item>
          <el-form-item label="标签" prop="desc">
            <div class="xinz-inf">
              <el-tag
@@ -142,6 +121,7 @@
                @change="handleInputConfirm"
                filterable
                remote
                allow-create
                reserve-keyword
                default-first-option
                :remote-method="remoteMethodtag"
@@ -175,53 +155,23 @@
            ></el-col>
            <el-col :span="9">
              <el-form-item label="可用状态" prop="region">
                <el-select
                  v-model="ruleForm.isavailable"
                  size="medium"
                  filterable
                  placeholder="请选择分类"
                >
                  <el-option
                    class="ruleFormaa"
                    v-for="item in usable"
                    :key="item.value"
                    :label="item.label"
                    :value="item.value"
                <el-radio-group v-model="ruleForm.isAvailable">
                  <el-radio
                    v-for="(item, index) in usable"
                    :label="item.value"
                    >{{ item.label }}</el-radio
                  >
                  </el-option>
                </el-select> </el-form-item
            ></el-col>
                </el-radio-group>
              </el-form-item></el-col
            >
          </el-row>
          <el-form-item label="通知方式" prop="region">
            <el-select
              v-model="ruleForm.suitway"
              size="medium"
              multiple
              filterable
              placeholder="请选择分类"
            >
              <el-option
                class="ruleFormaa"
                v-for="item in mode"
                :key="item.label"
                :label="item.label"
                :value="item.label"
              >
              </el-option>
            </el-select>
          </el-form-item>
          <!-- <el-form-item label="适用疾病" prop="region">
            <el-button type="warning" @click="$refs.child.handleAddpatient()"
              >添加疾病</el-button
            >
          </el-form-item> -->
          <el-form-item label="适用院区" prop="region">
            <el-select
              v-model="ruleForm.campus"
              size="medium"
              multiple
              filterable
              placeholder="请选择分类"
              placeholder="请选择院区"
            >
              <el-option
                class="ruleFormaa"
@@ -248,105 +198,12 @@
            </el-cascader>
          </el-form-item>
          <el-form-item>
            <el-button type="success" @click="nextstep('ruleForm')"
              >下一步</el-button
            >
            <el-button type="success" @click="Departmenttreatment('ruleForm')"
              >保存</el-button
            >
            <el-button type="info" @click="closeFm('ruleForm')">关闭</el-button>
          </el-form-item>
        </el-form>
      </div>
      <!-- é€šçŸ¥å†…容 -->
      <div v-if="Editprogress == 2">
        <el-row :gutter="20">
          <el-col :span="4"><div class="leftvlue-jbxx">通知内容</div></el-col>
        </el-row>
        <div>
          <el-form
            :model="ruleForm"
            :rules="rules"
            ref="ruleForm"
            label-width="100px"
            class="demo-ruleForm"
          >
            <el-row gutter="20">
              <el-col :span="12">
                <el-form-item label="资料形式" prop="region">
                  <el-select
                    v-model="ruleForm.shape"
                    placeholder="请选择内容形式"
                  >
                    <el-option
                      v-for="item in xjxsoptions"
                      :key="item.value"
                      :label="item.label"
                      :value="item.value"
                    >
                    </el-option>
                  </el-select>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <div>
                  <el-button @click="laststep('ruleForm')">上一步</el-button>
                  <el-button
                    type="success"
                    @click="Departmenttreatment('ruleForm')"
                    >保存</el-button
                  >
                  <el-button
                    type="warning"
                    @click="Departmenttreatment('ruleForm')"
                    >另存新版本</el-button
                  >
                  <el-button type="info" @click="closeFm('ruleForm')"
                    >关闭</el-button
                  >
                </div></el-col
              >
            </el-row>
          </el-form>
        </div>
        <div>
          <el-upload
            class="upload-demo"
            :action="uploadImgUrlword"
            :on-success="uploadEditorSuccessword"
            :on-error="uploadEditorErrorword"
            :before-upload="beforeEditorUploadword"
            :headers="headers"
          >
            <el-button size="small" type="primary">word文件上传</el-button>
          </el-upload>
          <div id="quillEditorQiniu">
            <!-- åŸºäºŽelementUi的上传组件 el-upload begin-->
            <el-upload
              class="avatar-uploader"
              :action="uploadImgUrl"
              :accept="'image/*,video/*'"
              :show-file-list="false"
              :on-success="uploadEditorSuccess"
              :on-error="uploadEditorError"
              :before-upload="beforeEditorUpload"
              :headers="headers"
            >
            </el-upload>
            <!-- åŸºäºŽelementUi的上传组件 el-upload end-->
            <quill-editor
              class="editor"
              v-model="content"
              ref="customQuillEditor"
              :options="editorOption"
              @blur="onEditorBlur"
              @focus="onEditorFocus"
              @change="onEditorChange"
            >
            </quill-editor>
          </div>
        </div>
      </div>
    </div>
    <!-- æ·»åŠ é€‚ç”¨ç–¾ç—…çª—å£ -->
@@ -361,9 +218,7 @@
</template>
<script>
import { quillEditor } from "vue-quill-editor";
import axios from "axios";
import {
  getheLibraryAssort,
  delheLibraryAssort,
@@ -379,115 +234,33 @@
  illnesslistget,
  getillness,
} from "@/api/AiCentre/index";
import OptionalForm from "@/components/OptionalForm"; //正则组件
import OptionalForm from "@/components/OptionalForm";
import { listDept } from "@/api/system/dept";
// import * as Quill from "quill";
import Quill from "quill";
import { listtag } from "@/api/system/label";
import store from "@/store";
// è¿™é‡Œå¼•入修改过的video模块并注册
import Video from "./video";
Quill.register(Video, true);
//获取登录token,引入文件,如果只是简单测试,没有上传文件是否登录的限制的话,
//这个token可以不用获取,文件可以不引入,把上面对应的上传文件携带请求头  :headers="headers" è¿™ä¸ªä»£ç åˆ æŽ‰å³å¯
import { getToken } from "@/utils/auth";
const toolbarOptions = [
  ["bold", "italic", "underline", "strike"], // toggled buttons
  ["blockquote", "code-block"],
  [{ header: 1 }, { header: 2 }], // custom button values
  [{ list: "ordered" }, { list: "bullet" }],
  [{ script: "sub" }, { script: "super" }], // superscript/subscript
  [{ indent: "-1" }, { indent: "+1" }], // outdent/indent
  [{ direction: "rtl" }], // text direction
  [{ size: ["small", false, "large", "huge"] }], // custom dropdown
  [{ header: [1, 2, 3, 4, 5, 6, false] }],
  [{ color: [] }, { background: [] }], // dropdown with defaults from theme
  [{ font: [] }],
  [{ align: [] }],
  ["link", "image", "video"],
  ["clean"], // remove formatting button
];
export default {
  name: "NotificationManagement",
  components: { OptionalForm },
  data() {
    return {
      headers: {
        Authorization: "Bearer " + getToken(),
      },
      uploadImgUrl: process.env.VUE_APP_BASE_API + "/common/upload",
      uploadImgUrlword: process.env.VUE_APP_BASE_API + "/common/uploadShow",
      uploadUrlPath: "没有文件上传",
      quillUpdateImg: false,
      fileList: [
        {
          name: "food.jpeg",
          url: "https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100",
        },
        {
          name: "food2.jpeg",
          url: "https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100",
        },
      ],
      content: "", //最终保存的内容
      fileName: "", //文件名
      dynamicTags: [],
      inputVisible: false,
      illnessVisible: false,
      dialogVisiblepatient: false, //适用疾病窗口
      dialogVisiblepatient: false,
      inputValue: "",
      // å¯Œæ–‡æœ¬
      editorOption: {
        placeholder: "你想说什么?",
        modules: {
          imageResize: {
            displayStyles: {
              backgroundColor: "black",
              border: "none",
              color: "white",
            },
            modules: ["Resize", "DisplaySize", "Toolbar"],
          },
          toolbar: {
            container: toolbarOptions, // å·¥å…·æ 
            handlers: {
              image: function (value) {
                if (value) {
                  document
                    .querySelector("#quillEditorQiniu .avatar-uploader input")
                    .click();
                } else {
                  this.quill.format("image", false);
                }
              },
              video: function (value) {
                if (value) {
                  document
                    .querySelector("#quillEditorQiniu .avatar-uploader input")
                    .click();
                } else {
                  this.quill.format("video", false);
                }
              },
            },
          },
        },
      },
      sidecolumnrabs: "left", //方向
      Editprogress: 1, //编辑进度
      currentVersion: "1.2.3", //当前版本
      loading: false, // é®ç½©å±‚
      drawer: false, //控制展开
      radio: "false", //单选题选中
      radios: [], //多选题选中
      radioas: "", //填空题答案
      // æ€»æ¡æ•°
      sidecolumnrabs: "left",
      Editprogress: 1,
      currentVersion: "1.2.3",
      loading: false,
      drawer: false,
      radio: "false",
      radios: [],
      radioas: "",
      total: 1,
      hetype: "",
      id: null,
@@ -513,42 +286,24 @@
      deptList: [],
      tempDetpRelevanceslist: [],
      props: { multiple: true, value: "deptId", label: "deptName" },
      xjxsoptions: [
        {
          value: "1",
          label: "图文",
        },
        {
          value: "2",
          label: "视频",
        },
        {
          value: "3",
          label: "音频",
        },
      ],
      valssu: [
        {
          idd: 1,
          wssd: "你最近怎么样",
          sdadd: ["sss", "ssccss", "ssaas", "ss"],
        },
      ],
      addvalue: "添加题目",
      variablelist: [
        { variatename: "姓名", variate: "${name}", default: 1 },
        { variatename: "电话", variate: "${phone}", default: 1 },
        { variatename: "病情", variate: "${illness}", default: 1 },
      ],
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
        pageNum: 1,
        pageSize: 10,
      },
    };
  },
  activated() {
    if (this.id != this.$route.query.id) {
      this.gettabList();
      this.getList();
      this.illnessUpdate();
    }
  },
  created() {
    this.gettabList();
    this.getList();
@@ -559,18 +314,7 @@
    this.precedencetype = store.getters.precedencetype;
    this.courtyardlist = store.getters.courtyardlist;
  },
  watch: {
    content(newVal, oldVal) {
      //this.$emit('input', newVal);
      console.log(newVal, "A");
      console.log(oldVal, "B");
    },
  },
  methods: {
    processElement(element) {
      return { ...element, isoperation: null };
    },
    // èŽ·å–é¡µé¢æ•°æ®
    getList() {
      this.loading = true;
@@ -579,16 +323,13 @@
      if (this.id) {
        getlibraryinfo({ id: this.id }).then((res) => {
          this.ruleForm = res.data[0];
          this.ruleForm.campus = this.ruleForm.campus.split(",");
          if (this.ruleForm.campus)
            this.ruleForm.campus = this.ruleForm.campus.split(",");
          this.dynamicTags = res.data[0].heLibraryTagList.map(
            this.processElement
          );
          this.Getmissioncontent(this.ruleForm.richText);
          if (this.ruleForm.deptNames) {
            this.tempDetpRelevanceslist = JSON.parse(this.ruleForm.deptNames);
          }
          if (this.ruleForm.suitway) {
            this.ruleForm.suitway = this.ruleForm.suitway.split(",");
          }
          this.variablelist = this.ruleForm.otherdata
            ? JSON.parse(this.ruleForm.otherdata)
@@ -598,51 +339,46 @@
      // é€šçŸ¥åˆ†ç±»
      getheLibraryAssort({ hetype: 2 }).then((res) => {
        this.sortlist = res.rows;
        console.log(this.sortlist);
      });
      // éƒ¨é—¨
      listDept(this.queryParams).then((response) => {
        this.deptList = this.handleTree(response.data, "deptId");
      });
      this.loading = false;
    },
    processElement(element) {
      return { ...element, isoperation: null };
    },
    submitForm(formName) {
      let tgs = [];
      this.dynamicTags.forEach((item) => {
        tgs.push(item.tagname);
      });
      this.ruleForm.campus = this.ruleForm.campus.join(",");
      if (this.ruleForm.campus) {
        this.ruleForm.campus = this.ruleForm.campus.join(",");
      }
      this.ruleForm.labelInfo = tgs.length != 0 ? tgs.join(", ") : "";
      this.ruleForm.otherdata = JSON.stringify(this.variablelist);
      this.ruleForm.hetype = 2;
      console.log(22);
      this.ruleForm.suitway =
        this.ruleForm.suitway.length != 0
          ? this.ruleForm.suitway.join(",")
          : "";
      this.ruleForm.hetype = 2; // é€šçŸ¥ç±»åž‹
      addrichText({
        content: this.content,
        fileName: this.fileName ? this.fileName : "测试.html",
      }).then((res) => {
        this.ruleForm.richText = res.msg;
        if (this.id) {
          this.ruleForm.isoperation = 2;
          compilelibrary(this.ruleForm).then((res) => {
      if (this.id) {
        this.ruleForm.isoperation = 2;
        compilelibrary(this.ruleForm).then((res) => {
          if (res.code == 200) {
            this.$modal.msgSuccess("编辑成功");
            this.confirmillness();
            this.$router.go(-1);
          });
        } else {
          this.ruleForm.isoperation = 1;
          compilelibrary(this.ruleForm).then((res) => {
          }
        });
      } else {
        this.ruleForm.isoperation = 1;
        compilelibrary(this.ruleForm).then((res) => {
          if (res.code == 200) {
            this.$modal.msgSuccess("新增成功");
            this.confirmillness(res.data);
            this.$router.go(-1);
          });
        }
      });
          }
        });
      }
    },
    // ä¿å­˜ç–¾ç—…
    confirmillness(guid) {
@@ -650,7 +386,6 @@
        if (guid) {
          item.outid = guid;
        } else {
          console.log(this.ruleForm);
          item.outid = this.ruleForm.id;
        }
        item.icd10name = item.icdname;
@@ -662,20 +397,6 @@
      });
      this.illnessVisible = false;
      this.$modal.msgSuccess("编辑成功");
    },
    getFileNameFromPath(path) {
      const parts = path.split("/");
      return parts[parts.length - 1];
    },
    // ä¸‹ä¸€æ­¥
    nextstep() {
      if (this.Editprogress <= 1) {
        return this.Editprogress++;
      }
    },
    // ä¸Šä¸€æ­¥
    laststep() {
      this.Editprogress = this.Editprogress - 1;
    },
    // å…³é—­
    closeFm() {
@@ -707,7 +428,6 @@
        );
        if (!condition) {
          listDept({ deptId: item }).then((res) => {
            console.log("dept");
            res.data[0].type = 2;
            this.ruleForm.tempDetpRelevances.push(res.data[0]);
          });
@@ -724,12 +444,7 @@
      setTimeout(() => {
        this.submitForm();
      }, 1000);
      // this.submitForm();
    },
    // ä¿å­˜é¢˜ç›®ä¿¡æ¯
    Saveproblem() {},
    /** æŸ¥è¯¢é¢˜ç›®åˆ—表 */
    // æ–°å¢žå˜é‡
    addvariable() {
      this.variablelist.push({
@@ -741,16 +456,12 @@
    delvariable(item) {
      const index = this.variablelist.indexOf(item);
      if (index !== -1) {
        this.variablelist.splice(index, 1); // ä»Žç´¢å¼•位置删除一个元素
        this.variablelist.splice(index, 1);
      } else {
        console.log("未找到该对象");
      }
    },
    // æŽ§åˆ¶æ–‡ä»¶
    handleChange(file, fileList) {
      this.fileList = fileList.slice(-3);
    },
    // æ ‡ç­¾-----------------
    // æ ‡ç­¾ç›¸å…³æ–¹æ³•
    gettabList() {
      const tagqueryParams = {
        pageNum: 1,
@@ -762,11 +473,9 @@
      });
    },
    handleClosetag(tag) {
      console.log(tag);
      const lindex = this.ruleForm.heLibraryTagList.findIndex(
        (item) => item.tagname == tag.tagname
      );
      console.log(lindex);
      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
      this.ruleForm.heLibraryTagList[lindex].isoperation = 3;
    },
@@ -812,7 +521,7 @@
    showInput() {
      this.inputVisible = true;
    },
    // ç–¾ç—…-----------------------
    // ç–¾ç—…相关方法
    illnessUpdate() {
      if (this.id) {
        getillness({ outid: this.$route.query.id, type: 6 }).then((res) => {
@@ -823,9 +532,6 @@
        });
      }
    },
    // --------------------------
    // é¢„览模板
    PreviewTemplate() {
      this.drawer = true;
@@ -833,129 +539,12 @@
    resetForm(formName) {
      this.$refs[formName].resetFields();
    },
    //上传图片之前async
    beforeEditorUpload(res, file) {
      //显示上传动画
      this.quillUpdateImg = true;
      //  const res1 = await uploadImage()
      // console.log(res1,'=====');
      // this.$emit('before',res, file)
      console.log(res);
      console.log(file);
    },
    // ä¸Šä¼ å›¾ç‰‡æˆåŠŸ
    uploadEditorSuccess(res, file) {
      console.log("上传成功");
      // this.$emit('upload',res, file)
      console.log(res, file);
      //拼接出上传的图片在服务器的完整地址
      let imgUrl = res.url;
      let type = imgUrl.substring(imgUrl.lastIndexOf(".") + 1);
      console.log(type);
      // èŽ·å–å¯Œæ–‡æœ¬ç»„ä»¶å®žä¾‹
      let quill = this.$refs.customQuillEditor.quill;
      // èŽ·å–å…‰æ ‡æ‰€åœ¨ä½ç½®
      let length = quill.getSelection().index;
      // æ’入图片||视频  res.info为服务器返回的图片地址
      if (type == "mp4" || type == "MP4") {
        window.jsValue = imgUrl;
        quill.insertEmbed(length, "video", imgUrl);
      } else {
        quill.insertEmbed(length, "image", imgUrl);
      }
      // è°ƒæ•´å…‰æ ‡åˆ°æœ€åŽ
      quill.setSelection(length + 1);
      //取消上传动画
      this.quillUpdateImg = false;
    },
    // å¤±åŽ»ç„¦ç‚¹äº‹ä»¶
    onEditorBlur(e) {
      console.log("onEditorBlur: ", e);
    },
    // èŽ·å¾—ç„¦ç‚¹äº‹ä»¶
    onEditorFocus(e) {
      console.log("onEditorFocus: ", e);
    },
    // å†…容改变事件
    onEditorChange(e) {
      console.log("onEditorChange: ", e);
    },
    // ä¸Šä¼ (文件)图片失败
    uploadEditorError(res, file) {
      console.log(res, "word");
      console.log(file, "word");
      //页面提示
      this.$message.error("上传图片失败");
      //取消上传动画
      this.quillUpdateImg = false;
    },
    //上传组件返回的结果
    uploadResult: function (res) {
      this.uploadUrlPath = res;
    },
    // ä¸Šä¼ (文件)图片失败
    uploadEditorErrorword(res, file) {
      console.log(res);
      console.log(file);
      //页面提示
      this.$message.error("上传图片失败");
      //取消上传动画
      this.quillUpdateImg = false;
    },
    //上传图片之前async
    beforeEditorUploadword(res, file) {
      //显示上传动画
      this.quillUpdateImg = true;
      //  const res1 = await uploadImage()
      // console.log(res1,'=====');
      // this.$emit('before',res, file)
      console.log(res);
      console.log(file);
    },
    // ä¸Šä¼ å›¾ç‰‡æˆåŠŸ
    uploadEditorSuccessword(res, file) {
      console.log("上传成功");
      const data = null;
      console.log(res, file, "word");
      axios
        .get(res.url)
        .then((response) => {
          console.log(response.data, "数据"); // è¾“出获取到的文件内容
          this.content = response.data;
          this.texturl = res.url;
          this.fileName = this.getFileNameFromPath(res.url);
        })
        .catch((error) => {
          console.error("Failed to fetch file:", error);
        });
    },
    Getmissioncontent(url) {
      axios
        .get(url)
        .then((response) => {
          console.log(response.data, "数据"); // è¾“出获取到的文件内容
          this.content = response.data;
          this.fileName = this.getFileNameFromPath(res.url);
        })
        .catch((error) => {
          console.error("Failed to fetch file:", error);
        });
    },
  },
};
</script>
<style lang="scss" scoped>
.Questionnairemanagement {
  // display: flex;
}
.sidecolumn {
  // width: 300px;
  // min-height: 100vh;
  // text-align: center;
  //   display: flex;
  //   margin-top: 20px;
  margin: 20px;
  margin-bottom: 0;
  padding: 20px;
@@ -964,47 +553,34 @@
  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
    0 0 6px 0 rgba(0, 0, 0, 0.04);
}
.leftvlue {
  //   display: flex;
  //   flex: 1;
  margin: 20px;
  padding: 30px;
  background: #ffff;
  border: 1px solid #dcdfe6;
  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
    0 0 6px 0 rgba(0, 0, 0, 0.04);
  .mulsz {
    font-size: 20px;
  }
  .leftvlue-jbxx {
    margin-bottom: 50px;
    font-size: 20px;
    span {
      position: absolute;
      right: 80px;
    }
  }
  .demo-cascader {
    margin-right: 20px;
  }
  .PreviewTemplate {
    color: #02a7f0;
    cursor: pointer;
    font-size: 20px;
    margin: 0 20px;
    font-size: 24px;
    height: 30px;
    border-left: 3px solid #41a1be;
    padding-left: 3px;
  }
}
.xinz-inf {
  font-size: 18px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  line-height: 48px;
  .el-tag + .el-tag {
    margin-left: 10px;
  }
  .button-new-tag {
    margin-left: 10px;
    height: 32px;
@@ -1012,176 +588,41 @@
    padding-top: 0;
    padding-bottom: 0;
  }
  .input-new-tag {
    width: 90px;
    margin-left: 10px;
    vertical-align: bottom;
  }
}
.preview-left {
  margin: 20px;
  //   margin: 20px;
  padding: 30px;
  background: #ffff;
  border: 1px solid #dcdfe6;
  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
    0 0 6px 0 rgba(0, 0, 0, 0.04);
  .topic-dev {
    margin-bottom: 25px;
    font-size: 20px !important;
    .dev-text {
      margin-bottom: 10px;
    }
  }
}
.addtopic {
  margin-top: 30px;
}
.presentation {
  margin: 20px 0;
  display: flex;
  .presentation-left {
    width: 50%;
    height: 500px;
    .button-textxg {
      color: #024df0;
    }
    .button-textsc {
      color: #f52727;
    }
  }
  .presentation-right {
    width: 50%;
    height: 500px;
    padding: 20px;
    font-size: 18px;
    border: 1px solid #909091;
    span {
      padding: 0 35px;
      margin-right: 10px;
      border-bottom: 1px solid #909091;
    }
    .headline {
      font-size: 20px;
      border-left: 3px solid #41a1be;
      padding-left: 5px;
      margin: 15px 0;
    }
  }
}
::v-deep .addtopic-input {
  input {
    background: #02a7f0;
    color: #edf1f7;
    width: 150px;
  }
}
::v-deep.el-step.is-vertical .el-step__title {
::v-deep .el-step.is-vertical .el-step__title {
  font-size: 25px;
}
::v-deep.el-input--medium {
  font-size: 18px !important;
}
::v-deep.ruleFormaa.el-select {
  display: inline-block;
  position: relative;
  width: 700px;
}
.el-select__tags {
::v-deep.el-select__tags {
  font-size: 20px;
  max-width: 888px !important;
}
::v-deep.el-radio__inner {
  width: 22px;
  height: 22px;
}
// ::v-deep.topic-dev.el-radio__label {
//   font-size: 24px;
// }
::v-deep.el-radio-group {
  span {
    font-size: 24px;
  }
}
::v-deep.el-checkbox-group {
  span {
    font-size: 24px;
  }
}
.editor {
  line-height: normal !important;
  height: 600px;
  margin-bottom: 80px;
}
.ql-snow .ql-tooltip[data-mode="link"]::before {
  content: "请输入链接地址:";
}
.ql-snow .ql-tooltip.ql-editing a.ql-action::after {
  border-right: 0px;
  content: "保存";
  padding-right: 0px;
}
.ql-snow .ql-tooltip[data-mode="video"]::before {
  content: "请输入视频地址:";
}
.ql-snow .ql-picker.ql-size .ql-picker-label::before,
.ql-snow .ql-picker.ql-size .ql-picker-item::before {
  content: "14px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before {
  content: "10px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before {
  content: "18px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before {
  content: "32px";
}
.ql-snow .ql-picker.ql-header .ql-picker-label::before,
.ql-snow .ql-picker.ql-header .ql-picker-item::before {
  content: "文本";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
  content: "标题1";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
  content: "标题2";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
  content: "标题3";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
  content: "标题4";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
  content: "标题5";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
  content: "标题6";
}
.ql-snow .ql-picker.ql-font .ql-picker-label::before,
.ql-snow .ql-picker.ql-font .ql-picker-item::before {
  content: "标准字体";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before {
  content: "衬线字体";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before {
  content: "等宽字体";
}
</style>
src/views/shortmessage/healthinformation/index.vue
@@ -141,7 +141,6 @@
                  icon="el-icon-plus"
                  size="medium"
                  @click="handleAdd"
                  v-hasPermi="['system:user:add']"
                  >新增</el-button
                >
              </el-col>