Veronique před 1 rokem
rodič
revize
0216bb8689

+ 2 - 0
conf/application-sdWebOne.xml

@@ -70,6 +70,8 @@
             <!--ProductCenter:产品中心-->
             <property name="sysRunMode" value="Mall"/>
 
+            <property name="saasHostName" value="yinjieai.com"/>
+
             <!--  redis任务通知队列的命名空间,一定要和RedisJobConsumer节点的namespace对应上-->
             <property name="redisJobNameSpace" value="sdtool_jobmain"/>
         </properties>

+ 2 - 1
conf/rediskeys.properties

@@ -210,4 +210,5 @@ redis.erp.account.last.period = sdtool:mall:erp:account:last:period
 #在线设计
 redis.designer.design.template.edit = sdtool:mall:designer:design:template:edit
 redis.designer.design.template.imposition = sdtool:mall:designer:design:template:imposition
-redis.designer.design.font = sdtool:mall:designer:design:font
+redis.designer.design.font = sdtool:mall:designer:design:font
+redis.designer.sys.user.token = sdtool:mall:designer:sys:user:token

+ 2 - 0
conf/script/0/init/Init_51_DesignTempalte.groovy

@@ -24,6 +24,8 @@ static def createRunnable(RedisService redisService, NoSqlKeysService keysServic
     return {
         redisService.del(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_EDIT, supplierCode))
         redisService.del(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_IMPOSITION, supplierCode))
+        //删除系统转跳临时token
+        redisService.del(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_SYS_USER_TOKEN, -1000))
         Ignore_ExecPageFlipper.execute(1000, { PageFlipper p ->
             List<DesignTemplate> templates = designDao.selectDesignTemplates(params, dataSourceId, supplierCode, p)
 

+ 12 - 0
conf/sqlroot/com/sdtool/business/dao/DesignDao.dql

@@ -56,6 +56,18 @@ updateTimeLong ) values ( #{id}, #{templatename}, #{backgroundpath}, #{viewthumb
 #{createtimelong}, #{updateby}, #{updatetime},
 #{updatetimelong} );
 
+-- [updateDesignTemplate]
+update $table$ set templateName = #{templatename}, jsonContent = #{jsoncontent},
+updateBy = #{updateby},
+updateTime = #{updatetime}
+where id = #{id};
+
+-- [updateDesignTemplateThumb]
+update $table$ set templateName = #{templatename}, viewThumbPath = #{viewthumbpath},
+updateBy = #{updateby},
+updateTime = #{updatetime}
+where id = #{id};
+
 -- [addDesignTemplateItem]
 insert into $table$ (id, idTemplate, itemType, locationX,
 locationY, sizeWidth, sizeHeight,

+ 7 - 2
sdBusiness/src/main/java/com/sdtool/business/dao/DesignDao.java

@@ -44,17 +44,22 @@ public interface DesignDao extends DaoRepository {
     @DAOMethod(operator = OperatorType.UPDATE, owait = OperatorWait.ASNYC)
     @SqlId(clazz = DesignDao.class, sql = "addDesignTemplate", table = "dedesigntemplate", params = {1}, sort = 1)
     @SqlId(clazz = DesignDao.class, sql = "addDesignTemplateItem", table = "dedesigntemplateitem", params = {2}, sort = 2)
-    void addDesignTemplate(DesignFont designFont, List<DesignTemplateItem> itemList, @DatabaseShardingBy String dataSourceId, @TableShardingBy Long supplierCode);
+    void addDesignTemplate(DesignTemplate designTemplate, List<DesignTemplateItem> itemList, @DatabaseShardingBy String dataSourceId, @TableShardingBy Long supplierCode);
 
     @Sharding(databaseShardingStrategy = SupplierDataBaseShardingStrategy.class, tableShardingStrategy = SupplierTableShardingStrategy.class)
     @DAOMethod(operator = OperatorType.UPDATE, owait = OperatorWait.ASNYC)
-    @SqlId(clazz = DesignDao.class, sql = "addDesignTemplate", table = "dedesigntemplate", params = {1}, sort = 1)
+    @SqlId(clazz = DesignDao.class, sql = "updateDesignTemplate", table = "dedesigntemplate", params = {1}, sort = 1)
     @SqlId(clazz = DesignDao.class, sql = "deleteDesignTemplateItem", table = "dedesigntemplateitem", params = {1}, sort = 2)
     @SqlId(clazz = DesignDao.class, sql = "addDesignTemplateItem", table = "dedesigntemplateitem", params = {2}, sort = 3)
     void updateDesignTemplate(DesignTemplate designTemplate, List<DesignTemplateItem> itemList, @DatabaseShardingBy String dataSourceId, @TableShardingBy Long supplierCode);
 
     @Sharding(databaseShardingStrategy = SupplierDataBaseShardingStrategy.class, tableShardingStrategy = SupplierTableShardingStrategy.class)
     @DAOMethod(operator = OperatorType.UPDATE, owait = OperatorWait.ASNYC)
+    @SqlId(clazz = DesignDao.class, sql = "updateDesignTemplateThumb", table = "dedesigntemplate", params = {1})
+    void updateDesignTemplateThumb(DesignTemplate designTemplate, @DatabaseShardingBy String dataSourceId, @TableShardingBy Long supplierCode);
+
+    @Sharding(databaseShardingStrategy = SupplierDataBaseShardingStrategy.class, tableShardingStrategy = SupplierTableShardingStrategy.class)
+    @DAOMethod(operator = OperatorType.UPDATE, owait = OperatorWait.ASNYC)
     @SqlId(clazz = DesignDao.class, sql = "voidDesignTemplate", table = "dedesigntemplate", params = {1})
     void voidDesignTemplate(DesignTemplate designTemplate, @DatabaseShardingBy String dataSourceId, @TableShardingBy Long supplierCode);
     //endregion

+ 83 - 6
sdBusiness/src/main/java/com/sdtool/business/service/mall/DesignServiceImpl.java

@@ -8,6 +8,9 @@ import com.sdtool.common.api.NoSqlKeysService;
 import com.sdtool.common.api.mall.DesignService;
 import com.sdtool.common.base.BaseService;
 import com.sdtool.common.datas.RedisKeys;
+import com.sdtool.common.entity.base.BaseEntity;
+import com.sdtool.common.entity.base.ProcessIdItem;
+import com.sdtool.common.entity.base.ProcessStringItem;
 import com.sdtool.common.entity.design.DesignFont;
 import com.sdtool.common.entity.design.DesignTemplate;
 import com.sdtool.common.entity.design.DesignTemplateItem;
@@ -29,10 +32,12 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
+import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 @Local
@@ -58,6 +63,9 @@ public class DesignServiceImpl extends BaseService implements DesignService {
     @Resource(name = "APP_HOME")
     private String appHome;
 
+    @Resource(name = "property.PC.Mall.Admin.commonkey")
+    private String tokenKey;
+
     private String designContentRoot;
 
     private DesignDao designDao;
@@ -73,9 +81,9 @@ public class DesignServiceImpl extends BaseService implements DesignService {
     public RetResult<List<DesignFont>> getDesignFonts(RMap params, String dataSourceId, long supplierCode) {
         List<DesignFont> fontList = getRedisDocInfos(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_FONT, supplierCode), DesignFont.class);
         if (ERPUtils.mapContainKey(params, "voidFlag")) {
-            return RetResult.<List<DesignFont>>successT().result(fontList.stream().filter(x -> x.getVoidFlag() == params.getInt("voidFlag")).toList());
+            return RetResult.<List<DesignFont>>successT().result(fontList.stream().filter(x -> x.getVoidFlag() == params.getInt("voidFlag")).sorted(Comparator.comparingLong(BaseEntity::getCreateTimeLong)).toList());
         } else {
-            return RetResult.<List<DesignFont>>successT().result(fontList.stream().filter(x -> x.getVoidFlag() == 0).toList());
+            return RetResult.<List<DesignFont>>successT().result(fontList.stream().filter(x -> x.getVoidFlag() == 0).sorted(Comparator.comparingLong(BaseEntity::getCreateTimeLong)).toList());
         }
     }
 
@@ -111,6 +119,7 @@ public class DesignServiceImpl extends BaseService implements DesignService {
     public RetResult<List<DesignTemplate>> queryDesignTemplates(RMap params, PageFlipper pageFlipper, String dataSourceId, long supplierCode) {
         List<DesignTemplate> templateList = designDao.selectDesignTemplates(params, dataSourceId, supplierCode, pageFlipper);
 
+        templateList.forEach(x -> x.setJsonContent(""));
         return RetResult.<List<DesignTemplate>>successT().result(templateList);
     }
 
@@ -141,8 +150,10 @@ public class DesignServiceImpl extends BaseService implements DesignService {
 
     @Override
     public RetResult<DesignTemplate> updateDesignTemplate(DesignTemplate template, String dataSourceId, long supplierCode, ERPTokenUser currentUser) {
+        boolean isNew = false;
         if (template.getId() <= 0) {
             //新增
+            isNew = true;
             template.setId(tableIdService.getTableIdMulti("deDesignTemplate.id", 1, dataSourceId, String.valueOf(supplierCode)));
             DesignTemplate.create(template, currentUser.getId());
         } else {
@@ -151,13 +162,17 @@ public class DesignServiceImpl extends BaseService implements DesignService {
 
         String fileName = designContentRoot + File.separator + supplierCode +
                 File.separator + template.getId() + ".txt";
+        Path path = Paths.get(fileName);
 
         String writeContent = "";
         if (StringUtils.isNotEmpty(template.getJsonContent())) {
             writeContent = template.getJsonContent();
         }
         try {
-            Files.write(Paths.get(fileName),
+            if (!Files.exists(path.getParent())) {
+                Files.createDirectories(path.getParent());
+            }
+            Files.write(path,
                     Collections.singleton(new StringBuilder(writeContent)),
                     StandardCharsets.UTF_8,
                     StandardOpenOption.CREATE,
@@ -173,25 +188,87 @@ public class DesignServiceImpl extends BaseService implements DesignService {
         template.setItemList(itemList);
         redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_IMPOSITION, supplierCode), String.valueOf(template.getId()), template);
 
-        designDao.updateDesignTemplate(template, template.getItemList(), dataSourceId, supplierCode);
+        if (isNew)
+            designDao.addDesignTemplate(template, template.getItemList(), dataSourceId, supplierCode);
+        else
+            designDao.updateDesignTemplate(template, template.getItemList(), dataSourceId, supplierCode);
 
         return RetResult.<DesignTemplate>successT().result(template);
     }
 
     @Override
+    public RetResult<DesignTemplate> updateDesignTemplateThumb(DesignTemplate template, String dataSourceId, long supplierCode, ERPTokenUser currentUser) {
+        DesignTemplate redisTemplateEdit = getRedisDocInfo(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_EDIT, supplierCode),
+                String.valueOf(template.getId()), DesignTemplate.class);
+        DesignTemplate redisTemplateImposition = getRedisDocInfo(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_IMPOSITION, supplierCode),
+                String.valueOf(template.getId()), DesignTemplate.class);
+
+        if (redisTemplateEdit != null) {
+            redisTemplateEdit.setViewThumbPath(template.getViewThumbPath());
+            redisTemplateEdit.setTemplateName(template.getTemplateName());
+
+            redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_EDIT, supplierCode), String.valueOf(redisTemplateEdit.getId()), redisTemplateEdit);
+        }
+
+        if (redisTemplateImposition != null) {
+            redisTemplateImposition.setViewThumbPath(template.getViewThumbPath());
+            redisTemplateImposition.setTemplateName(template.getTemplateName());
+
+            redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_IMPOSITION, supplierCode), String.valueOf(redisTemplateImposition.getId()), redisTemplateImposition);
+        }
+
+        designDao.updateDesignTemplateThumb(template, dataSourceId, supplierCode);
+
+        return RetResult.successT();
+    }
+
+    @Override
     public RetResult<DesignTemplate> voidDesignTemplate(DesignTemplate template, String dataSourceId, long supplierCode, ERPTokenUser currentUser) {
         DesignTemplate redisTemplateEdit = getRedisDocInfo(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_EDIT, supplierCode),
                 String.valueOf(template.getId()), DesignTemplate.class);
         DesignTemplate redisTemplateImposition = getRedisDocInfo(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_IMPOSITION, supplierCode),
                 String.valueOf(template.getId()), DesignTemplate.class);
 
-        if (redisTemplateEdit != null)
+        if (redisTemplateEdit != null) {
             redisTemplateEdit.setVoidFlag(template.getVoidFlag());
-        if (redisTemplateImposition != null)
+            redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_EDIT, supplierCode), String.valueOf(redisTemplateEdit.getId()), redisTemplateEdit);
+        }
+        if (redisTemplateImposition != null) {
             redisTemplateImposition.setVoidFlag(template.getVoidFlag());
+            redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_IMPOSITION, supplierCode), String.valueOf(redisTemplateImposition.getId()), redisTemplateImposition);
+        }
 
         designDao.voidDesignTemplate(template, dataSourceId, supplierCode);
 
         return RetResult.successT();
     }
+
+    @Override
+    public RetResult<ProcessIdItem> saveCurrentUserTokenInfo(String virtualCode, String dataSourceId, long supplierCode, ERPTokenUser currentUser) {
+        RMap currentToken = new RMap();
+        currentToken.set("dataSourceId", dataSourceId);
+        currentToken.set("supplierCode", String.valueOf(supplierCode));
+        String accessToken = ERPUtils.parseTokenFromERPUser(currentUser, tokenKey, jsonConvert);
+        currentToken.set("token", accessToken);
+
+        redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_SYS_USER_TOKEN, -1000), virtualCode, jsonConvert.convertTo(currentToken));
+        return RetResult.successT();
+    }
+
+    @Override
+    public RetResult<ProcessStringItem> getCurrentUserTokenInfo(String virtualCode) {
+        String accessToken = redisService.hget(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_SYS_USER_TOKEN, -1000), virtualCode);
+        if (StringUtils.isEmpty(accessToken)) {
+            return RetResult.<ProcessStringItem>errorT().retinfo("用户信息不正确");
+        }
+        RMap currentToken = jsonConvert.convertFrom(RMap.class, accessToken);
+        ProcessStringItem resultItem = new ProcessStringItem();
+        resultItem.setItemValue(currentToken.getString("token"));
+        resultItem.setSupplierCode(currentToken.getLong("supplierCode"));
+        resultItem.setDataSourceId(currentToken.getString("dataSourceId"));
+
+        redisService.hdel(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_SYS_USER_TOKEN, -1000), virtualCode);
+
+        return RetResult.<ProcessStringItem>successT().result(resultItem);
+    }
 }

+ 11 - 0
sdCommon/src/main/java/com/sdtool/common/api/mall/DesignService.java

@@ -1,6 +1,8 @@
 package com.sdtool.common.api.mall;
 
 import com.sdtool.common.api.ScriptService;
+import com.sdtool.common.entity.base.ProcessIdItem;
+import com.sdtool.common.entity.base.ProcessStringItem;
 import com.sdtool.common.entity.design.DesignFont;
 import com.sdtool.common.entity.design.DesignTemplate;
 import com.sdtool.common.entity.site.ERPTokenUser;
@@ -28,6 +30,15 @@ public interface DesignService extends ScriptService {
 
     RetResult<DesignTemplate> updateDesignTemplate(DesignTemplate template, String dataSourceId, long supplierCode, ERPTokenUser currentUser);
 
+    RetResult<DesignTemplate> updateDesignTemplateThumb(DesignTemplate template, String dataSourceId, long supplierCode, ERPTokenUser currentUser);
+
     RetResult<DesignTemplate> voidDesignTemplate(DesignTemplate template, String dataSourceId, long supplierCode, ERPTokenUser currentUser);
     //endregion
+
+    //region 项目转跳需要
+    RetResult<ProcessIdItem> saveCurrentUserTokenInfo(String virtualCode, String dataSourceId, long supplierCode, ERPTokenUser currentUser);
+
+    RetResult<ProcessStringItem> getCurrentUserTokenInfo(String virtualCode);
+    //endregion
+
 }

+ 3 - 0
sdCommon/src/main/java/com/sdtool/common/datas/RedisKeys.java

@@ -465,6 +465,9 @@ public class RedisKeys {
     public static final String KEY_DESIGNER_DESIGN_TEMPLATE_IMPOSITION = "redis.designer.design.template.imposition";
 
     public static final String KEY_DESIGNER_DESIGN_FONT = "redis.designer.design.font";
+
+    //系统流转间暂存token
+    public static final String KEY_DESIGNER_SYS_USER_TOKEN = "redis.designer.sys.user.token";
     //endregion
 
     private RedisKeys() {

+ 2 - 0
sdCommon/src/main/java/com/sdtool/common/servlet/file/FileUploadServlet.java

@@ -157,6 +157,8 @@ public class FileUploadServlet extends BaseHttpServlet {
             entity.setUrl(supplierInitService.getFileDownloadUrl(fileLink, "", currentUser.getDataSourceId(), currentUser.getSupplierCode()));
             entity.setWebUrl(supplierInitService.getFileWebDownloadUrl(fileLink, "", currentUser.getDataSourceId(), currentUser.getSupplierCode()));
 
+            //解决前端跨域
+            entity.setFileLink("/static/" + currentUser.getSupplierCode() + "/" + fileLink);
             resp.finishJson(entity);
             return;
         }

+ 55 - 3
sdWebCore/src/main/java/com/sdtool/webcore/rest/DesignRest.java

@@ -5,10 +5,12 @@ import com.sdtool.common.api.mall.DesignService;
 import com.sdtool.common.base.BaseService;
 import com.sdtool.common.datas.ERPHeader;
 import com.sdtool.common.datas.HttpCode;
+import com.sdtool.common.entity.base.ProcessIdItem;
+import com.sdtool.common.entity.base.ProcessSearchEntityItem;
+import com.sdtool.common.entity.base.ProcessStringItem;
 import com.sdtool.common.entity.design.DesignFont;
 import com.sdtool.common.entity.design.DesignTemplate;
 import com.sdtool.common.entity.site.ERPTokenUser;
-import com.sdtool.common.entity.system.CompanyInfo;
 import com.sweetfish.net.http.*;
 import com.sweetfish.service.Local;
 import com.sweetfish.service.RetResult;
@@ -139,7 +141,7 @@ public class DesignRest extends BaseService {
     @RestMapping(name = "updateDesignTemplate", auth = true, sort = 14, comment = "新增/修改设计模板", methods = {"POST"})
     @WebApiBean(result = true, type = DesignTemplate.class)
     public CompletableFuture<RMap> updateDesignTemplate(
-            @RestParam(name = "template", comment = "字体") DesignTemplate designTemplate,
+            @RestBody(comment = "模板") DesignTemplate designTemplate,
             @RestParam(name = "&", comment = "登录用户,无需传入") ERPTokenUser currentUser,
             @RestHeader(name = ERPHeader.HTTPHEADER_DATASOURCE) String dataSourceId,
             @RestHeader(name = ERPHeader.HTTPHEADER_SUPPLIER) String supplierCode) {
@@ -156,7 +158,7 @@ public class DesignRest extends BaseService {
     @RestMapping(name = "voidDesignTemplate", auth = true, sort = 15, comment = "禁用设计模板", methods = {"POST"})
     @WebApiBean(result = true, type = DesignTemplate.class)
     public CompletableFuture<RMap> voidDesignTemplate(
-            @RestParam(name = "template", comment = "字体") DesignTemplate designTemplate,
+            @RestParam(name = "template", comment = "模板") DesignTemplate designTemplate,
             @RestParam(name = "&", comment = "登录用户,无需传入") ERPTokenUser currentUser,
             @RestHeader(name = ERPHeader.HTTPHEADER_DATASOURCE) String dataSourceId,
             @RestHeader(name = ERPHeader.HTTPHEADER_SUPPLIER) String supplierCode) {
@@ -169,5 +171,55 @@ public class DesignRest extends BaseService {
                 }, getExecutor()
         );
     }
+
+    @RestMapping(name = "updateDesignTemplateThumb", auth = true, sort = 16, comment = "上传设计模板缩略图", methods = {"POST"})
+    @WebApiBean(result = true, type = DesignTemplate.class)
+    public CompletableFuture<RMap> updateDesignTemplateThumb(
+            @RestParam(name = "template", comment = "模板") DesignTemplate designTemplate,
+            @RestParam(name = "&", comment = "登录用户,无需传入") ERPTokenUser currentUser,
+            @RestHeader(name = ERPHeader.HTTPHEADER_DATASOURCE) String dataSourceId,
+            @RestHeader(name = ERPHeader.HTTPHEADER_SUPPLIER) String supplierCode) {
+        return CompletableFuture.supplyAsync(
+                () -> {
+                    RetResult<DesignTemplate> result = designService.updateDesignTemplateThumb(designTemplate, dataSourceId, Long.parseLong(supplierCode), currentUser);
+                    if (result.isSuccess())
+                        return RMapUtils.successV2(result.getResult(), null, null);
+                    else return RMapUtils.error(HttpCode.BAD_REQUEST.value(), result.getRetinfo());
+                }, getExecutor()
+        );
+    }
+    //endregion
+
+    //region 系统间转跳传递用户
+    @RestMapping(name = "saveCurrentUserTokenInfo", auth = true, sort = 100, comment = "存储当前用户token", methods = {"POST"})
+    @WebApiBean(result = true, type = ProcessIdItem.class)
+    public CompletableFuture<RMap> saveCurrentUserTokenInfo(
+            @RestParam(name = "virtualCode", comment = "一次性随机码") String virtualCode,
+            @RestParam(name = "&", comment = "登录用户,无需传入") ERPTokenUser currentUser,
+            @RestHeader(name = ERPHeader.HTTPHEADER_DATASOURCE) String dataSourceId,
+            @RestHeader(name = ERPHeader.HTTPHEADER_SUPPLIER) String supplierCode) {
+        return CompletableFuture.supplyAsync(
+                () -> {
+                    RetResult<ProcessIdItem> result = designService.saveCurrentUserTokenInfo(virtualCode, dataSourceId, Long.parseLong(supplierCode), currentUser);
+                    if (result.isSuccess())
+                        return RMapUtils.successV2(result.getResult(), null, null);
+                    else return RMapUtils.error(HttpCode.BAD_REQUEST.value(), result.getRetinfo());
+                }, getExecutor()
+        );
+    }
+
+    @RestMapping(name = "getCurrentUserTokenInfo", auth = false, sort = 101, comment = "获取当前用户token", methods = {"POST"})
+    @WebApiBean(result = true, type = ProcessStringItem.class)
+    public CompletableFuture<RMap> getCurrentUserTokenInfo(
+            @RestParam(name = "virtualCode", comment = "一次性随机码") String virtualCode) {
+        return CompletableFuture.supplyAsync(
+                () -> {
+                    RetResult<ProcessStringItem> result = designService.getCurrentUserTokenInfo(virtualCode);
+                    if (result.isSuccess())
+                        return RMapUtils.successV2(result.getResult(), null, null);
+                    else return RMapUtils.error(HttpCode.BAD_REQUEST.value(), result.getRetinfo());
+                }, getExecutor()
+        );
+    }
     //endregion
 }