Explorar o código

交易市场平台(供应商)

wwh hai 2 semanas
pai
achega
21910dbed9

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

@@ -208,6 +208,7 @@ public class BizTechResourceServiceImpl implements IBizTechResourceService
208 208
         row.setAccountAssigned(TechResourceRules.ACCOUNT_ASSIGNED_YES);
209 209
         row.setSysUserId(user.getUserId());
210 210
         row.setAssignedLoginName(user.getUserName());
211
+        row.setUpdateBy(operator);
211 212
         return bizTechResourceMapper.updateBizTechResource(row);
212 213
     }
213 214
 

+ 18 - 2
baqing-admin/src/main/java/com/ruoyi/web/modules/farming/support/TechResourceAccountAssigner.java

@@ -2,16 +2,18 @@ package com.ruoyi.web.modules.farming.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.farming.domain.BizTechResource;
12 14
 
13 15
 /**
14
- * 为专家资源创建平台账号。
16
+ * 为专家资源创建平台账号并绑定角色
15 17
  */
16 18
 @Component
17 19
 public class TechResourceAccountAssigner
@@ -22,6 +24,9 @@ public class TechResourceAccountAssigner
22 24
     @Autowired
23 25
     private ISysConfigService configService;
24 26
 
27
+    @Autowired
28
+    private SysRoleMapper sysRoleMapper;
29
+
25 30
     public SysUser createAccount(BizTechResource resource, String operator)
26 31
     {
27 32
         String loginName = TechResourceLoginNameGenerator.generate(
@@ -44,7 +49,7 @@ public class TechResourceAccountAssigner
44 49
         user.setPassword(SecurityUtils.encryptPassword(initPwd));
45 50
         user.setStatus("0");
46 51
         user.setCreateBy(operator);
47
-        user.setRoleIds(new Long[] { TechResourceRules.ROLE_ID_EXPERT });
52
+        user.setRoleIds(new Long[] { resolveRoleId() });
48 53
         int rows = sysUserService.insertUser(user);
49 54
         if (rows <= 0 || user.getUserId() == null)
50 55
         {
@@ -67,4 +72,15 @@ public class TechResourceAccountAssigner
67 72
         }
68 73
         sysUserService.deleteUserById(resource.getSysUserId());
69 74
     }
75
+
76
+    private long resolveRoleId()
77
+    {
78
+        SysRole role = sysRoleMapper.checkRoleKeyUnique(TechResourceRules.ROLE_KEY_EXPERT);
79
+        if (role == null || role.getRoleId() == null)
80
+        {
81
+            throw new ServiceException(String.format(TechResourceRules.MSG_ROLE_NOT_FOUND,
82
+                    TechResourceRules.ROLE_KEY_EXPERT));
83
+        }
84
+        return role.getRoleId();
85
+    }
70 86
 }

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

@@ -1,88 +1,18 @@
1 1
 package com.ruoyi.web.modules.farming.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 TechResourceLoginNameGenerator
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 TechResourceLoginNameGenerator()
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
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
 }

+ 8 - 0
baqing-admin/src/main/java/com/ruoyi/web/modules/farming/support/TechResourceRules.java

@@ -50,6 +50,14 @@ public final class TechResourceRules
50 50
 
51 51
     public static final String DEL_FLAG_DELETED = "2";
52 52
 
53
+    /** 专家平台角色权限字符(sys_role.role_key) */
54
+    public static final String ROLE_KEY_EXPERT = "exp";
55
+
56
+    public static final String MSG_ROLE_NOT_FOUND = "未配置权限字符为「%s」的角色,无法分配账号";
57
+
58
+    /**
59
+     * 历史常量;分配账号请使用 {@link #ROLE_KEY_EXPERT} 解析角色。
60
+     */
53 61
     public static final long ROLE_ID_EXPERT = 101L;
54 62
 
55 63
     public static final int MIN_NAME_LEN = 1;

+ 1 - 1
baqing-admin/src/test/java/com/ruoyi/web/modules/farming/service/impl/BizTechResourceServiceImplTest.java

@@ -145,7 +145,7 @@ class BizTechResourceServiceImplTest
145 145
         when(mapper.selectBizTechResourceById(1L)).thenReturn(db);
146 146
         SysUser user = new SysUser();
147 147
         user.setUserId(100L);
148
-        user.setUserName("zhangzhuanjia1");
148
+        user.setUserName("zzj1");
149 149
         when(accountAssigner.createAccount(any(), any())).thenReturn(user);
150 150
         when(mapper.updateBizTechResource(any())).thenReturn(1);
151 151
         assertEquals(1, service.assignAccount(1L, "admin"));

+ 73 - 0
baqing-admin/src/test/java/com/ruoyi/web/modules/farming/support/TechResourceAccountAssignerTest.java

@@ -0,0 +1,73 @@
1
+package com.ruoyi.web.modules.farming.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.farming.TechResourceTestSamples;
16
+import com.ruoyi.web.modules.farming.domain.BizTechResource;
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("TechResourceAccountAssigner")
26
+class TechResourceAccountAssignerTest
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 TechResourceAccountAssigner assigner;
39
+
40
+    @Test
41
+    @DisplayName("专家绑定 exp 角色")
42
+    void createAccountExpert()
43
+    {
44
+        BizTechResource resource = TechResourceTestSamples.sampleExpertDraft();
45
+        resource.setId(12L);
46
+        resource.setResourceName("张专家");
47
+        SysRole role = new SysRole();
48
+        role.setRoleId(101L);
49
+        when(sysRoleMapper.checkRoleKeyUnique(TechResourceRules.ROLE_KEY_EXPERT)).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("zzj12", user.getUserName());
60
+        verify(sysRoleMapper).checkRoleKeyUnique(TechResourceRules.ROLE_KEY_EXPERT);
61
+    }
62
+
63
+    @Test
64
+    @DisplayName("角色不存在")
65
+    void roleMissing()
66
+    {
67
+        BizTechResource resource = TechResourceTestSamples.sampleExpertDraft();
68
+        resource.setId(1L);
69
+        when(sysUserService.checkUserNameUnique(any())).thenReturn(true);
70
+        when(sysRoleMapper.checkRoleKeyUnique(TechResourceRules.ROLE_KEY_EXPERT)).thenReturn(null);
71
+        assertThrows(ServiceException.class, () -> assigner.createAccount(resource, "admin"));
72
+    }
73
+}

+ 3 - 4
baqing-admin/src/test/java/com/ruoyi/web/modules/farming/support/TechResourceLoginNameGeneratorTest.java

@@ -1,6 +1,6 @@
1 1
 package com.ruoyi.web.modules.farming.support;
2 2
 
3
-import static org.junit.jupiter.api.Assertions.assertTrue;
3
+import static org.junit.jupiter.api.Assertions.assertEquals;
4 4
 
5 5
 import org.junit.jupiter.api.DisplayName;
6 6
 import org.junit.jupiter.api.Test;
@@ -10,10 +10,9 @@ class TechResourceLoginNameGeneratorTest
10 10
 {
11 11
 
12 12
     @Test
13
-    @DisplayName("拼音+id")
13
+    @DisplayName("拼音首字母+id")
14 14
     void generate()
15 15
     {
16
-        String login = TechResourceLoginNameGenerator.generate("张专家", 12L);
17
-        assertTrue(login.endsWith("12"));
16
+        assertEquals("zzj12", TechResourceLoginNameGenerator.generate("张专家", 12L));
18 17
     }
19 18
 }

+ 5 - 3
baqing-admin/src/test/java/com/ruoyi/web/modules/farming/support/TechResourceRulesTest.java

@@ -1,6 +1,7 @@
1 1
 package com.ruoyi.web.modules.farming.support;
2 2
 
3 3
 import static org.junit.jupiter.api.Assertions.assertEquals;
4
+import static org.junit.jupiter.api.Assertions.assertFalse;
4 5
 
5 6
 import org.junit.jupiter.api.DisplayName;
6 7
 import org.junit.jupiter.api.Test;
@@ -10,9 +11,10 @@ class TechResourceRulesTest
10 11
 {
11 12
 
12 13
     @Test
13
-    @DisplayName("专家分配账号默认角色 101")
14
-    void expertRoleId()
14
+    @DisplayName("专家分配账号角色权限字符")
15
+    void expertRoleKey()
15 16
     {
16
-        assertEquals(101L, TechResourceRules.ROLE_ID_EXPERT);
17
+        assertEquals("exp", TechResourceRules.ROLE_KEY_EXPERT);
18
+        assertFalse(TechResourceRules.canAssignAccount(TechResourceRules.RESOURCE_TYPE_ACHIEVEMENT));
17 19
     }
18 20
 }

+ 9 - 0
baqing-admin/src/test/java/com/ruoyi/web/modules/farming/support/TechResourceValidationTest.java

@@ -77,4 +77,13 @@ class TechResourceValidationTest
77 77
         achievement.setId(1L);
78 78
         assertThrows(ServiceException.class, () -> TechResourceValidation.validateForAssignAccount(achievement));
79 79
     }
80
+
81
+    @Test
82
+    @DisplayName("已分配不可重复")
83
+    void assignAccountAlready()
84
+    {
85
+        BizTechResource expert = TechResourceTestSamples.sampleExpertDraft();
86
+        expert.setAccountAssigned(TechResourceRules.ACCOUNT_ASSIGNED_YES);
87
+        assertThrows(ServiceException.class, () -> TechResourceValidation.validateForAssignAccount(expert));
88
+    }
80 89
 }

+ 1 - 1
doc/牧业养殖科技服务/畜牧科技资源管理/畜牧科技资源管理功能需求-草稿.md

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