SupplyManageController.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. package com.etotem.cfc.controller.admin;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  4. import com.etotem.cfc.common.Result;
  5. import com.etotem.cfc.entity.User;
  6. import com.etotem.cfc.mapper.UserMapper;
  7. import com.etotem.cfc.service.UserService;
  8. import com.etotem.cfc.service.RealNameBackfillService;
  9. import org.springframework.web.bind.annotation.*;
  10. import javax.annotation.Resource;
  11. import java.util.Date;
  12. import java.util.HashMap;
  13. import java.util.Map;
  14. import com.etotem.cfc.util.SortUtil;
  15. /**
  16. * 供应商管理控制器 - 供应商管理员角色专用
  17. * 管理供应商用户、商品发布、服务商层级调整
  18. */
  19. @RestController
  20. @RequestMapping("/api/admin/supply-manage")
  21. public class SupplyManageController {
  22. @Resource
  23. private UserMapper userMapper;
  24. @Resource
  25. private UserService userService;
  26. @Resource
  27. private RealNameBackfillService realNameBackfillService;
  28. /**
  29. * 供应商列表(分页+搜索)
  30. * 查询拥有 supplier_admin 角色的用户
  31. */
  32. @PostMapping("/list")
  33. public Result<Map<String, Object>> list(@RequestBody Map<String, Object> params) {
  34. int page = params.get("page") != null ? ((Number) params.get("page")).intValue() : 1;
  35. int size = params.get("size") != null ? ((Number) params.get("size")).intValue() : 20;
  36. String keyword = (String) params.get("keyword");
  37. String vendorStatus = (String) params.get("vendorStatus");
  38. Page<User> pageParam = new Page<>(page, size);
  39. LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>();
  40. // 搜索条件:手机号、昵称、真实姓名
  41. if (keyword != null && !keyword.isEmpty()) {
  42. wrapper.and(w -> w.like(User::getPhone, keyword)
  43. .or().like(User::getNickname, keyword)
  44. .or().like(User::getRealName, keyword));
  45. }
  46. // 服务商状态筛选
  47. if (vendorStatus != null && !vendorStatus.isEmpty()) {
  48. wrapper.eq(User::getVendorStatus, vendorStatus);
  49. }
  50. wrapper.orderByDesc(User::getUpdatedAt);
  51. SortUtil.applySort(wrapper);
  52. Page<User> result = userMapper.selectPage(pageParam, wrapper);
  53. Map<String, Object> data = new HashMap<>();
  54. data.put("list", result.getRecords());
  55. data.put("total", result.getTotal());
  56. data.put("page", page);
  57. data.put("size", size);
  58. return Result.success(data);
  59. }
  60. /**
  61. * 获取供应商详情
  62. */
  63. @PostMapping("/detail")
  64. public Result<User> detail(@RequestBody Map<String, Object> params) {
  65. Object rawId = params.get("id");
  66. Long id = null;
  67. if (rawId instanceof Number) {
  68. id = ((Number) rawId).longValue();
  69. } else if (rawId instanceof String) {
  70. try { id = Long.parseLong((String) rawId); } catch (NumberFormatException ignored) {}
  71. }
  72. if (id == null) {
  73. return Result.error("id不能为空");
  74. }
  75. User user = userMapper.selectById(id);
  76. if (user == null) {
  77. return Result.error("供应商不存在");
  78. }
  79. user.setPassword(null);
  80. return Result.success(user);
  81. }
  82. /**
  83. * 创建供应商
  84. */
  85. @PostMapping("/create")
  86. public Result<User> create(@RequestBody Map<String, Object> params) {
  87. String phone = (String) params.get("phone");
  88. String nickname = (String) params.get("nickname");
  89. String realName = (String) params.get("realName");
  90. String vendorType = (String) params.get("vendorType");
  91. if (phone == null || phone.isEmpty()) {
  92. return Result.error("手机号不能为空");
  93. }
  94. // 检查手机号是否已存在
  95. User existing = userMapper.selectOne(new LambdaQueryWrapper<User>()
  96. .eq(User::getPhone, phone));
  97. if (existing != null) {
  98. return Result.error("手机号已存在");
  99. }
  100. User user = new User();
  101. user.setPhone(phone);
  102. user.setNickname(nickname != null ? nickname : "供应商" + phone.substring(7));
  103. user.setRealName(realName);
  104. user.setRole("supplier_admin");
  105. // B-1/B-2:roles 数组写入供应商角色(遗留角色 supplier_admin 由 AdminRoles.normalize 归一化为 supplier)
  106. user.setRoles(java.util.Arrays.asList("supplier_admin", "supplier"));
  107. user.setVendorStatus("approved"); // 默认通过审核
  108. String effectiveVendorType = (vendorType != null && !vendorType.isEmpty()) ? vendorType : "product_supplier";
  109. user.setVendorType(effectiveVendorType);
  110. if ("activity_provider".equals(effectiveVendorType)) {
  111. user.setActivityProviderStatus("approved");
  112. }
  113. user.setCreatedAt(new Date());
  114. user.setUpdatedAt(new Date());
  115. userMapper.insert(user);
  116. // 供应商创建:若提供了 realName 且 realName 尚未填写,同时回填 realName + nickname(nickname 仅空时补)
  117. if (realName != null && !realName.trim().isEmpty()) {
  118. realNameBackfillService.backfillRealNameAndNickname(user.getId(), realName.trim());
  119. }
  120. user.setPassword(null);
  121. return Result.success(user);
  122. }
  123. /**
  124. * 更新供应商信息
  125. */
  126. @PostMapping("/update")
  127. public Result<Boolean> update(@RequestBody Map<String, Object> params) {
  128. Long id = params.get("id") != null ? ((Number) params.get("id")).longValue() : null;
  129. if (id == null) {
  130. return Result.error("id不能为空");
  131. }
  132. User user = userMapper.selectById(id);
  133. if (user == null) {
  134. return Result.error("供应商不存在");
  135. }
  136. if (params.containsKey("nickname")) {
  137. user.setNickname((String) params.get("nickname"));
  138. }
  139. if (params.containsKey("realName")) {
  140. String realName = (String) params.get("realName");
  141. if (realName != null && !realName.trim().isEmpty()) {
  142. // 供应商更新:若 realName 尚未填写,同时回填 realName + nickname(nickname 仅空时补)
  143. realNameBackfillService.backfillRealNameAndNickname(id, realName.trim());
  144. // 同步内存:helper 可能补写了 nickname,保证外层 updateById 不覆盖
  145. if (user.getNickname() == null || user.getNickname().trim().isEmpty()) {
  146. user.setNickname(realName.trim());
  147. }
  148. }
  149. user.setRealName(realName);
  150. }
  151. if (params.containsKey("vendorType")) {
  152. user.setVendorType((String) params.get("vendorType"));
  153. if ("activity_provider".equals(user.getVendorType())) {
  154. user.setActivityProviderStatus("approved");
  155. } else if ("planner".equals(user.getVendorType()) || "product_supplier".equals(user.getVendorType())) {
  156. user.setActivityProviderStatus(null);
  157. }
  158. }
  159. if (params.containsKey("vendorStatus")) {
  160. user.setVendorStatus((String) params.get("vendorStatus"));
  161. }
  162. if (params.containsKey("activityProviderStatus")) {
  163. user.setActivityProviderStatus((String) params.get("activityProviderStatus"));
  164. }
  165. if (params.containsKey("vendorInfo")) {
  166. user.setVendorInfo((String) params.get("vendorInfo"));
  167. }
  168. user.setUpdatedAt(new Date());
  169. userMapper.updateById(user);
  170. return Result.success(true);
  171. }
  172. /**
  173. * 删除供应商
  174. */
  175. @PostMapping("/delete")
  176. public Result<Boolean> delete(@RequestBody Map<String, Object> params) {
  177. Long id = params.get("id") != null ? ((Number) params.get("id")).longValue() : null;
  178. if (id == null) {
  179. return Result.error("id不能为空");
  180. }
  181. User user = userMapper.selectById(id);
  182. if (user == null) {
  183. return Result.error("供应商不存在");
  184. }
  185. userMapper.deleteById(id);
  186. return Result.success(true);
  187. }
  188. /**
  189. * 添加供应商管理员角色到现有用户
  190. */
  191. @PostMapping("/add-role")
  192. public Result<Boolean> addRole(@RequestBody Map<String, Object> params) {
  193. Long userId = params.get("userId") != null ? ((Number) params.get("userId")).longValue() : null;
  194. if (userId == null) {
  195. return Result.error("userId不能为空");
  196. }
  197. boolean added = userService.addRole(userId, "supplier_admin");
  198. return added ? Result.success(true) : Result.error("添加角色失败");
  199. }
  200. /**
  201. * 移除供应商管理员角色
  202. */
  203. @PostMapping("/remove-role")
  204. public Result<Boolean> removeRole(@RequestBody Map<String, Object> params) {
  205. Long userId = params.get("userId") != null ? ((Number) params.get("userId")).longValue() : null;
  206. if (userId == null) {
  207. return Result.error("userId不能为空");
  208. }
  209. User user = userMapper.selectById(userId);
  210. if (user == null) {
  211. return Result.error("用户不存在");
  212. }
  213. // 移除 supplier_admin 角色
  214. if (user.getRoles() != null && user.getRoles().contains("supplier_admin")) {
  215. java.util.List<String> roles = user.getRoles();
  216. roles.remove("supplier_admin");
  217. user.setRoles(roles);
  218. user.setUpdatedAt(new Date());
  219. userMapper.updateById(user);
  220. }
  221. return Result.success(true);
  222. }
  223. /**
  224. * 调整服务商层级
  225. * vendorType: planner / activity_provider / product_supplier
  226. */
  227. @PostMapping("/adjust-tier")
  228. public Result<Boolean> adjustTier(@RequestBody Map<String, Object> params) {
  229. Long userId = params.get("userId") != null ? ((Number) params.get("userId")).longValue() : null;
  230. String vendorType = (String) params.get("vendorType");
  231. if (userId == null || vendorType == null || vendorType.isEmpty()) {
  232. return Result.error("参数不完整");
  233. }
  234. User user = userMapper.selectById(userId);
  235. if (user == null) {
  236. return Result.error("用户不存在");
  237. }
  238. user.setVendorType(vendorType);
  239. if ("activity_provider".equals(vendorType)) {
  240. user.setActivityProviderStatus("approved");
  241. } else if ("planner".equals(vendorType) || "product_supplier".equals(vendorType)) {
  242. user.setActivityProviderStatus(null);
  243. }
  244. user.setUpdatedAt(new Date());
  245. userMapper.updateById(user);
  246. return Result.success(true);
  247. }
  248. }