소스 검색

交易市场平台(供应商)

wwh 2 달 전
부모
커밋
01ad6aed81

+ 1 - 0
baqing-admin/src/main/java/com/ruoyi/web/modules/diagnosis/service/impl/BizMedicalResourceServiceImpl.java

@@ -194,6 +194,7 @@ public class BizMedicalResourceServiceImpl implements IBizMedicalResourceService
194 194
         row.setAccountAssigned(MedicalResourceRules.ACCOUNT_ASSIGNED_YES);
195 195
         row.setSysUserId(user.getUserId());
196 196
         row.setAssignedLoginName(user.getUserName());
197
+        row.setUpdateBy(operator);
197 198
         return bizMedicalResourceMapper.updateBizMedicalResource(row);
198 199
     }
199 200
 

+ 17 - 1
baqing-admin/src/main/java/com/ruoyi/web/modules/diagnosis/support/MedicalResourceAccountAssigner.java

@@ -2,10 +2,12 @@ package com.ruoyi.web.modules.diagnosis.support;
2 2
 
3 3
 import org.springframework.beans.factory.annotation.Autowired;
4 4
 import org.springframework.stereotype.Component;
5
+import com.ruoyi.common.core.domain.entity.SysRole;
5 6
 import com.ruoyi.common.core.domain.entity.SysUser;
6 7
 import com.ruoyi.common.exception.ServiceException;
7 8
 import com.ruoyi.common.utils.SecurityUtils;
8 9
 import com.ruoyi.common.utils.StringUtils;
10
+import com.ruoyi.system.mapper.SysRoleMapper;
9 11
 import com.ruoyi.system.service.ISysConfigService;
10 12
 import com.ruoyi.system.service.ISysUserService;
11 13
 import com.ruoyi.web.modules.diagnosis.domain.BizMedicalResource;
@@ -22,6 +24,9 @@ public class MedicalResourceAccountAssigner
22 24
     @Autowired
23 25
     private ISysConfigService configService;
24 26
 
27
+    @Autowired
28
+    private SysRoleMapper sysRoleMapper;
29
+
25 30
     public SysUser createAccount(BizMedicalResource resource, String operator)
26 31
     {
27 32
         String loginName = MedicalResourceLoginNameGenerator.generate(
@@ -44,7 +49,7 @@ public class MedicalResourceAccountAssigner
44 49
         user.setPassword(SecurityUtils.encryptPassword(initPwd));
45 50
         user.setStatus("0");
46 51
         user.setCreateBy(operator);
47
-        user.setRoleIds(new Long[] { MedicalResourceRules.defaultRoleId(resource.getResourceType()) });
52
+        user.setRoleIds(new Long[] { resolveRoleId(resource.getResourceType()) });
48 53
         int rows = sysUserService.insertUser(user);
49 54
         if (rows <= 0 || user.getUserId() == null)
50 55
         {
@@ -67,4 +72,15 @@ public class MedicalResourceAccountAssigner
67 72
         }
68 73
         sysUserService.deleteUserById(resource.getSysUserId());
69 74
     }
75
+
76
+    private long resolveRoleId(String resourceType)
77
+    {
78
+        String roleKey = MedicalResourceRules.roleKeyForAssign(resourceType);
79
+        SysRole role = sysRoleMapper.checkRoleKeyUnique(roleKey);
80
+        if (role == null || role.getRoleId() == null)
81
+        {
82
+            throw new ServiceException(String.format(MedicalResourceRules.MSG_ROLE_NOT_FOUND, roleKey));
83
+        }
84
+        return role.getRoleId();
85
+    }
70 86
 }

+ 3 - 73
baqing-admin/src/main/java/com/ruoyi/web/modules/diagnosis/support/MedicalResourceLoginNameGenerator.java

@@ -1,88 +1,18 @@
1 1
 package com.ruoyi.web.modules.diagnosis.support;
2 2
 
3
-import net.sourceforge.pinyin4j.PinyinHelper;
4
-import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
5
-import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
6
-import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
7
-import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
8
-import com.ruoyi.common.utils.StringUtils;
3
+import com.ruoyi.web.modules.trading.support.TradingPartnerLoginNameGenerator;
9 4
 
10 5
 /**
11
- * 分配账号默认登录名:展示名称汉语拼音(小写、无空格)+ 资源 id。
6
+ * 分配账号默认登录名:兽医姓名/机构名称汉字拼音首字母(小写)+ 资源 id。
12 7
  */
13 8
 public final class MedicalResourceLoginNameGenerator
14 9
 {
15
-    private static final HanyuPinyinOutputFormat FORMAT = new HanyuPinyinOutputFormat();
16
-
17
-    static
18
-    {
19
-        FORMAT.setCaseType(HanyuPinyinCaseType.LOWERCASE);
20
-        FORMAT.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
21
-        FORMAT.setVCharType(HanyuPinyinVCharType.WITH_V);
22
-    }
23
-
24 10
     private MedicalResourceLoginNameGenerator()
25 11
     {
26 12
     }
27 13
 
28 14
     public static String generate(String resourceName, Long id)
29 15
     {
30
-        if (id == null)
31
-        {
32
-            throw new IllegalArgumentException("id is required");
33
-        }
34
-        String base = toPinyinBase(StringUtils.nvl(resourceName, ""));
35
-        if (base.isEmpty())
36
-        {
37
-            base = "user";
38
-        }
39
-        return base + id;
40
-    }
41
-
42
-    static String toPinyinBase(String text)
43
-    {
44
-        if (StringUtils.isEmpty(text))
45
-        {
46
-            return "";
47
-        }
48
-        String trimmed = text.trim().replaceAll("\\s+", "");
49
-        StringBuilder sb = new StringBuilder();
50
-        for (int i = 0; i < trimmed.length(); i++)
51
-        {
52
-            char c = trimmed.charAt(i);
53
-            if (c <= 127 && Character.isLetterOrDigit(c))
54
-            {
55
-                sb.append(Character.toLowerCase(c));
56
-            }
57
-            else if (isChinese(c))
58
-            {
59
-                appendPinyin(sb, c);
60
-            }
61
-        }
62
-        return sb.toString();
63
-    }
64
-
65
-    private static void appendPinyin(StringBuilder sb, char c)
66
-    {
67
-        try
68
-        {
69
-            String[] arr = PinyinHelper.toHanyuPinyinStringArray(c, FORMAT);
70
-            if (arr != null && arr.length > 0 && StringUtils.isNotEmpty(arr[0]))
71
-            {
72
-                sb.append(arr[0]);
73
-            }
74
-        }
75
-        catch (Exception ex)
76
-        {
77
-            // skip unmapped char
78
-        }
79
-    }
80
-
81
-    private static boolean isChinese(char c)
82
-    {
83
-        Character.UnicodeBlock block = Character.UnicodeBlock.of(c);
84
-        return block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
85
-                || block == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
86
-                || block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A;
16
+        return TradingPartnerLoginNameGenerator.generate(resourceName, id);
87 17
     }
88 18
 }

+ 17 - 3
baqing-admin/src/main/java/com/ruoyi/web/modules/diagnosis/support/MedicalResourceRules.java

@@ -40,8 +40,22 @@ public final class MedicalResourceRules
40 40
 
41 41
     public static final String DEL_FLAG_DELETED = "2";
42 42
 
43
+    /** 兽医人员平台角色权限字符(sys_role.role_key) */
44
+    public static final String ROLE_KEY_VET = "vet";
45
+
46
+    /** 诊疗机构平台角色权限字符(sys_role.role_key) */
47
+    public static final String ROLE_KEY_INS = "ins";
48
+
49
+    public static final String MSG_ROLE_NOT_FOUND = "未配置权限字符为「%s」的角色,无法分配账号";
50
+
51
+    /**
52
+     * 历史常量;分配账号请使用 {@link #ROLE_KEY_VET} 解析角色。
53
+     */
43 54
     public static final long ROLE_ID_VET = 100L;
44 55
 
56
+    /**
57
+     * 历史常量;分配账号请使用 {@link #ROLE_KEY_INS} 解析角色。
58
+     */
45 59
     public static final long ROLE_ID_ORG = 102L;
46 60
 
47 61
     public static final int MIN_NAME_LEN = 1;
@@ -128,15 +142,15 @@ public final class MedicalResourceRules
128 142
         return lower.endsWith(".jpg") || lower.endsWith(".jpeg") || lower.endsWith(".png");
129 143
     }
130 144
 
131
-    public static long defaultRoleId(String resourceType)
145
+    public static String roleKeyForAssign(String resourceType)
132 146
     {
133 147
         if (RESOURCE_TYPE_VET.equals(resourceType))
134 148
         {
135
-            return ROLE_ID_VET;
149
+            return ROLE_KEY_VET;
136 150
         }
137 151
         if (RESOURCE_TYPE_ORG.equals(resourceType))
138 152
         {
139
-            return ROLE_ID_ORG;
153
+            return ROLE_KEY_INS;
140 154
         }
141 155
         throw new IllegalArgumentException("resourceType cannot assign account");
142 156
     }

+ 18 - 0
baqing-admin/src/test/java/com/ruoyi/web/modules/diagnosis/MedicalResourceTestSamples.java

@@ -65,4 +65,22 @@ public final class MedicalResourceTestSamples
65 65
         row.setPublishTime(new java.util.Date());
66 66
         return row;
67 67
     }
68
+
69
+    public static BizMedicalResource sampleOrgDraft()
70
+    {
71
+        BizMedicalResource row = new BizMedicalResource();
72
+        row.setResourceType(MedicalResourceRules.RESOURCE_TYPE_ORG);
73
+        row.setResourceName("巴青动物医院");
74
+        row.setPhotoFileUrl(PHOTO_URL);
75
+        row.setPhotoFilePath(PHOTO_PATH);
76
+        row.setIntroduction("机构简介");
77
+        row.setContactPhone("13800138002");
78
+        row.setAffiliatedUnit("巴青县畜牧局");
79
+        row.setDetailAddress("中心街10号");
80
+        row.setOrgLevel(MedicalResourceRules.ORG_LEVEL_CLINIC);
81
+        row.setMaxDailyAppointments(50);
82
+        row.setPublishStatus(MedicalResourceRules.PUBLISH_STATUS_DRAFT);
83
+        row.setAccountAssigned(MedicalResourceRules.ACCOUNT_ASSIGNED_NO);
84
+        return row;
85
+    }
68 86
 }

+ 95 - 0
baqing-admin/src/test/java/com/ruoyi/web/modules/diagnosis/support/MedicalResourceAccountAssignerTest.java

@@ -0,0 +1,95 @@
1
+package com.ruoyi.web.modules.diagnosis.support;
2
+
3
+import static org.junit.jupiter.api.Assertions.assertEquals;
4
+import static org.junit.jupiter.api.Assertions.assertThrows;
5
+import static org.mockito.ArgumentMatchers.any;
6
+import static org.mockito.Mockito.verify;
7
+import static org.mockito.Mockito.when;
8
+
9
+import com.ruoyi.common.core.domain.entity.SysRole;
10
+import com.ruoyi.common.core.domain.entity.SysUser;
11
+import com.ruoyi.common.exception.ServiceException;
12
+import com.ruoyi.system.mapper.SysRoleMapper;
13
+import com.ruoyi.system.service.ISysConfigService;
14
+import com.ruoyi.system.service.ISysUserService;
15
+import com.ruoyi.web.modules.diagnosis.MedicalResourceTestSamples;
16
+import com.ruoyi.web.modules.diagnosis.domain.BizMedicalResource;
17
+import org.junit.jupiter.api.DisplayName;
18
+import org.junit.jupiter.api.Test;
19
+import org.junit.jupiter.api.extension.ExtendWith;
20
+import org.mockito.InjectMocks;
21
+import org.mockito.Mock;
22
+import org.mockito.junit.jupiter.MockitoExtension;
23
+
24
+@ExtendWith(MockitoExtension.class)
25
+@DisplayName("MedicalResourceAccountAssigner")
26
+class MedicalResourceAccountAssignerTest
27
+{
28
+    @Mock
29
+    private ISysUserService sysUserService;
30
+
31
+    @Mock
32
+    private ISysConfigService configService;
33
+
34
+    @Mock
35
+    private SysRoleMapper sysRoleMapper;
36
+
37
+    @InjectMocks
38
+    private MedicalResourceAccountAssigner assigner;
39
+
40
+    @Test
41
+    @DisplayName("兽医绑定 vet 角色")
42
+    void createAccountVet()
43
+    {
44
+        BizMedicalResource resource = MedicalResourceTestSamples.sampleVetDraft();
45
+        resource.setId(12L);
46
+        resource.setResourceName("张兽医");
47
+        SysRole role = new SysRole();
48
+        role.setRoleId(100L);
49
+        when(sysRoleMapper.checkRoleKeyUnique(MedicalResourceRules.ROLE_KEY_VET)).thenReturn(role);
50
+        when(sysUserService.checkUserNameUnique(any())).thenReturn(true);
51
+        when(configService.selectConfigByKey("sys.user.initPassword")).thenReturn("123456");
52
+        when(sysUserService.insertUser(any())).thenAnswer(inv -> {
53
+            SysUser u = inv.getArgument(0);
54
+            u.setUserId(1L);
55
+            return 1;
56
+        });
57
+
58
+        SysUser user = assigner.createAccount(resource, "admin");
59
+        assertEquals("zsy12", user.getUserName());
60
+        verify(sysRoleMapper).checkRoleKeyUnique(MedicalResourceRules.ROLE_KEY_VET);
61
+    }
62
+
63
+    @Test
64
+    @DisplayName("机构绑定 ins 角色")
65
+    void createAccountOrg()
66
+    {
67
+        BizMedicalResource resource = MedicalResourceTestSamples.sampleOrgDraft();
68
+        resource.setId(8L);
69
+        resource.setResourceName("巴青县动物医院");
70
+        SysRole role = new SysRole();
71
+        role.setRoleId(102L);
72
+        when(sysRoleMapper.checkRoleKeyUnique(MedicalResourceRules.ROLE_KEY_INS)).thenReturn(role);
73
+        when(sysUserService.checkUserNameUnique(any())).thenReturn(true);
74
+        when(configService.selectConfigByKey("sys.user.initPassword")).thenReturn("123456");
75
+        when(sysUserService.insertUser(any())).thenAnswer(inv -> {
76
+            SysUser u = inv.getArgument(0);
77
+            u.setUserId(2L);
78
+            return 1;
79
+        });
80
+
81
+        assigner.createAccount(resource, "admin");
82
+        verify(sysRoleMapper).checkRoleKeyUnique(MedicalResourceRules.ROLE_KEY_INS);
83
+    }
84
+
85
+    @Test
86
+    @DisplayName("角色不存在")
87
+    void roleMissing()
88
+    {
89
+        BizMedicalResource resource = MedicalResourceTestSamples.sampleVetDraft();
90
+        resource.setId(1L);
91
+        when(sysUserService.checkUserNameUnique(any())).thenReturn(true);
92
+        when(sysRoleMapper.checkRoleKeyUnique(MedicalResourceRules.ROLE_KEY_VET)).thenReturn(null);
93
+        assertThrows(ServiceException.class, () -> assigner.createAccount(resource, "admin"));
94
+    }
95
+}

+ 2 - 4
baqing-admin/src/test/java/com/ruoyi/web/modules/diagnosis/support/MedicalResourceLoginNameGeneratorTest.java

@@ -11,12 +11,10 @@ class MedicalResourceLoginNameGeneratorTest
11 11
 {
12 12
 
13 13
     @Test
14
-    @DisplayName("拼音+id")
14
+    @DisplayName("拼音首字母+id")
15 15
     void generate()
16 16
     {
17
-        String login = MedicalResourceLoginNameGenerator.generate("张兽医", 12L);
18
-        assertTrue(login.endsWith("12"));
19
-        assertTrue(login.length() > 2);
17
+        assertEquals("zsy12", MedicalResourceLoginNameGenerator.generate("张兽医", 12L));
20 18
     }
21 19
 
22 20
     @Test

+ 7 - 5
baqing-admin/src/test/java/com/ruoyi/web/modules/diagnosis/support/MedicalResourceRulesTest.java

@@ -11,12 +11,14 @@ class MedicalResourceRulesTest
11 11
 {
12 12
 
13 13
     @Test
14
-    @DisplayName("分配账号默认角色 100/102")
15
-    void defaultRoleId()
14
+    @DisplayName("分配账号角色权限字符")
15
+    void roleKeyForAssign()
16 16
     {
17
-        assertEquals(100L, MedicalResourceRules.defaultRoleId(MedicalResourceRules.RESOURCE_TYPE_VET));
18
-        assertEquals(102L, MedicalResourceRules.defaultRoleId(MedicalResourceRules.RESOURCE_TYPE_ORG));
17
+        assertEquals(MedicalResourceRules.ROLE_KEY_VET,
18
+                MedicalResourceRules.roleKeyForAssign(MedicalResourceRules.RESOURCE_TYPE_VET));
19
+        assertEquals(MedicalResourceRules.ROLE_KEY_INS,
20
+                MedicalResourceRules.roleKeyForAssign(MedicalResourceRules.RESOURCE_TYPE_ORG));
19 21
         assertThrows(IllegalArgumentException.class,
20
-                () -> MedicalResourceRules.defaultRoleId(MedicalResourceRules.RESOURCE_TYPE_TEAM));
22
+                () -> MedicalResourceRules.roleKeyForAssign(MedicalResourceRules.RESOURCE_TYPE_TEAM));
21 23
     }
22 24
 }

+ 1 - 1
doc/牧业疫病诊疗服务/畜牧医疗资源管理/畜牧医疗资源管理功能需求-草稿.md

@@ -12,7 +12,7 @@
12 12
 8. 发布后不允许编辑、删除;下架后可以再次编辑、删除。
13 13
 9. 支持查看对应资源类型的表单数据。
14 14
 10. 支持逻辑删除对应资源类型的兽医资源;如该兽医资源已分配账号,同时删除账号。
15
-11. 兽医人员库、诊疗机构库列表有“分配账号”操作,账号名称默认为兽医姓名、机构名称的拼音+该条记录的数据库Id,角色分别默认为编号为100、102对应的角色;分配账号只允许操作一次。
15
+11. 兽医人员库、诊疗机构库列表有“分配账号”操作,账号名称默认为兽医姓名、机构名称的拼音+该条记录的数据库Id,角色分别默认为权限字符为vet、ins对应的角色;分配账号只允许操作一次。
16 16
 12. 诊疗机构库、医疗设备库列表有“地图标点”操作。
17 17
 13. 地图标点:暂不实现。
18 18
 14. 异常返回:统一格式 code、msg、data。