Browse Source

新增派单sop

wangliang 1 năm trước cách đây
mục cha
commit
5c904d3181

+ 20 - 11
sop-api/src/main/java/com/qmth/sop/server/api/TBCrmDetailController.java

@@ -3,10 +3,10 @@ package com.qmth.sop.server.api;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.exception.ApiException;
+import com.qmth.sop.business.bean.params.CrmDetailSopParam;
 import com.qmth.sop.business.bean.result.EditResult;
 import com.qmth.sop.business.entity.TBCrmDetail;
 import com.qmth.sop.business.service.TBCrmDetailService;
-import com.qmth.sop.business.service.TBCrmService;
 import com.qmth.sop.common.annotation.OperationLog;
 import com.qmth.sop.common.contant.SystemConstant;
 import com.qmth.sop.common.enums.ExceptionResultEnum;
@@ -47,24 +47,25 @@ public class TBCrmDetailController {
     @Resource
     TBCrmDetailService tbCrmDetailService;
 
-    @Resource
-    TBCrmService tbCrmService;
-
     @ApiOperation(value = "获取派单信息")
     @RequestMapping(value = "/sop/var/info", method = RequestMethod.POST)
     @OperationLog(logType = LogTypeEnum.SEARCH)
     @ApiResponses({ @ApiResponse(code = 200, message = "派单信息", response = EditResult.class) })
-    public Result info(@ApiParam(value = "派单号", required = true) @RequestParam String crmNo) {
-        return ResultUtil.ok(tbCrmService.findCrmProjectBySopNoOrCrmNo(null, crmNo));
+    public Result sopVarInfo(@ApiParam(value = "派单号", required = true) @RequestParam String crmNo) {
+        return ResultUtil.ok(tbCrmDetailService.sopVarInfo(crmNo));
     }
 
     @ApiOperation(value = "派单明细sop变量保存")
     @RequestMapping(value = "/sop/var/save", method = RequestMethod.POST)
     @OperationLog(logType = LogTypeEnum.UPDATE)
     @ApiResponses({ @ApiResponse(code = 200, message = "派单明细sop变量信息", response = EditResult.class) })
-    public Result sopVarSave(@ApiParam(value = "派单号", required = true) @RequestParam String crmNo,
-            @ApiParam(value = "过程变量", required = true) @RequestParam String processVar) {
-        return ResultUtil.ok(tbCrmDetailService.sopVarSave(crmNo, processVar));
+    public Result sopVarSave(
+            @Valid @ApiParam(value = "派单明细sop信息", required = true) @RequestBody CrmDetailSopParam crmDetailSopParam,
+            BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        return ResultUtil.ok(tbCrmDetailService.sopVarSave(crmDetailSopParam));
     }
 
     @ApiOperation(value = "获取派单明细sop信息")
@@ -81,12 +82,20 @@ public class TBCrmDetailController {
     @RequestMapping(value = "/sop/save", method = RequestMethod.POST)
     @OperationLog(logType = LogTypeEnum.ADD)
     @ApiResponses({ @ApiResponse(code = 200, message = "派单明细sop信息", response = EditResult.class) })
-    public Result sopCreate(@Valid @ApiParam(value = "派单明细sop信息", required = true) @RequestBody TBCrmDetail tbCrmDetail,
+    public Result sopSave(@Valid @ApiParam(value = "派单明细sop信息", required = true) @RequestBody TBCrmDetail tbCrmDetail,
             BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
-        return ResultUtil.ok(true);
+        return ResultUtil.ok(tbCrmDetailService.sopSave(tbCrmDetail));
+    }
+
+    @ApiOperation(value = "编辑派单明细sop")
+    @RequestMapping(value = "/sop/edit", method = RequestMethod.POST)
+    @OperationLog(logType = LogTypeEnum.ADD)
+    @ApiResponses({ @ApiResponse(code = 200, message = "派单明细sop信息", response = EditResult.class) })
+    public Result sopEdit(@ApiParam(value = "派单明细sopId", required = true) @RequestParam Long id) {
+        return ResultUtil.ok(tbCrmDetailService.getById(id));
     }
 
     @ApiOperation(value = "派单明细sop发布")

+ 5 - 4
sop-api/src/main/java/com/qmth/sop/server/api/TDFormWidgetController.java

@@ -29,17 +29,18 @@ public class TDFormWidgetController {
     TDFormWidgetService tdFormWidgetService;
 
     @ApiOperation(value = "控件查询列表")
-    @ApiResponses({@ApiResponse(code = 200, message = "控件查询列表信息", response = FormWidgetResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "控件查询列表信息", response = FormWidgetResult.class) })
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     public Result list() {
         return ResultUtil.ok(commonCacheService.formWidgetCache());
     }
 
     @ApiOperation(value = "流程控件查询")
-    @ApiResponses({@ApiResponse(code = 200, message = "流程控件查询", response = FlowFormWidgetResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "流程控件查询", response = FlowFormWidgetResult.class) })
     @RequestMapping(value = "/flow/select", method = RequestMethod.POST)
     public Result flowSelect(@ApiParam(value = "流程类型", required = true) @RequestParam TFCustomTypeEnum flowType,
-                             @ApiParam(value = "表单步骤") @RequestParam(required = false) Integer formSetup) {
-        return ResultUtil.ok(tdFormWidgetService.flowWidgetQuery(flowType, formSetup));
+            @ApiParam(value = "表单步骤") @RequestParam(required = false) Integer formSetup,
+            @ApiParam(value = "表单组") @RequestParam(required = false) Integer formGroup) {
+        return ResultUtil.ok(tdFormWidgetService.flowWidgetQuery(flowType, formSetup, formGroup));
     }
 }

+ 40 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/params/CrmDetailSopParam.java

@@ -0,0 +1,40 @@
+package com.qmth.sop.business.bean.params;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 派单明细sop参数
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2024/5/15
+ */
+public class CrmDetailSopParam implements Serializable {
+
+    @ApiModelProperty("派单号")
+    @NotNull(message = "派单号不能为空")
+    private String crmNo;
+
+    @ApiModelProperty("过程变量")
+    @NotNull(message = "过程变量不能为空")
+    private String processVar;
+
+    public String getCrmNo() {
+        return crmNo;
+    }
+
+    public void setCrmNo(String crmNo) {
+        this.crmNo = crmNo;
+    }
+
+    public String getProcessVar() {
+        return processVar;
+    }
+
+    public void setProcessVar(String processVar) {
+        this.processVar = processVar;
+    }
+}

+ 13 - 0
sop-business/src/main/java/com/qmth/sop/business/entity/TBCrmDetail.java

@@ -97,6 +97,19 @@ public class TBCrmDetail extends BaseEntity implements Serializable {
         insertInfo(userId);
     }
 
+    /**
+     * 创建sop
+     *
+     * @param flowDeploymentId
+     * @param userId
+     */
+    public void createSop(String flowDeploymentId, Long userId) {
+        setId(SystemConstant.getDbUuid());
+        this.flowDeploymentId = flowDeploymentId;
+        this.status = CrmStatusEnum.UN_PUBLISH;
+        insertInfo(userId);
+    }
+
     public String getCrmNo() {
         return crmNo;
     }

+ 29 - 3
sop-business/src/main/java/com/qmth/sop/business/service/TBCrmDetailService.java

@@ -2,7 +2,10 @@ package com.qmth.sop.business.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.sop.business.bean.params.CrmDetailSopParam;
+import com.qmth.sop.business.bean.result.CrmProjectResult;
 import com.qmth.sop.business.entity.TBCrmDetail;
+import com.qmth.sop.business.entity.TFCustomFlow;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.Map;
@@ -18,13 +21,20 @@ import java.util.Map;
 public interface TBCrmDetailService extends IService<TBCrmDetail> {
 
     /**
-     * 派单明细sop变量保存
+     * 查找派单sop信息
      *
      * @param crmNo
-     * @param processVar
      * @return
      */
-    public boolean sopVarSave(String crmNo, String processVar);
+    public CrmProjectResult sopVarInfo(String crmNo);
+
+    /**
+     * 派单明细sop变量保存
+     *
+     * @param crmDetailSopParam
+     * @return
+     */
+    public boolean sopVarSave(CrmDetailSopParam crmDetailSopParam);
 
     /**
      * 派单明细sop导入
@@ -43,4 +53,20 @@ public interface TBCrmDetailService extends IService<TBCrmDetail> {
      * @return
      */
     public IPage<TBCrmDetail> list(IPage<Map> iPage, String crmNo);
+
+    /**
+     * 创建/编辑派单明细sop
+     *
+     * @param tbCrmDetail
+     * @return
+     */
+    public boolean sopSave(TBCrmDetail tbCrmDetail);
+
+    /**
+     * 查询自定义流程
+     *
+     * @param crmNo
+     * @return
+     */
+    public TFCustomFlow queryCustomFlow(String crmNo);
 }

+ 2 - 1
sop-business/src/main/java/com/qmth/sop/business/service/TDFormWidgetService.java

@@ -22,7 +22,8 @@ public interface TDFormWidgetService extends IService<TDFormWidget> {
      *
      * @param flowType
      * @param formSetup
+     * @param formGroup
      * @return
      */
-    List<FlowFormWidgetResult> flowWidgetQuery(TFCustomTypeEnum flowType, Integer formSetup);
+    List<FlowFormWidgetResult> flowWidgetQuery(TFCustomTypeEnum flowType, Integer formSetup, Integer formGroup);
 }

+ 99 - 22
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBCrmDetailServiceImpl.java

@@ -5,18 +5,19 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.sop.business.bean.dto.CrmDetailImportDto;
+import com.qmth.sop.business.bean.params.CrmDetailSopParam;
+import com.qmth.sop.business.bean.result.CrmProjectResult;
+import com.qmth.sop.business.bean.result.FlowFormWidgetResult;
 import com.qmth.sop.business.entity.*;
 import com.qmth.sop.business.mapper.TBCrmDetailMapper;
-import com.qmth.sop.business.service.TBCrmDetailService;
-import com.qmth.sop.business.service.TBCrmService;
-import com.qmth.sop.business.service.TBServiceService;
-import com.qmth.sop.business.service.TFCustomFlowService;
+import com.qmth.sop.business.service.*;
 import com.qmth.sop.business.util.excel.BasicExcelListener;
 import com.qmth.sop.common.contant.SystemConstant;
 import com.qmth.sop.common.enums.ExceptionResultEnum;
 import com.qmth.sop.common.enums.FieldUniqueEnum;
 import com.qmth.sop.common.enums.ProductTypeEnum;
 import com.qmth.sop.common.enums.TFCustomTypeEnum;
+import com.qmth.sop.common.util.JacksonUtil;
 import com.qmth.sop.common.util.ResultUtil;
 import com.qmth.sop.common.util.ServletUtil;
 import org.apache.commons.collections4.CollectionUtils;
@@ -57,19 +58,49 @@ public class TBCrmDetailServiceImpl extends ServiceImpl<TBCrmDetailMapper, TBCrm
     @Resource
     TBServiceService tbServiceService;
 
+    @Resource
+    TDFormWidgetService tdFormWidgetService;
+
     /**
-     * 派单明细sop变量保存
+     * 查找派单sop信息
      *
      * @param crmNo
-     * @param processVar
+     * @return
+     */
+    @Override
+    public CrmProjectResult sopVarInfo(String crmNo) {
+        CrmProjectResult crmProjectResult = tbCrmService.findCrmProjectBySopNoOrCrmNo(null, crmNo);
+        Objects.requireNonNull(crmProjectResult, "未找到派单信息");
+
+        TBCrm tbCrm = tbCrmService.findByCrmNo(crmNo);
+        TBService tbService = tbServiceService.getById(tbCrm.getServiceId());
+        Objects.requireNonNull(tbService, "未找到服务单元");
+
+        if (Objects.isNull(crmProjectResult.getProcessVar())) {
+            if (tbService.getType() == ProductTypeEnum.OFFICE) {
+                List<FlowFormWidgetResult> flowFormWidgetResultList = tdFormWidgetService.flowWidgetQuery(
+                        TFCustomTypeEnum.OFFICE_SOP_FLOW, 1, SystemConstant.OFFICE_COMMON_GROUP);
+                if (CollectionUtils.isEmpty(flowFormWidgetResultList)) {
+                    throw ExceptionResultEnum.ERROR.exception("教务处sop公用控件未设置");
+                }
+                crmProjectResult.setProcessVar(JacksonUtil.parseJson(flowFormWidgetResultList));
+            }
+        }
+        return crmProjectResult;
+    }
+
+    /**
+     * 派单明细sop变量保存
+     *
+     * @param crmDetailSopParam
      * @return
      */
     @Override
     @Transactional
-    public boolean sopVarSave(String crmNo, String processVar) {
+    public boolean sopVarSave(CrmDetailSopParam crmDetailSopParam) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        TBCrm tbCrm = tbCrmService.findByCrmNo(crmNo);
-        tbCrm.updateProcessVar(processVar, sysUser.getId());
+        TBCrm tbCrm = tbCrmService.findByCrmNo(crmDetailSopParam.getCrmNo());
+        tbCrm.updateProcessVar(crmDetailSopParam.getProcessVar(), sysUser.getId());
         return tbCrmService.updateById(tbCrm);
     }
 
@@ -87,19 +118,7 @@ public class TBCrmDetailServiceImpl extends ServiceImpl<TBCrmDetailMapper, TBCrm
         long start = System.currentTimeMillis();
 
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        TBCrm tbCrm = tbCrmService.findByCrmNo(crmNo);
-        if (Objects.isNull(tbCrm.getProcessVar()) || Objects.equals(tbCrm.getProcessVar().trim(), "")) {
-            throw ExceptionResultEnum.ERROR.exception("请先保存属性【部署方式】【阅卷方式】【扫描场地网络】");
-        }
-        TBService tbService = tbServiceService.getById(tbCrm.getServiceId());
-        Objects.requireNonNull(tbService, "未找到服务单元");
-
-        TFCustomFlow tfCustomFlow = null;
-        if (tbService.getType() == ProductTypeEnum.OFFICE) {
-            tfCustomFlow = tfCustomFlowService.findMaxVersion(null, null, TFCustomTypeEnum.OFFICE_SOP_FLOW);
-        }
-        Objects.requireNonNull(tfCustomFlow, "未找到教务处流程");
-
+        TFCustomFlow tfCustomFlow = tbCrmDetailService.queryCustomFlow(crmNo);
         Map<String, String> messageMap = new LinkedHashMap<>();
         try {
             StringJoiner errorData = new StringJoiner("");
@@ -166,4 +185,62 @@ public class TBCrmDetailServiceImpl extends ServiceImpl<TBCrmDetailMapper, TBCrm
     public IPage<TBCrmDetail> list(IPage<Map> iPage, String crmNo) {
         return this.baseMapper.list(iPage, crmNo);
     }
+
+    /**
+     * 创建/编辑派单明细sop
+     *
+     * @param tbCrmDetail
+     * @return
+     */
+    @Override
+    @Transactional
+    public boolean sopSave(TBCrmDetail tbCrmDetail) {
+        try {
+            SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+            if (Objects.isNull(tbCrmDetail.getId())) {//说明创建sop
+                TFCustomFlow tfCustomFlow = tbCrmDetailService.queryCustomFlow(tbCrmDetail.getCrmNo());
+                tbCrmDetail.createSop(tfCustomFlow.getFlowDeploymentId(), sysUser.getId());
+            } else {
+                tbCrmDetail.updateInfo(sysUser.getId());
+            }
+            return tbCrmDetailService.saveOrUpdate(tbCrmDetail);
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            if (e instanceof DuplicateKeyException) {
+                String errorColumn = e.getCause().toString();
+                String[] strs = StringUtils.split(errorColumn, "-");
+                String[] columns = StringUtils.split(strs[strs.length - 1], "\\'");
+                throw ExceptionResultEnum.SQL_ERROR.exception(
+                        FieldUniqueEnum.convertToTitle(columns[columns.length - 1]) + ":[" + columns[0] + "]数据不允许重复插入");
+            } else if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 查询自定义流程
+     *
+     * @param crmNo
+     * @return
+     */
+    @Override
+    public TFCustomFlow queryCustomFlow(String crmNo) {
+        TBCrm tbCrm = tbCrmService.findByCrmNo(crmNo);
+        if (Objects.isNull(tbCrm.getProcessVar()) || Objects.equals(tbCrm.getProcessVar().trim(), "")) {
+            throw ExceptionResultEnum.ERROR.exception("请先保存属性【部署方式】【阅卷方式】【扫描场地网络】");
+        }
+        TBService tbService = tbServiceService.getById(tbCrm.getServiceId());
+        Objects.requireNonNull(tbService, "未找到服务单元");
+
+        TFCustomFlow tfCustomFlow = null;
+        if (tbService.getType() == ProductTypeEnum.OFFICE) {
+            tfCustomFlow = tfCustomFlowService.findMaxVersion(null, null, TFCustomTypeEnum.OFFICE_SOP_FLOW);
+        }
+        Objects.requireNonNull(tfCustomFlow, "未找到教务处流程");
+        return tfCustomFlow;
+    }
 }

+ 21 - 9
sop-business/src/main/java/com/qmth/sop/business/service/impl/TDFormWidgetServiceImpl.java

@@ -34,7 +34,8 @@ import java.util.stream.Collectors;
  * @since 2023-07-17
  */
 @Service
-public class TDFormWidgetServiceImpl extends ServiceImpl<TDFormWidgetMapper, TDFormWidget> implements TDFormWidgetService {
+public class TDFormWidgetServiceImpl extends ServiceImpl<TDFormWidgetMapper, TDFormWidget>
+        implements TDFormWidgetService {
 
     @Resource
     CommonCacheService commonCacheService;
@@ -44,30 +45,41 @@ public class TDFormWidgetServiceImpl extends ServiceImpl<TDFormWidgetMapper, TDF
      *
      * @param flowType
      * @param formSetup
+     * @param formGroup
      * @return
      */
     @Override
-    public List<FlowFormWidgetResult> flowWidgetQuery(TFCustomTypeEnum flowType, Integer formSetup) {
+    public List<FlowFormWidgetResult> flowWidgetQuery(TFCustomTypeEnum flowType, Integer formSetup, Integer formGroup) {
         QueryWrapper<TDFormWidget> tdFormWidgetQueryWrapper = new QueryWrapper<>();
-        tdFormWidgetQueryWrapper.lambda().eq(TDFormWidget::getFlowType, flowType).eq(TDFormWidget::getType, WidgetTypeEnum.FORM).orderByAsc(TDFormWidget::getCreateTime);
+        tdFormWidgetQueryWrapper.lambda().eq(TDFormWidget::getFlowType, flowType)
+                .eq(TDFormWidget::getType, WidgetTypeEnum.FORM).orderByAsc(TDFormWidget::getCreateTime);
         if (Objects.nonNull(formSetup)) {
             tdFormWidgetQueryWrapper.lambda().eq(TDFormWidget::getFormSetup, formSetup);
         }
+        if (Objects.nonNull(formGroup)) {
+            tdFormWidgetQueryWrapper.lambda().eq(TDFormWidget::getFormGroup, formGroup);
+        }
         List<TDFormWidget> tdFormWidgetList = this.list(tdFormWidgetQueryWrapper);
         List<FlowFormWidgetResult> flowFormWidgetResultList = null;
         if (!CollectionUtils.isEmpty(tdFormWidgetList)) {
-            flowFormWidgetResultList = GsonUtil.fromJson(JacksonUtil.parseJson(tdFormWidgetList), new TypeToken<List<FlowFormWidgetResult>>() {
-            }.getType());
-            Set<FlowFormWidgetResult> flowFormWidgetResultSet = flowFormWidgetResultList.stream().filter(s -> s.getCode() == WidgetCodeEnum.TABLE).collect(Collectors.toSet());
+            flowFormWidgetResultList = GsonUtil.fromJson(JacksonUtil.parseJson(tdFormWidgetList),
+                    new TypeToken<List<FlowFormWidgetResult>>() {
+
+                    }.getType());
+            Set<FlowFormWidgetResult> flowFormWidgetResultSet = flowFormWidgetResultList.stream()
+                    .filter(s -> s.getCode() == WidgetCodeEnum.TABLE).collect(Collectors.toSet());
             if (!CollectionUtils.isEmpty(flowFormWidgetResultSet)) {
                 for (FlowFormWidgetResult f : flowFormWidgetResultSet) {
                     List<TDTableProp> tdTablePropList = commonCacheService.tablePropCache(f.getId());
                     if (!CollectionUtils.isEmpty(tdTablePropList)) {
-                        List<FlowTablePropResult> flowTablePropResultList = GsonUtil.fromJson(JacksonUtil.parseJson(tdTablePropList), new TypeToken<List<FlowTablePropResult>>() {
-                        }.getType());
+                        List<FlowTablePropResult> flowTablePropResultList = GsonUtil.fromJson(
+                                JacksonUtil.parseJson(tdTablePropList), new TypeToken<List<FlowTablePropResult>>() {
+
+                                }.getType());
                         for (FlowTablePropResult tf : flowTablePropResultList) {
                             TDFormWidget tdFormWidget = commonCacheService.formWidgetCache(tf.getEditWidgetId());
-                            FlowTdFormWidgetResult flowTdFormWidgetResult = GsonUtil.fromJson(GsonUtil.toJson(tdFormWidget), FlowTdFormWidgetResult.class);
+                            FlowTdFormWidgetResult flowTdFormWidgetResult = GsonUtil.fromJson(
+                                    GsonUtil.toJson(tdFormWidget), FlowTdFormWidgetResult.class);
                             tf.setTdFormWidget(flowTdFormWidgetResult);
                         }
                         f.setTablePropList(flowTablePropResultList);

+ 3 - 0
sop-business/src/main/resources/db/log/wangliang_update_log.sql

@@ -66,6 +66,9 @@ VALUES(3085, '派单明细sop发布', '/api/admin/tb/crm/detail/sop/publish', 'U
 INSERT INTO sys_privilege
 (id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
 VALUES(3086, '派单明细sop删除', '/api/admin/tb/crm/detail/sop/delete', 'URL', 3079, 7, 'AUTH', NULL, 1, 1, 0);
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(3087, '编辑派单明细sop', '/api/admin/tb/crm/detail/sop/edit', 'URL', 3079, 8, 'AUTH', NULL, 1, 1, 0);
 
 -- 2024-05-15
 ALTER TABLE t_b_crm ADD process_var MEDIUMTEXT

+ 1 - 0
sop-common/src/main/java/com/qmth/sop/common/contant/SystemConstant.java

@@ -116,6 +116,7 @@ public class SystemConstant {
     public static final String SOP = "SOP";
     public static final String RTZF_TENANT_ID = "tenantId";
     public static final String LIMIT1 = "limit 1";
+    public static final int OFFICE_COMMON_GROUP = 1000;
 
     /**
      * 微信app