Jelajahi Sumber

表单接口提交

chenc 3 tahun lalu
induk
melakukan
f2bc5567a7
13 mengubah file dengan 222 tambahan dan 28 penghapusan
  1. 3 0
      jeecg-boot/jeecg-boot-base-common/src/main/java/org/jeecg/common/system/controller/CommonController.java
  2. 1 1
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/config/ActivitiDataSourceConfig.java
  3. 4 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/entity/ActNode.java
  4. 2 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/entity/ActZprocess.java
  5. 2 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/entity/ProcessNodeVo.java
  6. 11 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/entity/TbTableInfo.java
  7. 1 1
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/mapper/TbTableInfoMapper.java
  8. 2 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/service/ITbTableInfoService.java
  9. 9 2
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/service/Impl/ActBusinessServiceImpl.java
  10. 22 0
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/service/Impl/TbTableInfoServiceImpl.java
  11. 82 20
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/ActBusinessController.java
  12. 31 2
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/ActivitiProcessController.java
  13. 52 2
      jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/TbTableInfoController.java

+ 3 - 0
jeecg-boot/jeecg-boot-base-common/src/main/java/org/jeecg/common/system/controller/CommonController.java

@@ -405,6 +405,9 @@ public class CommonController {
 			if(mf==null){
 				mf = multipartRequest.getFile("image");// 获取上传文件对象
 			}
+			if(mf==null){
+				mf = multipartRequest.getFile("png");// 获取上传文件对象
+			}
 			String orgName = mf.getOriginalFilename();// 获取文件名
 			fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf("."));
 			String savePath = file.getPath() + File.separator + fileName;

+ 1 - 1
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/config/ActivitiDataSourceConfig.java

@@ -33,7 +33,7 @@ public class ActivitiDataSourceConfig extends AbstractProcessEngineAutoConfigura
     @Bean
     public ConfigurableServletWebServerFactory webServerFactory() {
         TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
-        factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> connector.setProperty("relaxedQueryChars", "|{}[]\\"));
+        factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> connector.setProperty("relaxedQueryChars", "|{}[]!@#$%^&*()_+:',./\\"));
         return factory;
     }
 

+ 4 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/entity/ActNode.java

@@ -67,4 +67,8 @@ public class ActNode {
 	@Excel(name = "关联其他表id", width = 15)
     @ApiModelProperty(value = "关联其他表id")
 	private String relateId;
+	/**表单编辑器相关表信息id*/
+	@Excel(name = "表单编辑器相关表信息id", width = 15)
+	@ApiModelProperty(value = "表单编辑器相关表信息id")
+	private String tbTableInfoId;
 }

+ 2 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/entity/ActZprocess.java

@@ -103,4 +103,6 @@ public class ActZprocess {
 	@Excel(name = "授权的角色", width = 15)
     @ApiModelProperty(value = "授权的角色")
 	private String roles;
+	//图标地址
+	private String iconAddress;
 }

+ 2 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/entity/ProcessNodeVo.java

@@ -27,4 +27,6 @@ public class ProcessNodeVo {
     private Boolean chooseSponsor = false;
     /**节点展开 前端所需*/
     private Boolean expand = true;
+    /**关联表单*/
+    private String tbTableInfoId;
 }

+ 11 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/entity/TbTableInfo.java

@@ -40,6 +40,17 @@ public class TbTableInfo {
     private String pkOrg;
     private String routeName;
 
+    //步骤描述
+    private String stepMemo;
+    //流程id
+    private String processId;
+    //流程任务节点id
+    private String taskNodeId;
+
+    private String delFlag;
+    //是否初始表单0否1是
+    private String isInitial;
+
     public TbTableInfo() {
     }
 }

+ 1 - 1
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/mapper/TbTableInfoMapper.java

@@ -13,7 +13,7 @@ public interface TbTableInfoMapper extends BaseMapper<TbTableInfo> {
     @Select("select * from tb_table_info")
     List<Map> getList();
 
-    @Select("SELECT TABLE_NAME as tableName,TABLE_COMMENT as tableComment FROM INFORMATION_SCHEMA.TABLES  WHERE TABLE_SCHEMA = 'jeecg-boot'")
+    @Select("SELECT TABLE_NAME as tableName,TABLE_COMMENT as tableComment FROM INFORMATION_SCHEMA.TABLES  WHERE TABLE_SCHEMA = 'cd_work_flow_dev'")
     List<Map<String,Object>> getTableList();
 
     /**

+ 2 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/service/ITbTableInfoService.java

@@ -11,4 +11,6 @@ public interface ITbTableInfoService  extends IService<TbTableInfo> {
     List<Map<String,Object>> getTableList();
 
     List<Map<String,Object>> getTableColumnList( String tableName);
+
+    void updateTbTableInfo(TbTableInfo tbTableInfo);
 }

+ 9 - 2
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/service/Impl/ActBusinessServiceImpl.java

@@ -60,9 +60,9 @@ public class ActBusinessServiceImpl extends ServiceImpl<ActBusinessMapper, ActBu
                 for (String filed : fileds) {
                     filedsB.append(","+filed);
                     if(!request.getParameter(filed).equals("")){
-                        filedsVB.append(",'"+request.getParameter(filed)+"'");
+                        filedsVB.append(",'"+getValueString(request.getParameter(filed))+"'");
                     }else{
-                        filedsVB.append(",'"+request.getParameter(filed+"[]")+"'");
+                        filedsVB.append(",'"+getValueString(request.getParameter(filed+"[]"))+"'");
                     }
 
                 }
@@ -210,6 +210,13 @@ public class ActBusinessServiceImpl extends ServiceImpl<ActBusinessMapper, ActBu
         }
     }
 
+    public String getValueString(String valueString){
+        if(valueString==null||valueString.equals("null")){
+            valueString="";
+        }
+        return valueString;
+    }
+
     public Map<String, Object> getApplyForm(String tableId, String tableName) {
         return this.baseMapper.getBusiData(tableId, tableName);
     }

+ 22 - 0
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/service/Impl/TbTableInfoServiceImpl.java

@@ -1,6 +1,9 @@
 package org.jeecg.modules.activiti.service.Impl;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang.StringUtils;
 import org.jeecg.modules.activiti.entity.TbTableInfo;
 import org.jeecg.modules.activiti.mapper.TbTableInfoMapper;
 import org.jeecg.modules.activiti.service.ITbTableInfoService;
@@ -36,4 +39,23 @@ public class TbTableInfoServiceImpl extends ServiceImpl<TbTableInfoMapper, TbTab
         tableColumnList.addAll(h);
         return tableColumnList;
     }
+
+    @Override
+    public void updateTbTableInfo(TbTableInfo tbTableInfo) {
+        //如果当前修改对象有是否初始表单的值则得先把这个表下面其他的清除,因为次参数只能包含同表数据中其中一条带有次属性的值
+        TbTableInfo tbTableInfoGet=tbTableInfoMapper.selectById(tbTableInfo.getId());
+        if(StringUtils.isNotBlank(tbTableInfo.getIsInitial())){
+            //修改参数
+            TbTableInfo updateIsInitialTbTableInfo=new TbTableInfo();
+            updateIsInitialTbTableInfo.setId(tbTableInfo.getId());
+            updateIsInitialTbTableInfo.setIsInitial("0");
+            //修改条件
+            QueryWrapper<TbTableInfo> queryWrapper=new QueryWrapper<>();
+            queryWrapper.lambda().eq(TbTableInfo::getDelFlag,"0");
+            queryWrapper.lambda().eq(TbTableInfo::getBusinessTable,tbTableInfoGet.getBusinessTable());
+            //修改
+            tbTableInfoMapper.update(updateIsInitialTbTableInfo,queryWrapper);
+        }
+        tbTableInfoMapper.updateById(tbTableInfo);
+    }
 }

+ 82 - 20
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/ActBusinessController.java

@@ -18,6 +18,7 @@ import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.activiti.entity.ActBusiness;
 import org.jeecg.modules.activiti.entity.ActZprocess;
 import org.jeecg.modules.activiti.entity.ActivitiConstant;
+import org.jeecg.modules.activiti.entity.ProcessNodeVo;
 import org.jeecg.modules.activiti.service.Impl.ActBusinessServiceImpl;
 import org.jeecg.modules.activiti.service.Impl.ActZprocessServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -58,29 +59,90 @@ public class ActBusinessController {
     /*添加申请草稿状态*/
     @RequestMapping(value = "/add", method = RequestMethod.POST)
     public Result add(HttpServletRequest request) throws IOException {
-        String procDefId = request.getParameter("procDefId");
-        String procDeTitle = request.getParameter("procDeTitle");
-        String tableName = request.getParameter("tableName");
-        /*保存业务表单数据到数据库表*/
-        String tableId = IdUtil.simpleUUID();
-        actBusinessService.saveApplyForm(tableId,request);
-        // 保存至我的申请业务
-        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-        String username = sysUser.getUsername();
-        ActBusiness actBusiness = new ActBusiness();
-        actBusiness.setUserId(username);
-        actBusiness.setTableId(tableId);
-        actBusiness.setProcDefId(procDefId);
-        String title = request.getParameter(ActivitiConstant.titleKey);
-        if (StrUtil.isNotBlank(title)){
-            actBusiness.setTitle(title);
+        Result result=new Result();
+        try {
+            String procDefId = request.getParameter("procDefId");
+            String procDeTitle = request.getParameter("procDeTitle");
+            String tableName = request.getParameter("tableName");
+            //获取审核人
+            ProcessNodeVo node = actZprocessService.getFirstNode(procDefId);
+//            if(node.getUsers()==null||node.getUsers().size()<=0){
+//                result.error500("流程审核人没关联");
+//            }
+            /*保存业务表单数据到数据库表*/
+            String tableId = IdUtil.simpleUUID();
+            actBusinessService.saveApplyForm(tableId,request);
+            // 保存至我的申请业务
+            LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+            String username = sysUser.getUsername();
+            ActBusiness actBusiness = new ActBusiness();
+            actBusiness.setUserId(username);
+            actBusiness.setTableId(tableId);
+            actBusiness.setProcDefId(procDefId);
+            String title = request.getParameter(ActivitiConstant.titleKey);
+            if (StrUtil.isNotBlank(title)){
+                actBusiness.setTitle(title);
+            }else {
+                actBusiness.setTitle(procDeTitle);
+            }
+            actBusiness.setTableName(tableName);
+            actBusinessService.save(actBusiness);
+            submit(actBusiness,node);
+            result.success("操作成功");
+
+        } catch (IOException e) {
+            e.printStackTrace();
+            result.error500("操作失败:"+e.getMessage());
+        }
+        return result;
+    }
+
+    //提交
+    public void submit(ActBusiness act,ProcessNodeVo node){
+        //获取审核人
+        String assignees="";
+        for(LoginUser l: node.getUsers()){
+            if(assignees.equals("")){
+                assignees=l.getUsername();
+            }else{
+                assignees=assignees+","+l.getUsername();
+            }
+        }
+        act.setAssignees(assignees);
+        //优先级
+        act.setPriority(0);
+        //站内消息通知
+        act.setSendMessage(true);
+        //第一个节点是否为网关
+        if(node.getType()==3||node.getType()==4){
+            act.setFirstGateway(true);
         }else {
-            actBusiness.setTitle(procDeTitle);
+            act.setFirstGateway(false);
         }
-        actBusiness.setTableName(tableName);
-        actBusinessService.save(actBusiness);
-        return Result.ok();
+        //提交
+        ActBusiness actBusiness = actBusinessService.getById(act.getId());
+//        if(actBusiness==null){
+//            return Result.error("actBusiness表中该id不存在");
+//        }
+        String tableId = actBusiness.getTableId();
+        String tableName = actBusiness.getTableName();
+        act.setTableId(tableId);
+        Map<String, Object> busiData = actBusinessService.getBaseMapper().getBusiData(tableId, tableName);
+
+        if (MapUtil.isNotEmpty(busiData)&&busiData.get(ActivitiConstant.titleKey)!=null){
+            //如果表单里有 标题  更新一下
+            actBusiness.setTitle(busiData.get(ActivitiConstant.titleKey)+"");
+        }
+        String processInstanceId = actZprocessService.startProcess(act);
+        actBusiness.setProcInstId(processInstanceId);
+        actBusiness.setStatus(1);
+        actBusiness.setResult(1);
+        actBusiness.setApplyTime(new Date());
+        actBusinessService.updateById(actBusiness);
     }
+
+
+
     /*获取业务表单信息*/
     @RequestMapping(value = "/getForm", method = RequestMethod.GET)
     public Result getForm(HttpServletRequest request){

+ 31 - 2
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/ActivitiProcessController.java

@@ -3,6 +3,7 @@ package org.jeecg.modules.activiti.web;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import io.swagger.annotations.ApiOperation;
@@ -64,7 +65,8 @@ public class ActivitiProcessController {
         String zx = request.getParameter("zx");
         String status = request.getParameter("status");
         LambdaQueryWrapper<ActZprocess> wrapper = new LambdaQueryWrapper<ActZprocess>();
-        wrapper.orderByDesc(ActZprocess::getProcessKey).orderByDesc(ActZprocess::getVersion);
+        wrapper.orderByDesc(ActZprocess::getCreateTime);
+//                .orderByDesc(ActZprocess::getName).orderByDesc(ActZprocess::getVersion);
         if (StrUtil.isNotBlank(lcmc)){
             wrapper.like(ActZprocess::getName, lcmc);
         }
@@ -206,6 +208,20 @@ public class ActivitiProcessController {
         actZprocessService.updateById(actProcess);
         return Result.ok("修改成功");
     }
+    @RequestMapping(value = "/updateInfo2", method = RequestMethod.POST)
+    public Result<Object> updateInfo2(@RequestBody ActZprocess actProcess){
+
+        ProcessDefinition pd = repositoryService.getProcessDefinition(actProcess.getId());
+        if(pd==null){
+            return Result.error("流程定义不存在");
+        }
+        if(StrUtil.isNotBlank(actProcess.getCategoryId())){
+            repositoryService.setProcessDefinitionCategory(actProcess.getId(), actProcess.getCategoryId());
+            repositoryService.setDeploymentCategory(pd.getDeploymentId(), actProcess.getCategoryId());
+        }
+        actZprocessService.updateById(actProcess);
+        return Result.ok("修改成功");
+    }
     /*通过流程定义id获取流程节点*/
     @RequestMapping(value = "/getProcessNode")
     public Result getProcessNode(String id){
@@ -240,6 +256,14 @@ public class ActivitiProcessController {
                     node.setChooseDepHeader(actNodeService.hasChooseDepHeader(element.getId()));
                     // 是否设置发起人
                     node.setChooseSponsor(actNodeService.hasChooseSponsor(element.getId()));
+                    //设置关联表单
+                   List<ActNode> actNodeList=  actNodeService.list(new QueryWrapper<ActNode>().eq("node_id",element.getId()));
+                   if(actNodeList!=null&&actNodeList.size()>0){
+                       node.setTbTableInfoId(actNodeList.get(0).getTbTableInfoId());
+                   }else{
+                       node.setTbTableInfoId("");
+                   }
+
                 }else if(element instanceof EndEvent){
                     // 结束
                     node.setType(2);
@@ -264,13 +288,14 @@ public class ActivitiProcessController {
      * @return
      */
     @RequestMapping(value = "/editNodeUser", method = RequestMethod.POST)
-    public Result editNodeUser(String nodeId, String userIds, String roleIds, String departmentIds, Boolean chooseDepHeader, Boolean chooseSponsor){
+    public Result editNodeUser(String nodeId, String userIds, String roleIds, String departmentIds, Boolean chooseDepHeader, Boolean chooseSponsor,String tbTableInfoId){
 
         // 删除其关联权限
         actNodeService.deleteByNodeId(nodeId);
         // 分配新用户
         for(String userId : userIds.split(",")){
             ActNode actNode = new ActNode();
+            actNode.setTbTableInfoId(tbTableInfoId);
             actNode.setNodeId(nodeId);
             actNode.setRelateId(userId);
             actNode.setType(1);
@@ -279,6 +304,7 @@ public class ActivitiProcessController {
         // 分配新角色
         for(String roleId : roleIds.split(",")){
             ActNode actNode = new ActNode();
+            actNode.setTbTableInfoId(tbTableInfoId);
             actNode.setNodeId(nodeId);
             actNode.setRelateId(roleId);
             actNode.setType(0);
@@ -287,6 +313,7 @@ public class ActivitiProcessController {
         // 分配新部门
         for(String departmentId : departmentIds.split(",")){
             ActNode actNode = new ActNode();
+            actNode.setTbTableInfoId(tbTableInfoId);
             actNode.setNodeId(nodeId);
             actNode.setRelateId(departmentId);
             actNode.setType(2);
@@ -294,12 +321,14 @@ public class ActivitiProcessController {
         }
         if(chooseDepHeader!=null&&chooseDepHeader){
             ActNode actNode = new ActNode();
+            actNode.setTbTableInfoId(tbTableInfoId);
             actNode.setNodeId(nodeId);
             actNode.setType(4);
             actNodeService.save(actNode);
         }
         if(chooseSponsor!=null&&chooseSponsor){
             ActNode actNode = new ActNode();
+            actNode.setTbTableInfoId(tbTableInfoId);
             actNode.setNodeId(nodeId);
             actNode.setType(3);
             actNodeService.save(actNode);

+ 52 - 2
jeecg-boot/jeecg-boot-module-activiti/src/main/java/org/jeecg/modules/activiti/web/TbTableInfoController.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.modules.activiti.entity.TbTableInfo;
@@ -27,7 +28,7 @@ public class TbTableInfoController {
    @ResponseBody
     @RequestMapping("/list")
     public Result<Object> list(){
-        List<TbTableInfo> list = tbTableInfoService.list();
+        List<TbTableInfo> list = tbTableInfoService.list(new QueryWrapper<TbTableInfo>().orderByAsc("create_time").groupBy("business_table"));
         for(TbTableInfo t : list){
             Object obj = JSONObject.parseObject(t.getContent());
             t.setJsonContent(obj);
@@ -35,12 +36,13 @@ public class TbTableInfoController {
         return Result.ok(list);
     }
 
+
     /**
      * @desc 新增
      */
     @PostMapping("/add")
     public Result<Object> add(@RequestBody TbTableInfo tbTableInfo){
-        TbTableInfo tableInfo = tbTableInfoService.getOne(new QueryWrapper<TbTableInfo>().eq("business_table", tbTableInfo.getBusinessTable()));
+        TbTableInfo tableInfo = tbTableInfoService.getOne(new QueryWrapper<TbTableInfo>().eq("business_table", tbTableInfo.getBusinessTable()).eq("step_memo",tbTableInfo.getStepMemo()));
         String  jsonContent = JSON.toJSONString(tbTableInfo.getJsonContent());
         tbTableInfo.setContent(jsonContent);
         if(tableInfo != null){
@@ -55,6 +57,34 @@ public class TbTableInfoController {
         }
     }
 
+    /**
+    * @Author chenchuang
+    * @Description //TODO 根据查询条件查询
+    * @Date 2021/7/22 15:20
+    * @Param [tbTableInfo]
+    * @return org.jeecg.common.api.vo.Result<java.lang.Object>
+    */
+    @RequestMapping("/queryList")
+    public Result<Object> queryList(TbTableInfo tbTableInfo){
+        Result result=new Result();
+        List<TbTableInfo> tableInfo = null;
+        try {
+            QueryWrapper<TbTableInfo> queryWrapper = new QueryWrapper<TbTableInfo>();
+            queryWrapper.lambda().eq(TbTableInfo::getDelFlag,"0");
+            if(!tbTableInfo.getBusinessTable().equals("null")){
+                queryWrapper.lambda().eq(TbTableInfo::getBusinessTable,tbTableInfo.getBusinessTable());
+            }
+
+            tableInfo = tbTableInfoService.list(queryWrapper);
+            result.setResult(tableInfo);
+            result.success("操作成功");
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.error500("操作失败:"+e.getMessage());
+        }
+        return result;
+    }
+
     /**
      * @desc 条件查询
      */
@@ -112,4 +142,24 @@ public class TbTableInfoController {
         }
         return result;
     }
+
+    /**
+    * @Author chenchuang
+    * @Description //TODO 修改表单编辑器相关表单
+    * @Date 2021/7/22 18:03
+    * @Param [tbTableInfo]
+    * @return org.jeecg.common.api.vo.Result
+    */
+    @PutMapping("/updateTbTableInfo")
+    public Result updateTbTableInfo(@RequestBody TbTableInfo tbTableInfo){
+        Result result=new Result();
+        try {
+            tbTableInfoService.updateTbTableInfo(tbTableInfo);
+            result.success("修改成功");
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.error500("修改失败:"+e.getMessage());
+        }
+        return result;
+    }
 }