Prechádzať zdrojové kódy

待办配合联调完成

wany 1 rok pred
rodič
commit
9f4f004353

+ 58 - 0
src/main/java/com/kingtom/shengtai/api/controller/AffairExtController.java

@@ -0,0 +1,58 @@
+package com.kingtom.shengtai.api.controller;
+
+import com.kingtom.kirin.api.security.SaSecurityUtils;
+import com.kingtom.kirin.core.common.base.Result;
+import com.kingtom.kirin.core.common.exception.AppException;
+import com.kingtom.shengtai.api.model.UserJoinOrgParam;
+import com.kingtom.shengtai.app.affair.service.AffairService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 应用模块名称</p>
+ * 代码描述</p>
+ * Copyright: Copyright (C) 2024 , Inc. All rights reserved. <p>
+ * Company: 成都诚唐科技有限责任公司</p>
+ *
+ * @author wany
+ * @since 2024/1/2
+ */
+@RestController
+@RequestMapping("/affair_ext")
+@Tag(name = "AffairExtController", description = "审核相关扩展接口。")
+public class AffairExtController{
+
+    @Autowired
+    private AffairService affairService;
+
+    @PostMapping("/UserJoinOrgAffair")
+    @Operation(description = "创建待办:用户加入组织")
+    public Result<String> createUserJoinOrgAffair(@RequestBody UserJoinOrgParam param){
+        String name = param.getName();
+        if(StringUtils.isEmpty(name)){
+            throw new AppException("人员名称不能为空!");
+        }
+        String phone = param.getPhone();
+        if(StringUtils.isEmpty(name)){
+            throw new AppException("人员手机号不能为空!");
+        }
+        String userId = SaSecurityUtils.findSessionData().getUserId();
+        affairService.createUserJoinOrgAffair(userId, name, phone);
+        return Result.ok(null);
+    }
+
+    @PostMapping("/SupplierAffair")
+    @Operation(description = "创建待办:申请成为供应商")
+    public Result<String> createSupplierAffair(@RequestBody String data){
+        String userId = SaSecurityUtils.findSessionData().getUserId();
+        affairService.createSupplierAffair(userId, data);
+        return Result.ok(null);
+    }
+
+}

+ 0 - 5
src/main/java/com/kingtom/shengtai/api/controller/MessageController.java

@@ -9,7 +9,6 @@ import com.kingtom.kirin.core.common.utils.CollectionUtils;
 import com.kingtom.shengtai.api.model.MsgSummaryDTO;
 import com.kingtom.shengtai.app.message.model.MsgReceive;
 import com.kingtom.shengtai.app.message.service.IMsgReceiveService;
-import com.kingtom.shengtai.app.message.service.IMsgSummaryService;
 import com.mybatisflex.core.paginate.Page;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -27,10 +26,6 @@ import org.springframework.web.bind.annotation.*;
 @Tag(name = "MessageController", description = "消息接收记录表 控制层。")
 public class MessageController{
 
-    @Autowired
-    private IMsgSummaryService summaryService;
-
-
     @Autowired
     private IMsgReceiveService receiveService;
 

+ 35 - 11
src/main/java/com/kingtom/shengtai/api/controller/SrmCooperateController.java

@@ -3,9 +3,13 @@ package com.kingtom.shengtai.api.controller;
 import java.util.List;
 import java.util.Map;
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaCheckRole;
+import com.kingtom.kirin.api.security.SaSecurityUtils;
 import com.kingtom.kirin.app.auth.base.AuthInit;
 import com.kingtom.kirin.app.auth.base.Menu;
 import com.kingtom.kirin.app.auth.base.Role;
+import com.kingtom.kirin.app.security.base.SessionData;
 import com.kingtom.kirin.core.common.base.PageInfo;
 import com.kingtom.kirin.core.common.base.Result;
 import com.kingtom.kirin.core.common.utils.CollectionUtils;
@@ -14,7 +18,9 @@ import com.kingtom.shengtai.api.mapper.SrmMapper;
 import com.kingtom.shengtai.api.model.SrmCooperateDTO;
 import com.kingtom.shengtai.app.srm.model.SrmCooperate;
 import com.kingtom.shengtai.app.srm.model.SrmCooperateDO;
+import com.kingtom.shengtai.app.srm.model.SrmSupplier;
 import com.kingtom.shengtai.app.srm.service.ISrmCooperateService;
+import com.kingtom.shengtai.app.srm.service.ISrmSupplierService;
 import com.mybatisflex.core.paginate.Page;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -33,14 +39,15 @@ import org.springframework.web.bind.annotation.*;
 @RestController
 @RequestMapping("/srmCooperates")
 @AuthInit(menus = {@Menu(name = "组织管理:供应商管理", otherName = "供应商管理", code = "organization_supplier",
-        routeUri = "supplier", orderNum = 25)},
-        roles = {@Role(name = "业务管理员", code = "businessAdmin", menuCode = {"organization_supplier"}),
-                @Role(name = "供应商", code = "supplier")})
+        routeUri = "supplier", orderNum = 25)}, roles = {@Role(name = "供应商", code = "supplier")})
 public class SrmCooperateController{
 
     @Autowired
     private ISrmCooperateService iSrmCooperateService;
 
+    @Autowired
+    private ISrmSupplierService  iSrmSupplierService;
+
     /**
      * 添加 供应商合作记录表。
      *
@@ -49,6 +56,7 @@ public class SrmCooperateController{
      */
     @Operation(summary = "添加 供应商合作记录表。", description = "添加 供应商合作记录表。")
     @PostMapping("/")
+    @SaCheckPermission(value = {"AuthMenu:organization_supplier:Execute"})
     public Result<SrmCooperateDTO> save(@RequestBody SrmCooperateDTO dto){
         SrmCooperate convert = SrmMapper.INSTANCE.convert(dto);
         SrmCooperateDO srmCooperateDO = iSrmCooperateService.create(convert);
@@ -64,6 +72,7 @@ public class SrmCooperateController{
     @Parameter(name = "id", description = "主键", in = ParameterIn.PATH, required = true)
     @Operation(summary = "根据主键删除 供应商合作记录表。", description = "根据主键删除 供应商合作记录表。")
     @PostMapping("/{id}/")
+    @SaCheckPermission(value = {"AuthMenu:organization_supplier:Execute"})
     public Result<String> remove(@PathVariable String id){
         iSrmCooperateService.deleteById(id);
         return Result.ok(null);
@@ -77,19 +86,21 @@ public class SrmCooperateController{
      */
     @Operation(summary = "根据主键批量删除供应商信息表。", description = "根据主键批量删除供应商信息表。")
     @PostMapping("/remove_batch")
+    @SaCheckPermission(value = {"AuthMenu:organization_supplier:Execute"})
     public Result<String> remove(@RequestBody List<String> ids){
         iSrmCooperateService.deleteByIds(ids);
         return Result.ok(null);
     }
 
     /**
-     * 根据主键更新 供应商合作记录表。
+     * 根据id更新供应商合作记录
      *
      * @param dto 供应商合作记录表
      * @return {@code true} 更新成功,{@code false} 更新失败
      */
-    @Operation(summary = "根据主键更新 供应商合作记录表。", description = "根据主键更新 供应商合作记录表。")
+    @Operation(description = "根据id更新供应商合作记录")
     @PostMapping("/{id}/info")
+    @SaCheckPermission(value = {"AuthMenu:organization_supplier:Execute"})
     public Result<SrmCooperateDTO> update(@RequestBody SrmCooperateDTO dto){
         SrmCooperate convert = SrmMapper.INSTANCE.convert(dto);
         SrmCooperateDO srmCooperateDO = iSrmCooperateService.update(convert);
@@ -97,30 +108,30 @@ public class SrmCooperateController{
     }
 
     /**
-     * 根据 供应商合作记录表主键获取详细信息。
+     * 根据id获取供应商合作记录
      *
      * @param id 供应商合作记录表主键
      * @return 供应商合作记录表详情
      */
-    @Parameter(name = "id", description = "供应商合作记录表主键", in = ParameterIn.PATH, required = true)
-    @Operation(summary = "根据 供应商合作记录表主键获取详细信息。",
-            description = "根据 供应商合作记录表主键获取详细信息。")
+    @Operation(description = "根据id获取供应商合作记录")
     @GetMapping("/{id}/info")
+    @SaCheckPermission(value = {"AuthMenu:organization_supplier:Execute"})
     public Result<SrmCooperateDTO> getInfo(@PathVariable String id){
         SrmCooperateDO srmCooperateDO = iSrmCooperateService.findById(id);
         return Result.ok(SrmCooperateDTO.convert(srmCooperateDO));
     }
 
     /**
-     * 分页查询 供应商合作记录表。
+     * 分页查询供应商合作记录
      *
      * @param query    查询条件
      * @param pageNum  当前页码
      * @param pageSize 每页数量
      * @return 分页对象
      */
-    @Operation(summary = "分页查询 供应商合作记录表。", description = "分页查询 供应商合作记录表。")
+    @Operation(description = "分页查询供应商合作记录")
     @GetMapping("/page")
+    @SaCheckPermission(value = {"AuthMenu:organization_supplier:Execute"})
     public Result<PageInfo<SrmCooperateDTO>> page(String query, Integer pageNum, Integer pageSize){
         Map<String, Object> object = JsonUtils.toObject(query, Map.class);
         String search = object.get("search") == null ? null : object.get("search").toString();
@@ -129,4 +140,17 @@ public class SrmCooperateController{
         return Result.ok(CollectionUtils.convertPage(page, SrmCooperateDTO::convert));
     }
 
+    @Operation(description = "分页查询查询我的供应商合作记录")
+    @GetMapping("/self/page")
+    @SaCheckRole(value = {"supplier"})
+    public Result<PageInfo<SrmCooperateDTO>> getSelfPage(String query, Integer pageNum, Integer pageSize){
+        SessionData sessionData = SaSecurityUtils.findSessionData();
+        String userId = sessionData.getUserId();
+        SrmSupplier supplier = iSrmSupplierService.findByPerson(userId);
+        Map<String, Object> object = JsonUtils.toObject(query, Map.class);
+        String search = object.get("search") == null ? null : object.get("search").toString();
+        Page<SrmCooperateDO> page = iSrmCooperateService.page(search, supplier.getId(), pageNum, pageSize);
+        return Result.ok(CollectionUtils.convertPage(page, SrmCooperateDTO::convert));
+    }
+
 }

+ 42 - 0
src/main/java/com/kingtom/shengtai/api/controller/SrmSupplierController.java

@@ -5,6 +5,14 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaCheckRole;
+import com.kingtom.kirin.api.security.SaSecurityUtils;
+import com.kingtom.kirin.api.system.mapper.SystemMapper;
+import com.kingtom.kirin.api.system.model.SystemUserDTO;
+import com.kingtom.kirin.app.security.base.SessionData;
+import com.kingtom.kirin.app.system.SystemConst;
+import com.kingtom.kirin.app.system.model.SystemUser;
 import com.kingtom.kirin.core.common.base.PageInfo;
 import com.kingtom.kirin.core.common.base.Result;
 import com.kingtom.kirin.core.common.utils.CollectionUtils;
@@ -44,6 +52,7 @@ public class SrmSupplierController{
      */
     @Operation(summary = "添加供应商信息表。", description = "添加供应商信息表。")
     @PostMapping("/")
+    @SaCheckPermission(value = {"AuthMenu:organization_supplier:Execute"})
     public Result<SrmSupplierDTO> save(@RequestBody SrmSupplierDTO dto){
         SrmSupplier convert = SrmMapper.INSTANCE.convert(dto);
         SrmSupplierDO supplierDO = iSrmSupplierService.create(convert);
@@ -59,6 +68,7 @@ public class SrmSupplierController{
     @Parameter(name = "id", description = "主键", in = ParameterIn.PATH, required = true)
     @Operation(summary = "根据主键删除供应商信息表。", description = "根据主键删除供应商信息表。")
     @PostMapping("/{id}/")
+    @SaCheckPermission(value = {"AuthMenu:organization_supplier:Execute"})
     public Result<String> remove(@PathVariable String id){
         iSrmSupplierService.deleteById(id);
         return Result.ok(null);
@@ -72,6 +82,7 @@ public class SrmSupplierController{
      */
     @Operation(summary = "根据主键批量删除供应商信息表。", description = "根据主键批量删除供应商信息表。")
     @PostMapping("/remove_batch")
+    @SaCheckPermission(value = {"AuthMenu:organization_supplier:Execute"})
     public Result<String> remove(@RequestBody List<String> ids){
         iSrmSupplierService.deleteByIds(ids);
         return Result.ok(null);
@@ -86,6 +97,7 @@ public class SrmSupplierController{
     @Parameter(name = "id", description = "", in = ParameterIn.PATH, required = true)
     @Operation(summary = "根据主键更新供应商信息表。", description = "根据主键更新供应商信息表。")
     @PostMapping("/{id}/info")
+    @SaCheckPermission(value = {"AuthMenu:organization_supplier:Execute"})
     public Result<SrmSupplierDTO> update(@RequestBody SrmSupplierDTO dto, @PathVariable String id){
         SrmSupplier convert = SrmMapper.INSTANCE.convert(dto);
         convert.setId(id);
@@ -102,6 +114,7 @@ public class SrmSupplierController{
     @Parameter(name = "id", description = "供应商信息表主键", in = ParameterIn.PATH, required = true)
     @Operation(summary = "根据供应商信息表主键获取详细信息。", description = "根据供应商信息表主键获取详细信息。")
     @GetMapping("/{id}/info")
+    @SaCheckPermission(value = {"AuthMenu:organization_supplier:Execute"})
     public Result<SrmSupplierDTO> getInfo(@PathVariable String id){
         SrmSupplierDO supplierDO = iSrmSupplierService.findById(id);
         return Result.ok(SrmSupplierDTO.convert(supplierDO));
@@ -117,6 +130,7 @@ public class SrmSupplierController{
      */
     @Operation(summary = "分页查询供应商信息表。", description = "分页查询供应商信息表。")
     @GetMapping("/page")
+    @SaCheckPermission(value = {"AuthMenu:organization_supplier:Execute"})
     public Result<PageInfo<SrmSupplierDTO>> page(String query, Integer pageNum, Integer pageSize){
         Map<String, Object> object = JsonUtils.toObject(query, Map.class);
         String name = object.get("name") instanceof String ? object.get("name").toString() : null;
@@ -129,4 +143,32 @@ public class SrmSupplierController{
         return Result.ok(CollectionUtils.convertPage(page, SrmSupplierDTO::convert));
     }
 
+    /**
+     * 我的供应商。
+     *
+     * @return 供应商信息表详情
+     */
+    @Operation(description = "我的供应商")
+    @GetMapping("/self")
+    @SaCheckRole(value = {"supplier"})
+    public Result<SrmSupplierDTO> getSelf(){
+        SessionData sessionData = SaSecurityUtils.findSessionData();
+        String userId = sessionData.getUserId();
+        SrmSupplier supplier = iSrmSupplierService.findByPerson(userId);
+        SystemUserDTO dto = sessionData.getAttr(SystemConst.SESSION_ATTR_SYSTEM_USER);
+        SystemUser user = SystemMapper.INSTANCT.convert(dto);
+        SrmSupplierDO supplierDO = SrmSupplierDO.builder().supplier(supplier).user(user).build();
+        return Result.ok(SrmSupplierDTO.convert(supplierDO));
+    }
+
+    @Operation(description = "供应商评分申诉")
+    @PostMapping("/appeal")
+    @SaCheckRole(value = {"supplier"})
+    public Result<String> appeal(@RequestBody String content){
+        SessionData sessionData = SaSecurityUtils.findSessionData();
+        String userId = sessionData.getUserId();
+        iSrmSupplierService.appeal(userId, content);
+        return Result.ok(null);
+    }
+
 }

+ 1 - 2
src/main/java/com/kingtom/shengtai/api/model/SrmSupplierDTO.java

@@ -1,6 +1,5 @@
 package com.kingtom.shengtai.api.model;
 
-import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -91,7 +90,7 @@ public class SrmSupplierDTO{
         if(convert == null){
             return null;
         }
-        convert.setPersonName(supplierDO.getPerson() == null ? null : supplierDO.getPerson().getName());
+        convert.setPersonName(supplierDO.getUser() == null ? null : supplierDO.getUser().getName());
         return convert;
     }
 

+ 36 - 0
src/main/java/com/kingtom/shengtai/api/model/SupplierJoinParam.java

@@ -0,0 +1,36 @@
+package com.kingtom.shengtai.api.model;
+
+import java.util.List;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 应用模块名称</p>
+ * 代码描述</p>
+ * Copyright: Copyright (C) 2024 , Inc. All rights reserved. <p>
+ * Company: 成都诚唐科技有限责任公司</p>
+ *
+ * @author wany
+ * @since 2024/1/3
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SupplierJoinParam{
+
+    private String name;
+
+    private String phone;
+
+    private String address;
+
+    private String type;
+
+    private List<String> product;
+
+    private List<String> image;
+}

+ 43 - 0
src/main/java/com/kingtom/shengtai/api/model/UserJoinOrgParam.java

@@ -0,0 +1,43 @@
+package com.kingtom.shengtai.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 应用模块名称</p>
+ * 代码描述</p>
+ * Copyright: Copyright (C) 2024 , Inc. All rights reserved. <p>
+ * Company: 成都诚唐科技有限责任公司</p>
+ *
+ * @author wany
+ * @since 2024/1/3
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(description = "用户加入组织提交数据")
+public class UserJoinOrgParam{
+
+    @Schema(description = "用户Id")
+    private String userId;
+
+    @Schema(description = "组织Id")
+    private String orgId;
+
+    @Schema(description = "部门Id")
+    private String depId;
+
+    @Schema(description = "岗位Id")
+    private String postId;
+
+    @Schema(description = "人员名称")
+    private String name;
+
+    @Schema(description = "人员手机号")
+    private String phone;
+
+}

+ 50 - 0
src/main/java/com/kingtom/shengtai/app/affair/service/AffairService.java

@@ -0,0 +1,50 @@
+package com.kingtom.shengtai.app.affair.service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.kingtom.kirin.app.affair.model.AffairInfo;
+import com.kingtom.kirin.app.affair.service.IAffairService;
+import com.kingtom.kirin.core.common.utils.JsonUtils;
+import com.kingtom.kirin.core.resource.ResourceConst;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 应用模块名称</p>
+ * 代码描述</p>
+ * Copyright: Copyright (C) 2024 , Inc. All rights reserved. <p>
+ * Company: 成都诚唐科技有限责任公司</p>
+ *
+ * @author wany
+ * @since 2024/1/2
+ */
+@Service
+public class AffairService{
+
+    @Autowired
+    private IAffairService affairService;
+
+    public void createUserJoinOrgAffair(String userId, String name, String phone){
+        AffairInfo info = new AffairInfo();
+        info.setType(UserJoinOrgHandler.NAME);
+        info.setSourceType(ResourceConst.ResourceTypeEnum.SystemUser.getKey());
+        info.setSourceId(userId);
+        Map<String, String> data = new HashMap<>();
+        data.put("userId", userId);
+        data.put("name", name);
+        data.put("phone", phone);
+        info.setData(JsonUtils.toJson(data));
+        affairService.createAffair(info);
+    }
+
+    public void createSupplierAffair(String userId, String data){
+        AffairInfo info = new AffairInfo();
+        info.setType(SupplierJoinHandler.NAME);
+        info.setSourceType(ResourceConst.ResourceTypeEnum.SystemUser.getKey());
+        info.setSourceId(userId);
+        info.setData(data);
+        affairService.createAffair(info);
+    }
+
+}

+ 179 - 0
src/main/java/com/kingtom/shengtai/app/affair/service/SupplierJoinHandler.java

@@ -0,0 +1,179 @@
+package com.kingtom.shengtai.app.affair.service;
+
+import java.text.MessageFormat;
+import java.util.List;
+
+import com.kingtom.kirin.app.affair.AffairConst;
+import com.kingtom.kirin.app.affair.base.AbstractAffairOneHandler;
+import com.kingtom.kirin.app.affair.model.AffairInfo;
+import com.kingtom.kirin.app.affair.model.AffairMember;
+import com.kingtom.kirin.app.affair.model.AffairTarget;
+import com.kingtom.kirin.app.affair.service.IAffairService;
+import com.kingtom.kirin.app.auth.model.AuthRole;
+import com.kingtom.kirin.app.auth.service.IAuthRoleService;
+import com.kingtom.kirin.app.auth.service.IAuthService;
+import com.kingtom.kirin.app.org.OrgConst;
+import com.kingtom.kirin.app.org.model.OrgIdentity;
+import com.kingtom.kirin.app.org.model.OrgUnit;
+import com.kingtom.kirin.app.org.service.IOrgIdentityService;
+import com.kingtom.kirin.app.org.service.IOrgMemberService;
+import com.kingtom.kirin.app.org.service.IOrgService;
+import com.kingtom.kirin.app.system.model.SystemUser;
+import com.kingtom.kirin.app.system.service.ISystemService;
+import com.kingtom.kirin.app.system.utils.SystemUtils;
+import com.kingtom.kirin.core.common.CommonConst;
+import com.kingtom.kirin.core.common.exception.AppException;
+import com.kingtom.kirin.core.common.utils.CollectionUtils;
+import com.kingtom.kirin.core.common.utils.JsonUtils;
+import com.kingtom.kirin.core.resource.ResourceConst;
+import com.kingtom.shengtai.app.message.model.MsgSummary;
+import com.kingtom.shengtai.app.message.service.IMsgSummaryService;
+import com.kingtom.shengtai.app.message.ws.WsSendService;
+import com.kingtom.shengtai.app.srm.model.SrmSupplier;
+import com.kingtom.shengtai.app.srm.service.ISrmSupplierService;
+import jakarta.annotation.PostConstruct;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 应用模块名称</p>
+ * 代码描述</p>
+ * Copyright: Copyright (C) 2024 , Inc. All rights reserved. <p>
+ * Company: 成都诚唐科技有限责任公司</p>
+ *
+ * @author wany
+ * @since 2024/1/2
+ */
+@Component
+public class SupplierJoinHandler extends AbstractAffairOneHandler{
+
+    public static final String NAME = "SupplierJoin";
+
+    @Autowired
+    private IAffairService affairService;
+
+    @Autowired
+    private ISystemService systemService;
+
+    @Autowired
+    private IAuthRoleService roleService;
+
+    @Autowired
+    private IAuthService authService;
+
+    @Autowired
+    private IOrgService orgService;
+
+    @Autowired
+    private IOrgMemberService orgMemberService;
+
+    @Autowired
+    private IOrgIdentityService orgIdentityService;
+
+    @Autowired
+    private ISrmSupplierService supplierService;
+
+    @Autowired
+    private IMsgSummaryService msgSummaryService;
+
+    @Autowired
+    private WsSendService wsSendService;
+
+    @PostConstruct
+    public void init(){
+        affairService.registerAffairHandler(SupplierJoinHandler.this);
+    }
+
+    @Override
+    public String type(){
+        return NAME;
+    }
+
+    @Override
+    public void createBefore(AffairInfo info){
+        Data data = JsonUtils.toObject(info.getData(), Data.class);
+        SystemUser systemUser = systemService.findSystemUserById(info.getSourceId());
+        if(systemUser == null){
+            throw new AppException("用户不存在!");
+        }
+        OrgUnit defaultUnit = orgService.findDefaultUnit();
+        List<String> orgAdminPersonIds = orgMemberService.findOrgMemberPersonIds(defaultUnit.getId());
+        if(CollectionUtils.isEmpty(orgAdminPersonIds)){
+            throw new AppException("没有组织成员,不能创建事项!");
+        }
+        OrgIdentity identity =
+                orgIdentityService.findByTypeAndSourceId(OrgConst.OrgIdentityTypeEnum.OrgMember, defaultUnit.getId());
+        AffairTarget target = AffairTarget.builder().resType(ResourceConst.ResourceTypeEnum.AuthRole.getKey())
+                .resId(identity.getRoleId()).build();
+        info.setTarget(JsonUtils.toJson(List.of(target)));
+        info.setTitle(MessageFormat.format("用户({0})申请成为供应商", systemUser.getName()));
+        info.setSummary(info.getTitle());
+        info.setEffectModel(AffairConst.AffairEffectModelEnum.GenerateNow.getKey());
+        info.setActionModel(AffairConst.AffairActionModelEnum.One.getKey());
+        info.setEffectCondition(CommonConst.EMPTY_OBJECT_STRING);
+    }
+
+    @Override
+    public void doAgree(AffairInfo info, AffairMember member){
+        Data data = JsonUtils.toObject(member.getData(), Data.class);
+        SrmSupplier supplier = new SrmSupplier();
+        supplier.setName(data.getName());
+        supplier.setPerson(info.getSourceId());
+        supplier.setPerson(data.getPhone());
+        supplier.setAddress(data.getAddress());
+        supplier.setType(data.getType());
+        supplier.setProduct(JsonUtils.toJson(data.getProduct()));
+        supplier.setImage(JsonUtils.toJson(data.getImage()));
+        supplierService.create(supplier);
+
+        MsgSummary msgSummary = new MsgSummary();
+        msgSummary.setSender("系统");
+        msgSummary.setTitle("成为供应商审核结果通知");
+        msgSummary.setType("审核结果通知");
+        msgSummary.setContent("成为供应商审核通过!");
+        msgSummary.setExt1(info.getId());
+        msgSummaryService.createMsg(msgSummary, List.of(info.getSourceId()));
+
+        AuthRole role = roleService.findRoleByCode("supplier", SystemUtils.getCurrentSystemId());
+        authService.updateRoleAddUsers(role.getId(), List.of(info.getSourceId()));
+
+        wsSendService.sendMsg(msgSummary.getType(), info.getSourceId());
+    }
+
+    @Override
+    public void doRefuse(AffairInfo info, AffairMember member){
+        MsgSummary msgSummary = new MsgSummary();
+        msgSummary.setSender("系统");
+        msgSummary.setTitle("成为供应商审核结果通知");
+        msgSummary.setType("审核结果通知");
+        msgSummary.setContent("成为供应商审核不通过!");
+        msgSummary.setExt1(info.getId());
+        msgSummaryService.createMsg(msgSummary, List.of(info.getSourceId()));
+        wsSendService.sendMsg(msgSummary.getType(), info.getSourceId());
+    }
+
+
+    @lombok.Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    private static class Data{
+
+        private String name;
+
+        private String phone;
+
+        private String address;
+
+        private String type;
+
+        private List<String> product;
+
+        private List<String> image;
+
+    }
+
+}

+ 183 - 0
src/main/java/com/kingtom/shengtai/app/affair/service/UserJoinOrgHandler.java

@@ -0,0 +1,183 @@
+package com.kingtom.shengtai.app.affair.service;
+
+import java.text.MessageFormat;
+import java.util.Collections;
+import java.util.List;
+
+import com.kingtom.kirin.app.affair.AffairConst;
+import com.kingtom.kirin.app.affair.base.AbstractAffairOneHandler;
+import com.kingtom.kirin.app.affair.model.AffairInfo;
+import com.kingtom.kirin.app.affair.model.AffairMember;
+import com.kingtom.kirin.app.affair.model.AffairTarget;
+import com.kingtom.kirin.app.affair.service.IAffairService;
+import com.kingtom.kirin.app.org.OrgConst;
+import com.kingtom.kirin.app.org.bo.OrgPersonBO;
+import com.kingtom.kirin.app.org.model.OrgIdentity;
+import com.kingtom.kirin.app.org.model.OrgPerson;
+import com.kingtom.kirin.app.org.model.OrgUnit;
+import com.kingtom.kirin.app.org.service.IOrgIdentityService;
+import com.kingtom.kirin.app.org.service.IOrgMemberService;
+import com.kingtom.kirin.app.org.service.IOrgService;
+import com.kingtom.kirin.app.system.model.SystemUser;
+import com.kingtom.kirin.app.system.service.ISystemService;
+import com.kingtom.kirin.core.common.CommonConst;
+import com.kingtom.kirin.core.common.exception.AppException;
+import com.kingtom.kirin.core.common.utils.CollectionUtils;
+import com.kingtom.kirin.core.common.utils.IDUtils;
+import com.kingtom.kirin.core.common.utils.JsonUtils;
+import com.kingtom.kirin.core.resource.ResourceConst;
+import com.kingtom.shengtai.app.message.model.MsgSummary;
+import com.kingtom.shengtai.app.message.service.IMsgSummaryService;
+import com.kingtom.shengtai.app.message.ws.WsSendService;
+import jakarta.annotation.PostConstruct;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 应用模块名称</p>
+ * 代码描述</p>
+ * Copyright: Copyright (C) 2024 , Inc. All rights reserved. <p>
+ * Company: 成都诚唐科技有限责任公司</p>
+ *
+ * @author wany
+ * @since 2024/1/2
+ */
+@Slf4j
+@Component
+public class UserJoinOrgHandler extends AbstractAffairOneHandler{
+
+    public static final String NAME = "UserJoinOrg";
+
+    @Autowired
+    private IAffairService affairService;
+
+    @Autowired
+    private ISystemService systemService;
+
+    @Autowired
+    private IOrgService orgService;
+
+    @Autowired
+    private IOrgMemberService orgMemberService;
+
+    @Autowired
+    private IOrgIdentityService orgIdentityService;
+
+    @Autowired
+    private IMsgSummaryService msgSummaryService;
+
+    @Autowired
+    private WsSendService wsSendService;
+
+    @PostConstruct
+    public void init(){
+        affairService.registerAffairHandler(UserJoinOrgHandler.this);
+    }
+
+    @Override
+    public String type(){
+        return NAME;
+    }
+
+    @Override
+    public void createBefore(AffairInfo info){
+        Data data = JsonUtils.toObject(info.getData(), Data.class);
+        SystemUser systemUser = systemService.findSystemUserById(data.getUserId());
+        if(systemUser == null){
+            throw new AppException("用户不存在!");
+        }
+        OrgUnit defaultUnit = orgService.findDefaultUnit();
+        List<String> orgAdminPersonIds = orgMemberService.findOrgAdminPersonIds(defaultUnit.getId());
+        if(CollectionUtils.isEmpty(orgAdminPersonIds)){
+            throw new AppException("未设置组织管理员。不能创建事项!");
+        }
+        OrgIdentity identity =
+                orgIdentityService.findByTypeAndSourceId(OrgConst.OrgIdentityTypeEnum.OrgAdmin, defaultUnit.getId());
+        AffairTarget target = AffairTarget.builder().resType(ResourceConst.ResourceTypeEnum.AuthRole.getKey())
+                .resId(identity.getRoleId()).build();
+        info.setTarget(JsonUtils.toJson(List.of(target)));
+        info.setTitle(MessageFormat.format("用户({0})申请加入组织【{1}】", systemUser.getName(), defaultUnit.getName()));
+        info.setSummary(info.getTitle());
+        info.setEffectModel(AffairConst.AffairEffectModelEnum.GenerateNow.getKey());
+        info.setActionModel(AffairConst.AffairActionModelEnum.One.getKey());
+        info.setEffectCondition(CommonConst.EMPTY_OBJECT_STRING);
+        data.setOrgId(defaultUnit.getId());
+        info.setData(JsonUtils.toJson(data));
+    }
+
+    @Override
+    public void doAgree(AffairInfo info, AffairMember member){
+        Data data = JsonUtils.toObject(member.getData(), Data.class);
+        SystemUser systemUser = systemService.findSystemUserById(data.getUserId());
+        String personId = null;
+        boolean hasPerson = false;
+        if(ResourceConst.ResourceTypeEnum.OrgPerson.getKey().equals(systemUser.getResType())){
+            OrgPersonBO person = orgService.findPersonById(data.getOrgId(), systemUser.getResId());
+            if(person != null){
+                boolean isOrgMember = orgMemberService.isOrgMember(data.getOrgId(), person.getPerson().getId());
+                if(isOrgMember){
+                    throw new AppException("用户已经加入组织,不能重复操作!");
+                }
+                hasPerson = true;
+                personId = person.getPerson().getId();
+            }
+        }
+        if(hasPerson){
+            orgMemberService.addOrgMember(data.getOrgId(), Collections.singletonList(personId));
+            //todo 加入部门岗位
+        } else{
+            OrgPerson person = new OrgPerson();
+            person.setUserId(data.getUserId());
+            person.setName(data.getName());
+            person.setPhone(data.getPhone());
+            //todo 加入部门岗位,用户名写的UUID原因是指定了创建用户Id
+            orgService.createPerson(person, IDUtils.newUUID(), data.getOrgId(), null);
+        }
+
+        MsgSummary msgSummary = new MsgSummary();
+        msgSummary.setSender("系统");
+        msgSummary.setTitle("用户加入组织审核结果通知");
+        msgSummary.setType("审核结果通知");
+        msgSummary.setContent("用户加入组织审核通过!");
+        msgSummary.setExt1(info.getId());
+        msgSummaryService.createMsg(msgSummary, List.of(info.getSourceId()));
+        wsSendService.sendMsg(msgSummary.getType(), info.getSourceId());
+    }
+
+    @Override
+    public void doRefuse(AffairInfo info, AffairMember member){
+        MsgSummary msgSummary = new MsgSummary();
+        msgSummary.setSender("系统");
+        msgSummary.setTitle("用户加入组织审核结果通知");
+        msgSummary.setType("审核结果通知");
+        msgSummary.setContent("用户加入组织审核不通过!");
+        msgSummary.setExt1(info.getId());
+        msgSummaryService.createMsg(msgSummary, List.of(info.getSourceId()));
+        wsSendService.sendMsg(msgSummary.getType(), info.getSourceId());
+    }
+
+    @lombok.Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    private static class Data{
+
+        private String userId;
+
+        private String orgId;
+
+        private String depId;
+
+        private String postId;
+
+        private String name;
+
+        private String phone;
+
+    }
+
+}

+ 78 - 7
src/main/java/com/kingtom/shengtai/app/base/session/SessionLoader.java

@@ -2,13 +2,23 @@ package com.kingtom.shengtai.app.base.session;
 
 import java.util.List;
 
-import com.kingtom.kirin.app.auth.model.AuthRole;
+import com.kingtom.kirin.api.org.model.OrgPersonDTO;
+import com.kingtom.kirin.app.affair.model.AffairInfo;
+import com.kingtom.kirin.app.affair.model.AffairInfoDO;
+import com.kingtom.kirin.app.affair.model.AffairMember;
+import com.kingtom.kirin.app.affair.service.IAffairService;
 import com.kingtom.kirin.app.auth.service.IAuthService;
+import com.kingtom.kirin.app.org.OrgConst;
+import com.kingtom.kirin.app.org.model.OrgUnit;
+import com.kingtom.kirin.app.org.service.IOrgMemberService;
 import com.kingtom.kirin.app.security.base.ISessionDataLoader;
 import com.kingtom.kirin.app.security.base.SessionData;
 import com.kingtom.kirin.app.security.service.ISecurityContainerService;
 import com.kingtom.kirin.core.common.CommonConst;
+import com.kingtom.shengtai.app.affair.service.SupplierJoinHandler;
+import com.kingtom.shengtai.app.affair.service.UserJoinOrgHandler;
 import jakarta.annotation.PostConstruct;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -30,6 +40,12 @@ public class SessionLoader implements ISessionDataLoader{
     @Autowired
     private IAuthService authService;
 
+    @Autowired
+    private IOrgMemberService orgMemberService;
+
+    @Autowired
+    private IAffairService affairService;
+
     @PostConstruct
     public void init(){
         container.registerSessionLoader(this);
@@ -42,15 +58,70 @@ public class SessionLoader implements ISessionDataLoader{
 
     @Override
     public void onLoad(SessionData data){
-        List<AuthRole> rolesByUserId = authService.findRolesByUserId(data.getUserId(), data.getSysId());
+        OrgPersonDTO orgPersonDTO = data.getAttr(OrgConst.SESSION_ATTR_ORG_PERSON);
+        OrgUnit orgUnit = data.getAttr(OrgConst.SESSION_ATTR_ORG_UNIT);
+        fillBusinessRole(data, orgPersonDTO, orgUnit);
+        fillAffairState(data);
+    }
+
+    private void fillAffairState(SessionData data){
+        AffairInfoDO userJoinOrgAffair = affairService.findByTypeAndSourceId(UserJoinOrgHandler.NAME, data.getUserId());
+        AffairInfoDO supplierJoinAffair =
+                affairService.findByTypeAndSourceId(SupplierJoinHandler.NAME, data.getUserId());
+        AffairInfoDO affairInfoDO = null;
+        if(userJoinOrgAffair.getInfo() != null && supplierJoinAffair.getInfo() != null){
+            affairInfoDO =
+                    userJoinOrgAffair.getInfo().getGmtCreate().compareTo(supplierJoinAffair.getInfo().getGmtCreate()) >
+                            0 ? userJoinOrgAffair : supplierJoinAffair;
+        } else if(userJoinOrgAffair.getInfo() != null){
+            affairInfoDO = userJoinOrgAffair;
+        } else{
+            affairInfoDO = supplierJoinAffair;
+        }
+
+        AffairInfo info = affairInfoDO.getInfo();
+        List<AffairMember> members = affairInfoDO.getMembers();
+        if(affairInfoDO.getInfo() == null){
+            //未提交审核
+            data.putAttr("auditState", 0);
+        } else if(CommonConst.StateEnum.Enable.getKey().equals(info.getState())){
+            //已提交未审核
+            data.putAttr("auditState", 1);
+        } else if(CommonConst.StateEnum.Disable.getKey().equals(info.getState())){
+            AffairMember member =
+                    members.stream().filter(e -> CommonConst.StateEnum.Disable.getKey().equals(e.getState()))
+                            .findFirst().orElse(null);
+            if(member == null){
+                //未提交审核
+                data.putAttr("auditState", 0);
+            } else{
+                if(CommonConst.BooleanEnum.True.getKey().equals(member.getResult())){
+                    data.putAttr("auditState", 2);
+                } else{
+                    data.putAttr("auditState", 3);
+                }
+            }
+
+        }
+    }
+
+    private void fillBusinessRole(SessionData data, OrgPersonDTO orgPersonDTO, OrgUnit orgUnit){
+        //默认未注册角色
         data.putAttr("BusinessRole", null);
-        if(rolesByUserId.stream().anyMatch(e -> e.getCode().equals("supplier"))){
-            data.putAttr("BusinessRole", "supplier");
+        String personId = orgPersonDTO == null ? null : orgPersonDTO.getId();
+        if(StringUtils.isNotEmpty(personId)){
+            boolean orgMember = orgMemberService.isOrgMember(orgUnit.getId(), personId);
+            if(orgMember){
+                //组织成员
+                data.putAttr("BusinessRole", "orgMember");
+                return;
+            }
         }
-        if(rolesByUserId.stream().anyMatch(e -> e.getCode().equals("businessAdmin"))){
-            data.putAttr("BusinessRole", "businessAdmin");
+        boolean userHasRole = authService.findUserHasRole("supplier", data.getUserId(), data.getSysId());
+        if(userHasRole){
+            //供应商
+            data.putAttr("BusinessRole", "supplier");
         }
-        ISessionDataLoader.super.onLoad(data);
     }
 
 }

+ 49 - 0
src/main/java/com/kingtom/shengtai/app/message/ws/WsSendService.java

@@ -0,0 +1,49 @@
+package com.kingtom.shengtai.app.message.ws;
+
+import java.text.MessageFormat;
+import java.util.List;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+
+/**
+ * 应用模块名称</p>
+ * 代码描述</p>
+ * Copyright: Copyright (C) 2024 , Inc. All rights reserved. <p>
+ * Company: 成都诚唐科技有限责任公司</p>
+ *
+ * @author wany
+ * @since 2024/1/3
+ */
+@Slf4j
+@Component
+public class WsSendService{
+
+    @Autowired
+    private WsHandler wsHandler;
+
+    public void sendMsg(String text, List<String> userIds){
+        userIds.forEach(e -> sendMsg(text, e));
+    }
+
+    public void sendMsg(String text, String userId){
+        if(StringUtils.isAnyBlank(text, userId)){
+            return;
+        }
+        WebSocketSession webSocketSession = WsSessionManager.get(userId);
+        if(webSocketSession == null){
+            return;
+        }
+        TextMessage message = new TextMessage(text);
+        try{
+            wsHandler.handleTextMessage(webSocketSession, message);
+        } catch(Exception e){
+            log.warn(MessageFormat.format("发送websocket消息给用户({0})时出错,消息内容:{1}", userId, text));
+        }
+    }
+
+}

+ 2 - 4
src/main/java/com/kingtom/shengtai/app/srm/model/SrmSupplierDO.java

@@ -1,8 +1,6 @@
 package com.kingtom.shengtai.app.srm.model;
 
-import com.kingtom.kirin.app.org.model.OrgPerson;
-import com.kingtom.shengtai.api.mapper.SrmMapper;
-import com.kingtom.shengtai.api.model.SrmSupplierDTO;
+import com.kingtom.kirin.app.system.model.SystemUser;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -25,6 +23,6 @@ public class SrmSupplierDO{
 
     private SrmSupplier supplier;
 
-    private OrgPerson person;
+    private SystemUser user;
 
 }

+ 2 - 0
src/main/java/com/kingtom/shengtai/app/srm/service/ISrmSupplierService.java

@@ -30,4 +30,6 @@ public interface ISrmSupplierService extends IBaseService<SrmSupplier>{
     Page<SrmSupplierDO> page(String name, String type, String state, List<String> products, Integer pageNum,
             Integer pageSize);
 
+    void appeal(String userId, String content);
+
 }

+ 48 - 6
src/main/java/com/kingtom/shengtai/app/srm/service/impl/SrmSupplierServiceImpl.java

@@ -7,12 +7,21 @@ import java.util.Map;
 import java.util.stream.Collectors;
 
 import com.kingtom.kirin.app.org.model.OrgPerson;
+import com.kingtom.kirin.app.org.model.OrgUnit;
+import com.kingtom.kirin.app.org.service.IOrgMemberService;
 import com.kingtom.kirin.app.org.service.IOrgPersonService;
+import com.kingtom.kirin.app.org.service.IOrgService;
+import com.kingtom.kirin.app.system.model.SystemUser;
+import com.kingtom.kirin.app.system.model.SystemUserBO;
+import com.kingtom.kirin.app.system.service.ISystemService;
 import com.kingtom.kirin.app.system.utils.SystemUtils;
 import com.kingtom.kirin.core.common.base.service.impl.BaseServiceImpl;
 import com.kingtom.kirin.core.common.exception.AppException;
 import com.kingtom.kirin.core.common.utils.CollectionUtils;
 import com.kingtom.kirin.core.common.utils.IDUtils;
+import com.kingtom.shengtai.app.message.model.MsgSummary;
+import com.kingtom.shengtai.app.message.service.IMsgSummaryService;
+import com.kingtom.shengtai.app.message.ws.WsSendService;
 import com.kingtom.shengtai.app.srm.dao.ISrmSupplierDao;
 import com.kingtom.shengtai.app.srm.model.SrmSupplier;
 import com.kingtom.shengtai.app.srm.model.SrmSupplierDO;
@@ -37,7 +46,22 @@ public class SrmSupplierServiceImpl extends BaseServiceImpl<ISrmSupplierDao, Srm
         implements ISrmSupplierService{
 
     @Autowired
-    private IOrgPersonService personService;
+    private ISystemService systemService;
+
+    @Autowired
+    private IMsgSummaryService msgSummaryService;
+
+    @Autowired
+    private WsSendService wsSendService;
+
+    @Autowired
+    private IOrgService orgService;
+
+    @Autowired
+    private IOrgMemberService orgMemberService;
+
+    @Autowired
+    private IOrgPersonService orgPersonService;
 
     @Override
     public SrmSupplierDO create(SrmSupplier entity){
@@ -121,7 +145,8 @@ public class SrmSupplierServiceImpl extends BaseServiceImpl<ISrmSupplierDao, Srm
         }
         SrmSupplierDO build = SrmSupplierDO.builder().supplier(srmSupplier).build();
         if(StringUtils.isNotEmpty(srmSupplier.getPerson())){
-            build.setPerson(personService.findById(srmSupplier.getPerson()));
+            SystemUserBO systemUser = systemService.findSystemUser(srmSupplier.getPerson());
+            build.setUser(systemUser.getSystemUser());
         }
         return build;
     }
@@ -149,15 +174,32 @@ public class SrmSupplierServiceImpl extends BaseServiceImpl<ISrmSupplierDao, Srm
         }
         List<String> personIds =
                 paginate.getRecords().stream().map(SrmSupplier::getPerson).collect(Collectors.toList());
-        List<OrgPerson> people = new ArrayList<>();
+        List<SystemUser> users = new ArrayList<>();
         if(CollectionUtils.isNotEmpty(personIds)){
-            people = personService.listByIds(personIds);
+            users = systemService.findSystemUserByIds(personIds);
         }
-        Map<String, OrgPerson> personMap = people.stream().collect(Collectors.toMap(OrgPerson::getId, e -> e));
+        Map<String, SystemUser> userMap = users.stream().collect(Collectors.toMap(SystemUser::getId, e -> e));
         List<SrmSupplierDO> collect = paginate.getRecords().stream()
-                .map(e -> SrmSupplierDO.builder().supplier(e).person(personMap.get(e.getPerson())).build())
+                .map(e -> SrmSupplierDO.builder().supplier(e).user(userMap.get(e.getPerson())).build())
                 .collect(Collectors.toList());
         return new Page<>(collect, pageNum, pageSize, paginate.getTotalRow());
     }
 
+    @Override
+    public void appeal(String userId, String content){
+        MsgSummary msgSummary = new MsgSummary();
+        msgSummary.setSender(userId);
+        msgSummary.setTitle("供应商评分申诉");
+        msgSummary.setType("供应商评分申诉");
+        msgSummary.setContent(content);
+        OrgUnit defaultUnit = orgService.findDefaultUnit();
+        List<String> orgMemberPersonIds = orgMemberService.findOrgMemberPersonIds(defaultUnit.getId());
+        List<OrgPerson> people = orgPersonService.findByIds(orgMemberPersonIds);
+        List<String> userIds = people.stream().map(OrgPerson::getUserId).collect(Collectors.toList());
+        if(CollectionUtils.isNotEmpty(userIds)){
+            msgSummaryService.createMsg(msgSummary, userIds);
+            wsSendService.sendMsg(msgSummary.getType(), userIds);
+        }
+    }
+
 }

+ 10 - 0
src/main/resources/ddics/product-items.json

@@ -0,0 +1,10 @@
+[
+    {
+        "key":"yes",
+        "name":"是"
+    },
+    {
+        "key":"no",
+        "name":"否"
+    }
+]

+ 7 - 0
src/main/resources/ddics/product.json

@@ -0,0 +1,7 @@
+{
+    "name":"产品目录",
+    "simpleName":"产品目录",
+    "code":"product",
+    "des":"产品目录",
+    "sysFlag":1
+}