zhaodengke пре 1 година
родитељ
комит
a0ede1ae31
44 измењених фајлова са 4175 додато и 320 уклоњено
  1. +50
    -0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentTaskController.java
  2. +0
    -106
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/TAgentTaskController.java
  3. +2
    -2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AgentCenterController.java
  4. +45
    -0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/misc/DeptController.java
  5. +17
    -10
      ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/domain/TAgentTask.java
  6. +5
    -0
      ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/mapper/TAgentTaskMapper.java
  7. +3
    -0
      ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/ITAgentTaskService.java
  8. +34
    -0
      ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/impl/TAgentTaskServiceImpl.java
  9. +22
    -0
      ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/vo/AgentTaskTownGroup.java
  10. +30
    -0
      ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/vo/AgentTaskVillageGroup.java
  11. +111
    -21
      ruoyi-agentcenter/src/main/resources/mapper/agentcenter/TAgentTaskMapper.xml
  12. +73
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
  13. +26
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java
  14. +240
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/ContainerUtils.java
  15. +30
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/ConvertUtils.java
  16. +143
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeUtils.java
  17. +360
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/ExtractGeneratedSource.java
  18. +143
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/ExtractGeneratedSourceGUI.java
  19. +301
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/Konsole.java
  20. +394
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/SQLQueryFuncGen.java
  21. +173
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/SQLQueryFuncGenGUI.java
  22. +220
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/gui/FileField.java
  23. +69
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/gui/InputField.java
  24. +113
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/mybatis/MybatisStdOutputLog.java
  25. +275
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/mybatis/SQLQuery.java
  26. +55
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/mybatis/SQLQueue.java
  27. +143
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/mybatis/SQLStatement.java
  28. +62
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/translation/Translate.java
  29. +66
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/translation/TranslateUtils.java
  30. +578
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/translation/Translator.java
  31. +14
    -5
      ruoyi-generator/src/main/resources/vm/java/controller.java.vm
  32. +34
    -4
      ruoyi-generator/src/main/resources/vm/java/domain.java.vm
  33. +8
    -9
      ruoyi-generator/src/main/resources/vm/java/mapper.java.vm
  34. +1
    -2
      ruoyi-generator/src/main/resources/vm/java/service.java.vm
  35. +4
    -5
      ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm
  36. +6
    -14
      ruoyi-generator/src/main/resources/vm/js/api.js.vm
  37. +1
    -1
      ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm
  38. +247
    -124
      ruoyi-generator/src/main/resources/vm/vue/index.vue.vm
  39. +1
    -1
      ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm
  40. +2
    -16
      ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm
  41. +2
    -0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
  42. +11
    -0
      ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java
  43. +37
    -0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
  44. +24
    -0
      ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml

+ 50
- 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentTaskController.java Прегледај датотеку

@@ -0,0 +1,50 @@
package com.ruoyi.web.controller.agentcenter;

import java.util.List;
import javax.servlet.http.HttpServletResponse;

import com.ruoyi.common.utils.DateUtils;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.agentcenter.domain.TAgentTask;
import com.ruoyi.agentcenter.service.ITAgentTaskService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;

/**
* 任务清单Controller
*
* @author zhao
* @date 2023-05-06
*/
@RestController
@RequestMapping("/agentcenter/task")
public class AgentTaskController extends BaseController
{
@Autowired
private ITAgentTaskService tAgentTaskService;

/**
* 获取任务清单列表(按镇村分组)
*/
@PreAuthorize("@ss.hasPermi('agentcenter:task:list')")
@GetMapping(value = "/taskList")
public TableDataInfo taskList(TAgentTask task)
{
startPage();
task.setEndAt(DateUtils.getDate());
return getDataTable(tAgentTaskService.getTownTaskList(task));
}
}

+ 0
- 106
ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/TAgentTaskController.java Прегледај датотеку

@@ -1,106 +0,0 @@
package com.ruoyi.web.controller.agentcenter;

import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.agentcenter.domain.TAgentTask;
import com.ruoyi.agentcenter.service.ITAgentTaskService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;

/**
* 任务清单Controller
*
* @author zhao
* @date 2023-05-06
*/
@RestController
@RequestMapping("/agentcenter/task")
public class TAgentTaskController extends BaseController
{
@Autowired
private ITAgentTaskService tAgentTaskService;

/**
* 查询任务清单列表
*/
@PreAuthorize("@ss.hasPermi('agentcenter:task:list')")
@GetMapping("/list")
public TableDataInfo list(TAgentTask tAgentTask)
{
startPage();
List<TAgentTask> list = tAgentTaskService.selectTAgentTaskList(tAgentTask);
return getDataTable(list);
}

/**
* 导出任务清单列表
*/
@PreAuthorize("@ss.hasPermi('agentcenter:task:export')")
@Log(title = "任务清单", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, TAgentTask tAgentTask)
{
List<TAgentTask> list = tAgentTaskService.selectTAgentTaskList(tAgentTask);
ExcelUtil<TAgentTask> util = new ExcelUtil<TAgentTask>(TAgentTask.class);
util.exportExcel(response, list, "任务清单数据");
}

/**
* 获取任务清单详细信息
*/
@PreAuthorize("@ss.hasPermi('agentcenter:task:query')")
@GetMapping(value = "/get/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(tAgentTaskService.selectTAgentTaskById(id));
}

/**
* 新增任务清单
*/
@PreAuthorize("@ss.hasPermi('agentcenter:task:add')")
@Log(title = "任务清单", businessType = BusinessType.INSERT)
@PostMapping(value = "/add")
public AjaxResult add(@RequestBody TAgentTask tAgentTask)
{
tAgentTask.setCreateBy(getUsername());
return toAjax(tAgentTaskService.insertTAgentTask(tAgentTask));
}

/**
* 修改任务清单
*/
@PreAuthorize("@ss.hasPermi('agentcenter:task:edit')")
@Log(title = "任务清单", businessType = BusinessType.UPDATE)
@PutMapping(value = "/edit")
public AjaxResult edit(@RequestBody TAgentTask tAgentTask)
{
tAgentTask.setUpdateBy(getUsername());
return toAjax(tAgentTaskService.updateTAgentTask(tAgentTask));
}

/**
* 删除任务清单
*/
@PreAuthorize("@ss.hasPermi('agentcenter:task:remove')")
@Log(title = "任务清单", businessType = BusinessType.DELETE)
@DeleteMapping(value = "/remove/{id}")
public AjaxResult remove(@PathVariable Long id)
{
return toAjax(tAgentTaskService.deleteTAgentTaskById(id));
}
}

ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java → ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AgentCenterController.java Прегледај датотеку

@@ -1,12 +1,12 @@
package com.ruoyi.web.controller.agentcenter;
package com.ruoyi.web.controller.api;


import com.nsgk.agentcentersdk.api.NSApiResult; import com.nsgk.agentcentersdk.api.NSApiResult;
import com.nsgk.agentcentersdk.api.NSSDK; import com.nsgk.agentcentersdk.api.NSSDK;
import com.nsgk.agentcentersdk.api.NSSDKServer; import com.nsgk.agentcentersdk.api.NSSDKServer;
import com.nsgk.agentcentersdk.core.NSReportObject; import com.nsgk.agentcentersdk.core.NSReportObject;
import com.nsgk.agentcentersdk.message.NSContractionMessage;
import com.nsgk.agentcentersdk.err.NSErrno; import com.nsgk.agentcentersdk.err.NSErrno;
import com.nsgk.agentcentersdk.err.NSException; import com.nsgk.agentcentersdk.err.NSException;
import com.nsgk.agentcentersdk.message.NSContractionMessage;
import com.ruoyi.agentcenter.object.Session; import com.ruoyi.agentcenter.object.Session;
import com.ruoyi.agentcenter.service.IAgentCenter; import com.ruoyi.agentcenter.service.IAgentCenter;
import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.config.RuoYiConfig;

+ 45
- 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/misc/DeptController.java Прегледај датотеку

@@ -0,0 +1,45 @@
package com.ruoyi.web.controller.misc;

import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.system.service.ISysDeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
* 杂项::部门
*
* @author zhao
*/
@RestController
@RequestMapping("/misc/dept")
public class DeptController extends BaseController
{
@Autowired
private ISysDeptService deptService;

/**
* 获取部门树
*/
@GetMapping("/tree")
public AjaxResult list(SysDept dept)
{
return success(deptService.getDeptTree(dept));
}

/**
* 获取市级树
*/
@GetMapping("/cityTree")
public AjaxResult cityTree(SysDept dept)
{
return success(deptService.getCityTree(dept));
}

}

+ 17
- 10
ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/domain/TAgentTask.java Прегледај датотеку

@@ -30,7 +30,7 @@ public class TAgentTask extends BaseEntity
private Long id; private Long id;


/** 所属中心 字典 agent_center */ /** 所属中心 字典 agent_center */
@Excel(name = "所属中心 字典 agent_center")
@Excel(name = "所属中心", dictType = "agent_center")
private String agentCenter; private String agentCenter;


/** 县代码 */ /** 县代码 */
@@ -94,15 +94,15 @@ public class TAgentTask extends BaseEntity
private Integer finishCount; private Integer finishCount;


/** 任务状态 字典 agent_status */ /** 任务状态 字典 agent_status */
@Excel(name = "任务状态 字典 agent_status")
@Excel(name = "任务状态", dictType = "agent_status")
private String agentStatus; private String agentStatus;


/** 分配用户(用user_name) */ /** 分配用户(用user_name) */
@Excel(name = "分配用户(用user_name)")
@Excel(name = "分配用户")
private String distriUser; private String distriUser;


/** 分配人(用nick_name) */ /** 分配人(用nick_name) */
@Excel(name = "分配人(用nick_name)")
@Excel(name = "分配人")
private String distriNick; private String distriNick;


/** 分配时间 */ /** 分配时间 */
@@ -115,11 +115,11 @@ public class TAgentTask extends BaseEntity
private String endAt; private String endAt;


/** 记账用户(用user_name) */ /** 记账用户(用user_name) */
@Excel(name = "记账用户(用user_name)")
@Excel(name = "记账用户")
private String handleUser; private String handleUser;


/** 记账会计(用nick_name) */ /** 记账会计(用nick_name) */
@Excel(name = "记账会计(用nick_name)")
@Excel(name = "记账会计")
private String handleNick; private String handleNick;


/** 记账备注 */ /** 记账备注 */
@@ -132,11 +132,11 @@ public class TAgentTask extends BaseEntity
private Date handleDate; private Date handleDate;


/** 审核用户(用user_name) */ /** 审核用户(用user_name) */
@Excel(name = "审核用户(用user_name)")
@Excel(name = "审核用户")
private String auditUser; private String auditUser;


/** 审核人(用nick_name) */ /** 审核人(用nick_name) */
@Excel(name = "审核人(用nick_name)")
@Excel(name = "审核人")
private String auditNick; private String auditNick;


/** 审核时间 */ /** 审核时间 */
@@ -145,11 +145,11 @@ public class TAgentTask extends BaseEntity
private Date auditDate; private Date auditDate;


/** 评价用户(用user_name) */ /** 评价用户(用user_name) */
@Excel(name = "评价用户(用user_name)")
@Excel(name = "评价用户")
private String appraiseUser; private String appraiseUser;


/** 评价人(用nick_name) */ /** 评价人(用nick_name) */
@Excel(name = "评价人(用nick_name)")
@Excel(name = "评价人")
private String appraiseNick; private String appraiseNick;


/** 任务评分 */ /** 任务评分 */
@@ -160,5 +160,12 @@ public class TAgentTask extends BaseEntity
@Excel(name = "评价备注") @Excel(name = "评价备注")
private String appraiseRemark; private String appraiseRemark;


/** 是否审核 */
@Excel(name = "是否审核", dictType = "sys_yes_no")
private String isAudit;

/** 是否评价 */
@Excel(name = "是否评价", dictType = "sys_yes_no")
private String isAppraise;


} }

+ 5
- 0
ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/mapper/TAgentTaskMapper.java Прегледај датотеку

@@ -2,6 +2,8 @@ package com.ruoyi.agentcenter.mapper;


import java.util.List; import java.util.List;
import com.ruoyi.agentcenter.domain.TAgentTask; import com.ruoyi.agentcenter.domain.TAgentTask;
import com.ruoyi.agentcenter.vo.AgentTaskTownGroup;
import com.ruoyi.agentcenter.vo.AgentTaskVillageGroup;


/** /**
* 任务清单Mapper接口 * 任务清单Mapper接口
@@ -101,4 +103,7 @@ public interface TAgentTaskMapper
public int selectTAgentTaskExists(TAgentTask tAgentTask); public int selectTAgentTaskExists(TAgentTask tAgentTask);


public int updateTAgentTaskCount(TAgentTask tAgentTask); public int updateTAgentTaskCount(TAgentTask tAgentTask);

public List<AgentTaskTownGroup> getAgentTaskGroupByTown(TAgentTask tAgentTask);
public List<AgentTaskVillageGroup> getAgentTaskGroupByVillage(TAgentTask tAgentTask);
} }

+ 3
- 0
ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/ITAgentTaskService.java Прегледај датотеку

@@ -4,6 +4,7 @@ import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;


import com.ruoyi.agentcenter.domain.TAgentTask; import com.ruoyi.agentcenter.domain.TAgentTask;
import com.ruoyi.agentcenter.vo.AgentTaskTownGroup;


/** /**
* 任务清单Service接口 * 任务清单Service接口
@@ -111,4 +112,6 @@ public interface ITAgentTaskService
public TAgentTask getTAgentTask(String orgCode, String year, String month); public TAgentTask getTAgentTask(String orgCode, String year, String month);


public int syncTAgentTaskCount(TAgentTask tAgentTask); public int syncTAgentTaskCount(TAgentTask tAgentTask);

public List<AgentTaskTownGroup> getTownTaskList(TAgentTask tAgentTask);
} }

+ 34
- 0
ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/impl/TAgentTaskServiceImpl.java Прегледај датотеку

@@ -1,10 +1,16 @@
package com.ruoyi.agentcenter.service.impl; package com.ruoyi.agentcenter.service.impl;


import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.function.Consumer; import java.util.function.Consumer;


import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import com.ruoyi.agentcenter.vo.AgentTaskTownGroup;
import com.ruoyi.agentcenter.vo.AgentTaskVillageGroup;
import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.utils.ContainerUtils;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DeptUtils; import com.ruoyi.common.utils.DeptUtils;
import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.system.mapper.SysDeptMapper;
@@ -273,4 +279,32 @@ public class TAgentTaskServiceImpl implements ITAgentTaskService
; ;
return updateTAgentTaskCount(updateTask); return updateTAgentTaskCount(updateTask);
} }

@Override
public List<AgentTaskTownGroup> getTownTaskList(TAgentTask tAgentTask)
{
List<AgentTaskTownGroup> agentTaskGroupByTown = tAgentTaskMapper.getAgentTaskGroupByTown(tAgentTask);
if(CollectionUtil.isNotEmpty(agentTaskGroupByTown))
{
List<String> townCodeList = ContainerUtils.mapToList(agentTaskGroupByTown, AgentTaskTownGroup::getTownCode);

List<AgentTaskVillageGroup> villageGroups = tAgentTaskMapper.getAgentTaskGroupByVillage(new TAgentTask().putParam("townCodeList", townCodeList));
Map<String, List<AgentTaskVillageGroup>> villageMap = ContainerUtils.groupingBy(villageGroups, AgentTaskVillageGroup::getTownCode);

List<String> orgCodeList = ContainerUtils.mapToList(villageGroups, AgentTaskVillageGroup::getOrgCode);

TAgentTask agentTaskCond = new TAgentTask();
agentTaskCond.putParam("orgCodeList", orgCodeList);
List<TAgentTask> tAgentTasks = tAgentTaskMapper.selectTAgentTaskList(agentTaskCond);
Map<String, List<TAgentTask>> bookGroup = ContainerUtils.groupingBy(tAgentTasks, TAgentTask::getOrgCode);

agentTaskGroupByTown.forEach((town) -> {
town.setVillageList(villageMap.getOrDefault(town.getTownCode(), new ArrayList<>()));
town.getVillageList().forEach((village) -> {
village.setTaskList(bookGroup.getOrDefault(village.getOrgCode(), new ArrayList<>()));
});
});
}
return agentTaskGroupByTown;
}
} }

+ 22
- 0
ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/vo/AgentTaskTownGroup.java Прегледај датотеку

@@ -0,0 +1,22 @@
package com.ruoyi.agentcenter.vo;

import lombok.Data;
import lombok.experimental.Accessors;

import java.util.List;

@Data
@Accessors(chain = true)
public class AgentTaskTownGroup
{
private Long num;
private Long numProcessFinish;
private Long numApprovalFinish;
private Long numExcept;
private String townName;
private String townCode;
private String orderYear;
private String orderMonth;

private List<AgentTaskVillageGroup> villageList;
}

+ 30
- 0
ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/vo/AgentTaskVillageGroup.java Прегледај датотеку

@@ -0,0 +1,30 @@
package com.ruoyi.agentcenter.vo;

import com.ruoyi.agentcenter.domain.TAgentTask;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.Date;
import java.util.List;

@Data
@Accessors(chain = true)
public class AgentTaskVillageGroup
{
private Long num;
private Long numProcessFinish;
private Long numApprovalFinish;
private Long numExcept;
private String townCode;

private String orgName;
private String orgCode;
private Long bookId;
private String bookName;
private Date distriDate;
private Date handleDate;
private String endAt;
private String handleNick;

private List<TAgentTask> taskList;
}

+ 111
- 21
ruoyi-agentcenter/src/main/resources/mapper/agentcenter/TAgentTaskMapper.xml Прегледај датотеку

@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper <!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.agentcenter.mapper.TAgentTaskMapper"> <mapper namespace="com.ruoyi.agentcenter.mapper.TAgentTaskMapper">
<resultMap type="TAgentTask" id="TAgentTaskResult"> <resultMap type="TAgentTask" id="TAgentTaskResult">
<result property="id" column="id" /> <result property="id" column="id" />
<result property="agentCenter" column="agent_center" /> <result property="agentCenter" column="agent_center" />
@@ -34,10 +34,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="auditUser" column="audit_user" /> <result property="auditUser" column="audit_user" />
<result property="auditNick" column="audit_nick" /> <result property="auditNick" column="audit_nick" />
<result property="auditDate" column="audit_date" /> <result property="auditDate" column="audit_date" />
<result property="isAudit" column="is_audit" />
<result property="appraiseUser" column="appraise_user" /> <result property="appraiseUser" column="appraise_user" />
<result property="appraiseNick" column="appraise_nick" /> <result property="appraiseNick" column="appraise_nick" />
<result property="appraiseScore" column="appraise_score" /> <result property="appraiseScore" column="appraise_score" />
<result property="appraiseRemark" column="appraise_remark" /> <result property="appraiseRemark" column="appraise_remark" />
<result property="isAppraise" column="is_appraise" />
<result property="createBy" column="create_by" /> <result property="createBy" column="create_by" />
<result property="createTime" column="create_time" /> <result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" /> <result property="updateBy" column="update_by" />
@@ -45,13 +47,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap> </resultMap>


<sql id="selectTAgentTaskVo"> <sql id="selectTAgentTaskVo">
select id, agent_center, county_code, county_name, town_code, town_name, org_code, org_name, book_id, book_name, order_year, order_month, voucher_count, contrac_count, asset_count, all_count, finish_count, agent_status, distri_user, distri_nick, distri_date, end_at, handle_user, handle_nick, handle_remark, handle_date, audit_user, audit_nick, audit_date, appraise_user, appraise_nick, appraise_score, appraise_remark, create_by, create_time, update_by, update_time from t_agent_task
select id, agent_center, county_code, county_name, town_code, town_name, org_code, org_name, book_id, book_name, order_year, order_month, voucher_count, contrac_count, asset_count, all_count, finish_count, agent_status, distri_user, distri_nick, distri_date, end_at, handle_user, handle_nick, handle_remark, handle_date, audit_user, audit_nick, audit_date, is_audit, appraise_user, appraise_nick, appraise_score, appraise_remark, is_appraise, create_by, create_time, update_by, update_time from t_agent_task
</sql> </sql>


<!--条件查询-->
<select id="selectTAgentTaskList" parameterType="TAgentTask" resultMap="TAgentTaskResult"> <select id="selectTAgentTaskList" parameterType="TAgentTask" resultMap="TAgentTaskResult">
<include refid="selectTAgentTaskVo"/> <include refid="selectTAgentTaskVo"/>
<where>
<where>
<if test="agentCenter != null and agentCenter != ''"> and agent_center = #{agentCenter}</if> <if test="agentCenter != null and agentCenter != ''"> and agent_center = #{agentCenter}</if>
<if test="countyCode != null and countyCode != ''"> and county_code = #{countyCode}</if> <if test="countyCode != null and countyCode != ''"> and county_code = #{countyCode}</if>
<if test="countyName != null and countyName != ''"> and county_name like concat('%', #{countyName}, '%')</if> <if test="countyName != null and countyName != ''"> and county_name like concat('%', #{countyName}, '%')</if>
@@ -80,20 +81,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="auditUser != null and auditUser != ''"> and audit_user = #{auditUser}</if> <if test="auditUser != null and auditUser != ''"> and audit_user = #{auditUser}</if>
<if test="auditNick != null and auditNick != ''"> and audit_nick = #{auditNick}</if> <if test="auditNick != null and auditNick != ''"> and audit_nick = #{auditNick}</if>
<if test="auditDate != null "> and audit_date = #{auditDate}</if> <if test="auditDate != null "> and audit_date = #{auditDate}</if>
<if test="isAudit != null and isAudit != ''"> and is_audit = #{isAudit}</if>
<if test="appraiseUser != null and appraiseUser != ''"> and appraise_user = #{appraiseUser}</if> <if test="appraiseUser != null and appraiseUser != ''"> and appraise_user = #{appraiseUser}</if>
<if test="appraiseNick != null and appraiseNick != ''"> and appraise_nick = #{appraiseNick}</if> <if test="appraiseNick != null and appraiseNick != ''"> and appraise_nick = #{appraiseNick}</if>
<if test="appraiseScore != null "> and appraise_score = #{appraiseScore}</if> <if test="appraiseScore != null "> and appraise_score = #{appraiseScore}</if>
<if test="appraiseRemark != null and appraiseRemark != ''"> and appraise_remark = #{appraiseRemark}</if> <if test="appraiseRemark != null and appraiseRemark != ''"> and appraise_remark = #{appraiseRemark}</if>
<if test="isAppraise != null and isAppraise != ''"> and is_appraise = #{isAppraise}</if>
<if test="params != null">
<if test="params.orgCodeList != null">
AND org_code IN (null <foreach collection="params.orgCodeList" item="i">,#{i}</foreach> )
</if>
</if>
</where> </where>
</select> </select>
<!--主键查询-->

<select id="selectTAgentTaskById" parameterType="Long" resultMap="TAgentTaskResult"> <select id="selectTAgentTaskById" parameterType="Long" resultMap="TAgentTaskResult">
<include refid="selectTAgentTaskVo"/> <include refid="selectTAgentTaskVo"/>
where id = #{id} where id = #{id}
</select> </select>
<!--新增-->

<insert id="insertTAgentTask" parameterType="TAgentTask" useGeneratedKeys="true" keyProperty="id"> <insert id="insertTAgentTask" parameterType="TAgentTask" useGeneratedKeys="true" keyProperty="id">
insert into t_agent_task insert into t_agent_task
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -125,15 +131,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="auditUser != null">audit_user,</if> <if test="auditUser != null">audit_user,</if>
<if test="auditNick != null">audit_nick,</if> <if test="auditNick != null">audit_nick,</if>
<if test="auditDate != null">audit_date,</if> <if test="auditDate != null">audit_date,</if>
<if test="isAudit != null">is_audit,</if>
<if test="appraiseUser != null">appraise_user,</if> <if test="appraiseUser != null">appraise_user,</if>
<if test="appraiseNick != null">appraise_nick,</if> <if test="appraiseNick != null">appraise_nick,</if>
<if test="appraiseScore != null">appraise_score,</if> <if test="appraiseScore != null">appraise_score,</if>
<if test="appraiseRemark != null">appraise_remark,</if> <if test="appraiseRemark != null">appraise_remark,</if>
<if test="isAppraise != null">is_appraise,</if>
<if test="createBy != null">create_by,</if> <if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if> <if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if> <if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if> <if test="updateTime != null">update_time,</if>
</trim>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="agentCenter != null and agentCenter != ''">#{agentCenter},</if> <if test="agentCenter != null and agentCenter != ''">#{agentCenter},</if>
<if test="countyCode != null and countyCode != ''">#{countyCode},</if> <if test="countyCode != null and countyCode != ''">#{countyCode},</if>
@@ -163,15 +171,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="auditUser != null">#{auditUser},</if> <if test="auditUser != null">#{auditUser},</if>
<if test="auditNick != null">#{auditNick},</if> <if test="auditNick != null">#{auditNick},</if>
<if test="auditDate != null">#{auditDate},</if> <if test="auditDate != null">#{auditDate},</if>
<if test="isAudit != null">#{isAudit},</if>
<if test="appraiseUser != null">#{appraiseUser},</if> <if test="appraiseUser != null">#{appraiseUser},</if>
<if test="appraiseNick != null">#{appraiseNick},</if> <if test="appraiseNick != null">#{appraiseNick},</if>
<if test="appraiseScore != null">#{appraiseScore},</if> <if test="appraiseScore != null">#{appraiseScore},</if>
<if test="appraiseRemark != null">#{appraiseRemark},</if> <if test="appraiseRemark != null">#{appraiseRemark},</if>
<if test="isAppraise != null">#{isAppraise},</if>
<if test="createBy != null">#{createBy},</if> <if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if> <if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if> <if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if> <if test="updateTime != null">#{updateTime},</if>
</trim>
</trim>
</insert> </insert>


<!--批量新增--> <!--批量新增-->
@@ -206,10 +216,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
audit_user, audit_user,
audit_nick, audit_nick,
audit_date, audit_date,
is_audit,
appraise_user, appraise_user,
appraise_nick, appraise_nick,
appraise_score, appraise_score,
appraise_remark, appraise_remark,
is_appraise,
create_by, create_by,
create_time, create_time,
update_by, update_by,
@@ -246,10 +258,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{item.auditUser}, #{item.auditUser},
#{item.auditNick}, #{item.auditNick},
#{item.auditDate}, #{item.auditDate},
#{item.isAudit},
#{item.appraiseUser}, #{item.appraiseUser},
#{item.appraiseNick}, #{item.appraiseNick},
#{item.appraiseScore}, #{item.appraiseScore},
#{item.appraiseRemark}, #{item.appraiseRemark},
#{item.isAppraise},
#{item.createBy}, #{item.createBy},
#{item.createTime}, #{item.createTime},
#{item.updateBy}, #{item.updateBy},
@@ -258,7 +272,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach> </foreach>
</insert> </insert>


<!--更新-->
<update id="updateTAgentTask" parameterType="TAgentTask"> <update id="updateTAgentTask" parameterType="TAgentTask">
update t_agent_task update t_agent_task
<trim prefix="SET" suffixOverrides=","> <trim prefix="SET" suffixOverrides=",">
@@ -290,15 +303,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="auditUser != null">audit_user = #{auditUser},</if> <if test="auditUser != null">audit_user = #{auditUser},</if>
<if test="auditNick != null">audit_nick = #{auditNick},</if> <if test="auditNick != null">audit_nick = #{auditNick},</if>
<if test="auditDate != null">audit_date = #{auditDate},</if> <if test="auditDate != null">audit_date = #{auditDate},</if>
<if test="isAudit != null">is_audit = #{isAudit},</if>
<if test="appraiseUser != null">appraise_user = #{appraiseUser},</if> <if test="appraiseUser != null">appraise_user = #{appraiseUser},</if>
<if test="appraiseNick != null">appraise_nick = #{appraiseNick},</if> <if test="appraiseNick != null">appraise_nick = #{appraiseNick},</if>
<if test="appraiseScore != null">appraise_score = #{appraiseScore},</if> <if test="appraiseScore != null">appraise_score = #{appraiseScore},</if>
<if test="appraiseRemark != null">appraise_remark = #{appraiseRemark},</if> <if test="appraiseRemark != null">appraise_remark = #{appraiseRemark},</if>
<if test="isAppraise != null">is_appraise = #{isAppraise},</if>
<if test="createBy != null">create_by = #{createBy},</if> <if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if> <if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if> <if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if> <if test="updateTime != null">update_time = #{updateTime},</if>
<if test="params != null and params.__UPDATE != null"><foreach collection="params.__UPDATE" item="val" index="col">`${col}` = #{val},</foreach></if>
</trim> </trim>
where id = #{id} where id = #{id}
</update> </update>
@@ -336,34 +350,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="item.auditUser != null">audit_user = #{item.auditUser},</if> <if test="item.auditUser != null">audit_user = #{item.auditUser},</if>
<if test="item.auditNick != null">audit_nick = #{item.auditNick},</if> <if test="item.auditNick != null">audit_nick = #{item.auditNick},</if>
<if test="item.auditDate != null">audit_date = #{item.auditDate},</if> <if test="item.auditDate != null">audit_date = #{item.auditDate},</if>
<if test="item.isAudit != null">is_audit = #{item.isAudit},</if>
<if test="item.appraiseUser != null">appraise_user = #{item.appraiseUser},</if> <if test="item.appraiseUser != null">appraise_user = #{item.appraiseUser},</if>
<if test="item.appraiseNick != null">appraise_nick = #{item.appraiseNick},</if> <if test="item.appraiseNick != null">appraise_nick = #{item.appraiseNick},</if>
<if test="item.appraiseScore != null">appraise_score = #{item.appraiseScore},</if> <if test="item.appraiseScore != null">appraise_score = #{item.appraiseScore},</if>
<if test="item.appraiseRemark != null">appraise_remark = #{item.appraiseRemark},</if> <if test="item.appraiseRemark != null">appraise_remark = #{item.appraiseRemark},</if>
<if test="item.isAppraise != null">is_appraise = #{item.isAppraise},</if>
<if test="item.createBy != null">create_by = #{item.createBy},</if> <if test="item.createBy != null">create_by = #{item.createBy},</if>
<if test="item.createTime != null">create_time = #{item.createTime},</if> <if test="item.createTime != null">create_time = #{item.createTime},</if>
<if test="item.updateBy != null">update_by = #{item.updateBy},</if> <if test="item.updateBy != null">update_by = #{item.updateBy},</if>
<if test="item.updateTime != null">update_time = #{item.updateTime},</if> <if test="item.updateTime != null">update_time = #{item.updateTime},</if>
<if test="item.params != null and item.params.__UPDATE != null"><foreach collection="item.params.__UPDATE" item="val" index="col">`${col}` = #{val},</foreach></if>
</set> </set>
where id = #{item.id} where id = #{item.id}
</foreach> </foreach>
</update> </update>


<!--主键删除-->
<delete id="deleteTAgentTaskById" parameterType="Long"> <delete id="deleteTAgentTaskById" parameterType="Long">
delete from t_agent_task where id = #{id} delete from t_agent_task where id = #{id}
</delete> </delete>


<!--主键批量删除-->
<delete id="deleteTAgentTaskByIds" parameterType="String"> <delete id="deleteTAgentTaskByIds" parameterType="String">
delete from t_agent_task where id in
delete from t_agent_task where id in
<foreach item="id" collection="array" open="(" separator="," close=")"> <foreach item="id" collection="array" open="(" separator="," close=")">
#{id} #{id}
</foreach> </foreach>
</delete> </delete>


<!-- Harm -->
<!--单条条件查询--> <!--单条条件查询-->
<select id="selectTAgentTask" parameterType="TAgentTask" resultMap="TAgentTaskResult"> <select id="selectTAgentTask" parameterType="TAgentTask" resultMap="TAgentTaskResult">
<include refid="selectTAgentTaskVo"/> <include refid="selectTAgentTaskVo"/>
@@ -396,17 +408,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="auditUser != null and auditUser != ''"> and audit_user = #{auditUser}</if> <if test="auditUser != null and auditUser != ''"> and audit_user = #{auditUser}</if>
<if test="auditNick != null and auditNick != ''"> and audit_nick = #{auditNick}</if> <if test="auditNick != null and auditNick != ''"> and audit_nick = #{auditNick}</if>
<if test="auditDate != null "> and audit_date = #{auditDate}</if> <if test="auditDate != null "> and audit_date = #{auditDate}</if>
<if test="isAudit != null and isAudit != ''"> and is_audit = #{isAudit}</if>
<if test="appraiseUser != null and appraiseUser != ''"> and appraise_user = #{appraiseUser}</if> <if test="appraiseUser != null and appraiseUser != ''"> and appraise_user = #{appraiseUser}</if>
<if test="appraiseNick != null and appraiseNick != ''"> and appraise_nick = #{appraiseNick}</if> <if test="appraiseNick != null and appraiseNick != ''"> and appraise_nick = #{appraiseNick}</if>
<if test="appraiseScore != null "> and appraise_score = #{appraiseScore}</if> <if test="appraiseScore != null "> and appraise_score = #{appraiseScore}</if>
<if test="appraiseRemark != null and appraiseRemark != ''"> and appraise_remark = #{appraiseRemark}</if> <if test="appraiseRemark != null and appraiseRemark != ''"> and appraise_remark = #{appraiseRemark}</if>
<if test="isAppraise != null and isAppraise != ''"> and is_appraise = #{isAppraise}</if>
</where> </where>
limit 1 limit 1
</select> </select>


<!--条件查询数量--> <!--条件查询数量-->
<select id="selectTAgentTaskCount" parameterType="TAgentTask" resultType="Long"> <select id="selectTAgentTaskCount" parameterType="TAgentTask" resultType="Long">
select count(*) from t_agent_task
select count(*) from t_agent_task
<where> <where>
<if test="agentCenter != null and agentCenter != ''"> and agent_center = #{agentCenter}</if> <if test="agentCenter != null and agentCenter != ''"> and agent_center = #{agentCenter}</if>
<if test="countyCode != null and countyCode != ''"> and county_code = #{countyCode}</if> <if test="countyCode != null and countyCode != ''"> and county_code = #{countyCode}</if>
@@ -436,17 +450,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="auditUser != null and auditUser != ''"> and audit_user = #{auditUser}</if> <if test="auditUser != null and auditUser != ''"> and audit_user = #{auditUser}</if>
<if test="auditNick != null and auditNick != ''"> and audit_nick = #{auditNick}</if> <if test="auditNick != null and auditNick != ''"> and audit_nick = #{auditNick}</if>
<if test="auditDate != null "> and audit_date = #{auditDate}</if> <if test="auditDate != null "> and audit_date = #{auditDate}</if>
<if test="isAudit != null and isAudit != ''"> and is_audit = #{isAudit}</if>
<if test="appraiseUser != null and appraiseUser != ''"> and appraise_user = #{appraiseUser}</if> <if test="appraiseUser != null and appraiseUser != ''"> and appraise_user = #{appraiseUser}</if>
<if test="appraiseNick != null and appraiseNick != ''"> and appraise_nick = #{appraiseNick}</if> <if test="appraiseNick != null and appraiseNick != ''"> and appraise_nick = #{appraiseNick}</if>
<if test="appraiseScore != null "> and appraise_score = #{appraiseScore}</if> <if test="appraiseScore != null "> and appraise_score = #{appraiseScore}</if>
<if test="appraiseRemark != null and appraiseRemark != ''"> and appraise_remark = #{appraiseRemark}</if> <if test="appraiseRemark != null and appraiseRemark != ''"> and appraise_remark = #{appraiseRemark}</if>
<if test="isAppraise != null and isAppraise != ''"> and is_appraise = #{isAppraise}</if>
</where> </where>
</select> </select>


<!--条件查询是否存在--> <!--条件查询是否存在-->
<select id="selectTAgentTaskExists" parameterType="TAgentTask" resultType="int"> <select id="selectTAgentTaskExists" parameterType="TAgentTask" resultType="int">
select exists ( select exists (
select 1 from t_agent_task
select 1 from t_agent_task
<where> <where>
<if test="agentCenter != null and agentCenter != ''"> and agent_center = #{agentCenter}</if> <if test="agentCenter != null and agentCenter != ''"> and agent_center = #{agentCenter}</if>
<if test="countyCode != null and countyCode != ''"> and county_code = #{countyCode}</if> <if test="countyCode != null and countyCode != ''"> and county_code = #{countyCode}</if>
@@ -476,10 +492,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="auditUser != null and auditUser != ''"> and audit_user = #{auditUser}</if> <if test="auditUser != null and auditUser != ''"> and audit_user = #{auditUser}</if>
<if test="auditNick != null and auditNick != ''"> and audit_nick = #{auditNick}</if> <if test="auditNick != null and auditNick != ''"> and audit_nick = #{auditNick}</if>
<if test="auditDate != null "> and audit_date = #{auditDate}</if> <if test="auditDate != null "> and audit_date = #{auditDate}</if>
<if test="isAudit != null and isAudit != ''"> and is_audit = #{isAudit}</if>
<if test="appraiseUser != null and appraiseUser != ''"> and appraise_user = #{appraiseUser}</if> <if test="appraiseUser != null and appraiseUser != ''"> and appraise_user = #{appraiseUser}</if>
<if test="appraiseNick != null and appraiseNick != ''"> and appraise_nick = #{appraiseNick}</if> <if test="appraiseNick != null and appraiseNick != ''"> and appraise_nick = #{appraiseNick}</if>
<if test="appraiseScore != null "> and appraise_score = #{appraiseScore}</if> <if test="appraiseScore != null "> and appraise_score = #{appraiseScore}</if>
<if test="appraiseRemark != null and appraiseRemark != ''"> and appraise_remark = #{appraiseRemark}</if> <if test="appraiseRemark != null and appraiseRemark != ''"> and appraise_remark = #{appraiseRemark}</if>
<if test="isAppraise != null and isAppraise != ''"> and is_appraise = #{isAppraise}</if>
</where> </where>
limit 1 limit 1
) )
@@ -503,4 +521,76 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</trim> </trim>
where id = #{id} where id = #{id}
</update> </update>

<resultMap id="AgentTaskTownGroupResultMap" type="com.ruoyi.agentcenter.vo.AgentTaskTownGroup">
<result property="num" column="num"/>
<result property="numProcessFinish" column="num_process_finish"/>
<result property="numApprovalFinish" column="num_approval_finish"/>
<result property="numExcept" column="num_except"/>
<result property="townName" column="town_name"/>
<result property="townCode" column="town_code"/>
<result property="orderYear" column="order_year"/>
<result property="orderMonth" column="order_month"/>
</resultMap>

<select id="getAgentTaskGroupByTown" parameterType="TAgentTask" resultMap="AgentTaskTownGroupResultMap">
SELECT
COUNT(*) as num,
IFNULL(SUM(IF(agent_status = '3', 1, 0)), 0) as num_process_finish,
IFNULL(SUM(IF(is_audit = 'Y', 1, 0)), 0) as num_approval_finish,
IFNULL(SUM(IF(agent_status != '3' AND end_at &lt; #{endAt}, 1, 0)), 0) as num_except,
town_name, town_code,
order_year, order_month
FROM
t_agent_task
<where>
<if test="agentCenter != null and agentCenter != ''"> and agent_center = #{agentCenter}</if>
<if test="countyCode != null and countyCode != ''"> and county_code = #{countyCode}</if>
<if test="orderYear != null and orderYear != ''"> and order_year = #{orderYear}</if>
<if test="orderMonth != null and orderMonth != ''"> and order_month = #{orderMonth}</if>
</where>
GROUP BY town_code
ORDER BY town_code
</select>

<resultMap id="AgentTaskVillageGroupResultMap" type="com.ruoyi.agentcenter.vo.AgentTaskVillageGroup">
<result property="num" column="num"/>
<result property="numProcessFinish" column="num_process_finish"/>
<result property="numApprovalFinish" column="num_approval_finish"/>
<result property="numExcept" column="num_except"/>
<result property="orgName" column="org_name"/>
<result property="orgCode" column="org_code"/>
<result property="townCode" column="town_code"/>
<result property="bookId" column="book_id"/>
<result property="bookName" column="book_name"/>
<result property="distriDate" column="distri_date"/>
<result property="handleDate" column="handle_date"/>
<result property="endAt" column="end_at"/>
<result property="handleNick" column="handle_nick"/>
</resultMap>

<select id="getAgentTaskGroupByVillage" parameterType="TAgentTask" resultMap="AgentTaskVillageGroupResultMap">
SELECT
COUNT(*) as num,
IFNULL(SUM(IF(agent_status = '3', 1, 0)), 0) as num_process_finish,
IFNULL(SUM(IF(is_audit = 'Y', 1, 0)), 0) as num_approval_finish,
IFNULL(SUM(IF(agent_status != '3' AND end_at &lt; #{endAt}, 1, 0)), 0) as num_except,
org_name, org_code, town_code,
MAX(end_at) as end_at, MAX(handle_date) as handle_date, MAX(end_at) as end_at, handle_nick
FROM
t_agent_task
<where>
<if test="agentCenter != null and agentCenter != ''"> and agent_center = #{agentCenter}</if>
<if test="townCode != null and townCode != ''"> and town_code = #{townCode}</if>
<if test="orderYear != null and orderYear != ''"> and order_year = #{orderYear}</if>
<if test="orderMonth != null and orderMonth != ''"> and order_month = #{orderMonth}</if>
<if test="params != null">
<if test="params.townCodeList != null">
AND town_code IN (null <foreach collection="params.townCodeList" item="i">,#{i}</foreach> )
</if>
</if>
</where>
GROUP BY org_code
ORDER BY org_code
</select>
</mapper> </mapper>

+ 73
- 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java Прегледај датотеку

@@ -7,6 +7,7 @@ import java.util.Map;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import com.ruoyi.common.utils.translation.TranslateUtils;


/** /**
* Entity基类 * Entity基类
@@ -115,4 +116,76 @@ public class BaseEntity implements Serializable
{ {
this.params = params; this.params = params;
} }
/*
* keepRawField为true, 保存原值到params
* */
public void translate(boolean... keepRawField) {
boolean b = null != keepRawField && keepRawField.length > 0 && keepRawField[0];
TranslateUtils.translateEntity(this, b);
}

@SuppressWarnings("unchecked")
public <T extends BaseEntity> T putParam(String name, Object value) {
getParams().put(name, value);
return (T) this;
}

@SuppressWarnings("unchecked")
public <T extends BaseEntity> T putParams(Object... args) {
for (int i = 0; i < args.length; i += 2) {
String name = (String) args[i];
Object value = args[i + 1];
getParams().put(name, value);
}
return (T) this;
}

@SuppressWarnings("unchecked")
public <T extends BaseEntity> T removeParam(String... name) {
if (params != null && null != name && name.length > 0) {
for (String s : name) {
params.remove(s);
}
}
return (T) this;
}

@SuppressWarnings("unchecked")
public <T extends BaseEntity> T removeParams() {
if (params != null)
params.clear();
return (T) this;
}

public Object obtainParam(String name) {
if (params == null)
return null;
return params.get(name);
}

public Object obtainParam(String name, Object defValue) {
if (params == null)
return defValue;
return params.getOrDefault(name, defValue);
}

@SuppressWarnings("unchecked")
public <T> T obtainParamT(String name) {
if (params == null)
return null;
return (T) params.get(name);
}

@SuppressWarnings("unchecked")
public <T> T obtainParamT(String name, T defValue) {
if (params == null)
return defValue;
return (T) params.getOrDefault(name, defValue);
}

public boolean containsParam(String name) {
if (params == null)
return false;
return params.containsKey(name);
}
} }

+ 26
- 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java Прегледај датотеку

@@ -24,6 +24,8 @@ public class SysDept extends BaseEntity
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;


public static final long ROOT_DEPT_ID = 100;

/** 部门ID */ /** 部门ID */
private Long deptId; private Long deptId;


@@ -69,6 +71,10 @@ public class SysDept extends BaseEntity
/** 账套数 */ /** 账套数 */
private Integer bookCount; private Integer bookCount;


// 级联递归查询
private Long rootId;
private Integer orgCodeLength;

public String getRemoteUrl() public String getRemoteUrl()
{ {
return remoteUrl; return remoteUrl;
@@ -275,4 +281,24 @@ public class SysDept extends BaseEntity
return 0; return 0;
return orgCode.length(); return orgCode.length();
} }

public Long getRootId()
{
return rootId;
}

public void setRootId(Long rootId)
{
this.rootId = rootId;
}

public Integer getOrgCodeLength()
{
return orgCodeLength;
}

public void setOrgCodeLength(Integer orgCodeLength)
{
this.orgCodeLength = orgCodeLength;
}
} }

+ 240
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/ContainerUtils.java Прегледај датотеку

@@ -0,0 +1,240 @@
package com.ruoyi.common.utils;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.NumberUtil;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public final class ContainerUtils
{
public static <T, R> List<T> unique(Function<T, R> getIdFunc, Collection<T>...args)
{
List<T> list = new ArrayList<>();
Arrays.stream(args).filter(CollectionUtil::isNotEmpty).forEach(list::addAll);
return unique(list, getIdFunc);
}

public static <T, R> List<T> unique_override(Function<T, R> getIdFunc, Collection<T>...args)
{
List<T> list = new ArrayList<>();
Arrays.stream(args).filter(CollectionUtil::isNotEmpty).forEach(list::addAll);
return unique_override(list, getIdFunc);
}

// keep
public static <T, R> List<T> unique(Collection<T> collection, Function<T, R> getIdFunc)
{
return new ArrayList<>(collection.stream().collect(Collectors.toMap(getIdFunc, x -> x, (a, b) -> a, LinkedHashMap::new)).values());
}

public static <T, R> List<T> unique_override(Collection<T> collection, Function<T, R> getIdFunc)
{
return new ArrayList<>(collection.stream().collect(Collectors.toMap(getIdFunc, x -> x, (a, b) -> b, LinkedHashMap::new)).values());
}

public static <T, R> List<R> mapToList(Collection<T> collection, Function<T, R> mapFunc, boolean...unique)
{
Stream<R> rStream = collection.stream().map(mapFunc);
if(null != unique && unique.length > 0 && ConvertUtils.FALSE(unique[0]))
rStream = rStream.distinct();
return rStream.collect(Collectors.toList());
}

public static <T> List<T> subList(List<T> list, int start, Integer...end)
{
int num = list.size();
if(num == 0)
return new ArrayList<>();
if(start < 0)
start = num + start;
if(start < 0 || start >= num)
return new ArrayList<>();
int e = list.size();
if(null != end && end.length > 0)
e = end[0];
if(e < 0)
e = list.size() + e;
if(e < 0 || e > num)
return new ArrayList<>();
return list.subList(start, e);
}

public static <T> List<T> filterToList(Collection<T> collection, Predicate<T> filterFunc)
{
return collection.stream().filter(filterFunc).collect(Collectors.toList());
}

public static <T, R> List<R> mapToUniqueList(Collection<T> collection, Function<T, R> mapFunc)
{
return collection.stream().map(mapFunc).distinct().collect(Collectors.toList());
}

public static <T, R> Map<R, List<T>> groupingBy(Collection<T> collection, Function<T, R> mapFunc)
{
return collection.stream().collect(Collectors.groupingBy(mapFunc));
}

public static <T, R, U> Map<R, List<U>> groupingBy(Collection<T> collection, Function<T, R> mapFunc, Function<T, U> mapValueFunc)
{
return collection.stream().collect(Collectors.groupingBy(mapFunc, Collectors.mapping(mapValueFunc, Collectors.toList())));
}

// keep
public static <T, R> Map<R, T> toMap(Collection<T> collection, Function<T, R> mapFunc)
{
return collection.stream().collect(Collectors.toMap(mapFunc, x -> x, (a, b) -> a));
}

public static <T, R> Map<R, T> toMap_override(Collection<T> collection, Function<T, R> mapFunc)
{
return collection.stream().collect(Collectors.toMap(mapFunc, x -> x, (a, b) -> b));
}

// keep
public static <T, R, U> Map<R, U> toMap(Collection<T> collection, Function<T, R> mapFunc, Function<T, U> valFunc)
{
return collection.stream().collect(Collectors.toMap(mapFunc, valFunc, (a, b) -> a));
}

public static <T, R, U> Map<R, U> toMap_override(Collection<T> collection, Function<T, R> mapFunc, Function<T, U> valFunc)
{
return collection.stream().collect(Collectors.toMap(mapFunc, valFunc, (a, b) -> b));
}

// keep
public static <T, R> Map<R, T> toLinkedMap(Collection<T> collection, Function<T, R> mapFunc)
{
return collection.stream().collect(Collectors.toMap(mapFunc, x -> x, (a, b) -> a, LinkedHashMap::new));
}

public static <T, R> Map<R, T> toLinkedMap_override(Collection<T> collection, Function<T, R> mapFunc)
{
return collection.stream().collect(Collectors.toMap(mapFunc, x -> x, (a, b) -> b, LinkedHashMap::new));
}
/*
*//**
* ListTriple::negativeList -> 集合a独有的差集
* ListTriple::zeroList -> 集合a和集合b共有的交集
* ListTriple::positiveList -> 集合b独有的差集
*//*
public static <T> ListTriple<T> intersection_difference(List<T> a, List<T> b, boolean...distinct *//* = false: 差集去重 *//*)
{
if(CollectionUtil.isEmpty(a) && CollectionUtil.isEmpty(b))
return ListTriple.empty_triple();
if(CollectionUtil.isEmpty(a) && CollectionUtil.isNotEmpty(b))
return ListTriple.make_triple(b, (x) -> 1);
if(CollectionUtil.isNotEmpty(a) && CollectionUtil.isEmpty(b))
return ListTriple.make_triple(a, (x) -> -1);
ListTriple<T> triple = ListTriple.empty_triple();
List<T> intersection = a.stream().filter(b::contains).distinct().collect(Collectors.toList());
triple.zeroList.addAll(intersection);
if(null != distinct && distinct.length > 0 && distinct[0])
{
triple.negativeList.addAll(a.stream().filter((x) -> !intersection.contains(x)).distinct().collect(Collectors.toList()));
triple.positiveList.addAll(b.stream().filter((x) -> !intersection.contains(x)).distinct().collect(Collectors.toList()));
}
else
{
triple.negativeList.addAll(a.stream().filter((x) -> !intersection.contains(x)).collect(Collectors.toList()));
triple.positiveList.addAll(b.stream().filter((x) -> !intersection.contains(x)).collect(Collectors.toList()));
}
return triple;
}*/

public static <T> T get(Collection<T> list, int index)
{
if(CollectionUtil.isEmpty(list))
return null;
int size = list.size();
int i = index < 0 ? size + index : index;
if(i < 0 || i >= size)
return null;
if(list instanceof List)
return ((List<T>) list).get(i);
else
{
Iterator<T> itor = list.iterator();
int c = 0;
while(itor.hasNext())
{
T val = itor.next();
if(c == i)
return val;
c++;
}
}
return null;
}

public static <T> boolean contains_ptr(Collection<T> list, T target)
{
if(CollectionUtil.isEmpty(list))
return false;
return list.stream().anyMatch((x) -> x == target);
}

public static <T> int indexOf_ptr(List<T> list, T target)
{
if(CollectionUtil.isEmpty(list))
return -1;
for(int i = 0; i < list.size(); i++)
{
if(list.get(i) == target)
return i;
}
return -1;
}

public static <T> List<T> combine(Collection<T>...src)
{
if(null != src && src.length > 0)
{
return Arrays.stream(src)
.filter(Objects::nonNull)
.flatMap(Collection::stream)
.collect(Collectors.toList());
}

return new ArrayList<>();
}

public static <T> List<T> combine(List<List<T>> src)
{
if(CollectionUtil.isNotEmpty(src))
{
return src.stream()
.filter(Objects::nonNull)
.flatMap(Collection::stream)
.collect(Collectors.toList());
}

return new ArrayList<>();
}

public static <T> BigDecimal reduce_s(Collection<T> list, Function<T, BigDecimal> getDecimalFunc, BigDecimal initValue)
{
BigDecimal init = null != initValue ? initValue : BigDecimal.ZERO;
if(CollectionUtil.isEmpty(list))
return init;
return list.stream().map(getDecimalFunc).reduce(init, NumberUtil::add);
}

public static <T> BigDecimal reduce_s(Collection<T> list, Function<T, BigDecimal> getDecimalFunc)
{
return reduce_s(list, getDecimalFunc, BigDecimal.ZERO);
}

private ContainerUtils() {}
}

+ 30
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/ConvertUtils.java Прегледај датотеку

@@ -0,0 +1,30 @@
package com.ruoyi.common.utils;

public final class ConvertUtils
{
// null = true
public static boolean TRUE(Boolean b)
{
return null == b || b;
}

// null = false
public static boolean FALSE(Boolean b)
{
if(null == b)
return false;
return b;
}

public static String toString_s(Object obj)
{
if(null == obj)
return "";
if(obj instanceof String)
return (String)obj;
else
return obj.toString();
}

private ConvertUtils() {}
}

+ 143
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeUtils.java Прегледај датотеку

@@ -0,0 +1,143 @@
package com.ruoyi.common.utils;

import cn.hutool.core.collection.CollectionUtil;
import lombok.Builder;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;

// zhao: 此TreeUtils不需要外部的容器包装类, 只需要配置`id`, `parentId`的getter和`children`的setter等
public final class TreeUtils
{
// 从列表构建树
public static <T> List<T>/* 树 */ makeTree(List<T> list/* = 列表 */, ConfigInterface<T> config, Object...parentIdArgs)
{
Object parentId = parentIdArgs.length > 0 ? parentIdArgs[0] : null;
return list.stream()
.filter((x) -> config.idEquals(parentId, config.getParentId(x)))
.peek((x) -> config.setChildren(x, makeTree(list, config, config.getId(x))))
.collect(Collectors.toList());
}

// 获取列表的所有叶子节点
public static <T> List<T>/* 列表 */ treeLeafs(List<T> list/* = 列表 */, ConfigInterface<T> config)
{
return list.stream().filter((x) -> list.stream()
.filter((y) -> !config.idEquals(config.getId(x), config.getId(y)))
.noneMatch((y) -> config.idEquals(config.getId(x), config.getParentId(y)))
)
.collect(Collectors.toList());
}

// 获取树的所有节点
public static <T> List<T>/* 列表 */ makeList(List<T> tree/* = 树 */, ConfigInterface<T> config)
{
List<T> res = new ArrayList<>();
foreach(tree, res::add, config);
return res;
}

// 从上到下遍历树节点
public static <T> void recursion(T node/* = 树节点 */, Consumer<T> func, ConfigInterface<T> config)
{
if(null == node)
return;
func.accept(node);
foreach(config.getChildren(node), func, config);
}

// 从上到下遍历树节点列表
public static <T> void foreach(List<T> tree/* = 树 */, Consumer<T> func, ConfigInterface<T> config)
{
if(CollectionUtil.isEmpty(tree))
return;
for(T child : tree)
recursion(child, func, config);
}

// 从下到上遍历树节点
public static <T> void recursionReverse(T node/* = 树节点 */, Consumer<T> func, ConfigInterface<T> config)
{
if(null == node)
return;
foreachReverse(config.getChildren(node), func, config);
func.accept(node);
}

// 从下到上遍历树节点列表
public static <T> void foreachReverse(List<T> tree/* = 树 */, Consumer<T> func, ConfigInterface<T> config)
{
if(CollectionUtil.isEmpty(tree))
return;
for(T child : tree)
recursionReverse(child, func, config);
}

public static interface ConfigInterface<T>
{
public default boolean idEquals(Object a, Object b) // 比较ID/父ID是否想的, 默认Object::equals
{
if(null == a && null == b)
return true;
if(null == a || null == b)
return false;
return a.equals(b);
}
public Object getId(T item); // 获取T的ID
public Object getParentId(T item); // 获取T的父ID
public void setChildren(T item, List<T> children); // 设置T的children列表
public List<T> getChildren(T object); // 获取T的children列表
}

@Data
@Builder
public static class Config<T> implements ConfigInterface<T> // 简单的可实例化的T的配置类
{
public Function<T, Object> getIdFunc; // makeTree必需, 返回I的ID
public Function<T, Object> getParentIdFunc; // makeTree必需, 返回I的父ID
public BiConsumer<T, List<T>> setChildrenFunc; // makeTree必需, 设置T的children
public BiPredicate<Object, Object> idEqualsFunc; // 非必需, 比较ID/父ID是否想的, 默认使用Object::equals

public Function<T, List<T>> getChildrenFunc; // 遍历时必需, 返回T的children列表

public boolean idEquals(Object a, Object b)
{
if(null != idEqualsFunc)
return idEqualsFunc.test(a, b);
if(null == a && null == b)
return true;
if(null == a || null == b)
return false;
return a.equals(b);
}

public Object getId(T item)
{
return getIdFunc.apply(item);
}

public Object getParentId(T item)
{
return getParentIdFunc.apply(item);
}

public void setChildren(T item, List<T> children)
{
if(CollectionUtil.isNotEmpty(children))
setChildrenFunc.accept(item, children);
}

public List<T> getChildren(T object)
{
return getChildrenFunc.apply(object);
}
}

private TreeUtils() {}
}

+ 360
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/ExtractGeneratedSource.java Прегледај датотеку

@@ -0,0 +1,360 @@
package com.ruoyi.common.utils.dev;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import com.ruoyi.common.utils.StringUtils;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.File;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

@Data
@Accessors(chain = true)
public class ExtractGeneratedSource
{
private String zipPath;
private String javaProjectPath;
private String webProjectPath;
private String module;
private Map<String, String> fileMap = new LinkedHashMap<>();

private ZipFile zipFile;

public void Set(String zipPath, String javaProjectPath, String webProjectPath, String module)
{
this.zipPath = zipPath;
this.javaProjectPath = javaProjectPath;
this.webProjectPath = webProjectPath;
this.module = module;
}

public void Reset()
{
if(null != zipFile)
{
IoUtil.close(zipFile);
zipFile = null;
}
fileMap.clear();
Set(null, null, null, null);
}

public boolean Test(String[] res)
{
StringBuilder sb = new StringBuilder();
boolean r = true;
List<String> files;
Map<String, String> map = new LinkedHashMap<>();

Function<String, String> f = (x) -> {
String str = GetExtractPath(x);
map.put(x, str);
return x + " -> " + str;
};

files = ListFileInZip("main/java/com/ruoyi/.*/domain/.*\\.java");
r = r && CollectionUtil.isNotEmpty(files);
sb.append("domain.java:\n")
.append("\t");
if(CollectionUtil.isNotEmpty(files))
sb.append(files.stream().map(f).collect(Collectors.joining("\n\t")));
else
sb.append("缺失!");
sb.append("\n\n");

files = ListFileInZip("main/java/com/ruoyi/.*/service/.*\\.java");
r = r && CollectionUtil.isNotEmpty(files);
sb.append("service.java:\n")
.append("\t");
if(CollectionUtil.isNotEmpty(files))
sb.append(files.stream().map(f).collect(Collectors.joining("\n\t")));
else
sb.append("缺失!");
sb.append("\n\n");

// files = ListFileInZip("main/java/com/ruoyi/.*/service/impl/.*\\.java");
// r = r && CollectionUtil.isNotEmpty(files);
// sb.append("service_impl.java:\n")
// .append("\t")
// .append(files.stream().map(f).collect(Collectors.joining("\n\t")))
// ;
// sb.append("\n\n");

files = ListFileInZip("main/java/com/ruoyi/.*/mapper/.*\\.java");
r = r && CollectionUtil.isNotEmpty(files);
sb.append("mapper.java:\n")
.append("\t");
if(CollectionUtil.isNotEmpty(files))
sb.append(files.stream().map(f).collect(Collectors.joining("\n\t")));
else
sb.append("缺失!");
sb.append("\n\n");

files = ListFileInZip("main/java/com/ruoyi/.*/controller/.*\\.java");
r = r && CollectionUtil.isNotEmpty(files);
sb.append("controller.java:\n")
.append("\t");
if(CollectionUtil.isNotEmpty(files))
sb.append(files.stream().map(f).collect(Collectors.joining("\n\t")));
else
sb.append("缺失!");
sb.append("\n\n");

files = ListFileInZip("main/resources/mapper/.*/.*\\.xml");
r = r && CollectionUtil.isNotEmpty(files);
sb.append("MyBatis.xml:\n")
.append("\t");
if(CollectionUtil.isNotEmpty(files))
sb.append(files.stream().map(f).collect(Collectors.joining("\n\t")));
else
sb.append("缺失!");
sb.append("\n\n");

files = ListFileInZip("vue/.*\\.vue");
r = r && CollectionUtil.isNotEmpty(files);
sb.append("Vue:\n")
.append("\t");
if(CollectionUtil.isNotEmpty(files))
sb.append(files.stream().map(f).collect(Collectors.joining("\n\t")));
else
sb.append("缺失!");
sb.append("\n\n");

files = ListFileInZip("vue/.*\\.js");
r = r && CollectionUtil.isNotEmpty(files);
sb.append("JavaScript:\n")
.append("\t");
if(CollectionUtil.isNotEmpty(files))
sb.append(files.stream().map(f).collect(Collectors.joining("\n\t")));
else
sb.append("缺失!");
sb.append("\n");

if(null != res && res.length > 0)
res[0] = sb.toString();
fileMap.clear();
if(r)
fileMap.putAll(map);
return r;
}

public boolean IsValid()
{
return StringUtils.isNotEmpty(zipPath)
&& StringUtils.isNotEmpty(javaProjectPath)
&& StringUtils.isNotEmpty(webProjectPath)
;
}

public boolean Begin()
{
try
{
zipFile = new ZipFile(zipPath);
return true;
}
catch(Exception e)
{
e.printStackTrace();
return false;
}
}

public boolean Extract(BiFunction<String, String, Integer> ifExists)
{
if(CollectionUtil.isEmpty(fileMap))
return false;
for(Map.Entry<String, String> entry : fileMap.entrySet())
{
String src = entry.getKey();
String dst = entry.getValue();
File d = new File(dst);
if(d.exists())
{
if(null != ifExists)
{
int ife = ifExists.apply(src, dst);
if(ife == 0)
continue;
if(ife < 0)
return false;
}
}
if(!Copy(src, dst))
return false;
}
return true;
}

private boolean Copy(String src, String dst)
{
File d = new File(dst);
d.deleteOnExit();
if(mkdirs(d.getParent()) < 0)
return false;
byte[] source = ReadFileInZip(src);
if(null == source)
return false;
return null != FileUtil.writeBytes(source, d);
}

public void End()
{
}

private String GuessModuleName(String zipPath)
{
if(IsJava(zipPath))
{
int i = "main/java/com/ruoyi/".length();
int e = zipPath.indexOf("/", i);
return zipPath.substring(i, e);
}
else if(IsMybatis(zipPath))
{
int i = "main/resources/mapper/".length();
int e = zipPath.indexOf("/", i);
return zipPath.substring(i, e);
}
return null;
}

private String GetModuleName(String zipPath)
{
if(StringUtils.isNotEmpty(module))
return module;
return GuessModuleName(zipPath);
}

private String GetExtractPath(String zipPath)
{
File file = new File(zipPath);
String fileName = file.getName();
if(IsJava(zipPath))
{
if(IsController(zipPath))
{
String name = GuessModuleName(zipPath);
return getJavaProjectPath() + "/ruoyi-admin/src/main/java/com/ruoyi/web/controller/" + name + "/" + fileName;
}
else
{
String moduleName = GetModuleName(zipPath);
return getJavaProjectPath() + "/ruoyi-" + moduleName + "/src/" + zipPath;
}
}
else if(IsMybatis(zipPath))
{
String moduleName = GetModuleName(zipPath);
return getJavaProjectPath() + "/ruoyi-" + moduleName + "/src/" + zipPath;
}
else if(IsVue(zipPath) || IsJavaScript(zipPath))
{
return webProjectPath + "/ruoyi-ui/src" + zipPath.substring("vue".length());
}
return null;
}

private boolean IsJava(String zipPath)
{
return zipPath.endsWith(".java");
}

private boolean IsController(String zipPath)
{
return zipPath.endsWith("Controller.java");
}

private boolean IsMybatis(String zipPath)
{
return zipPath.endsWith(".xml");
}

private boolean IsVue(String zipPath)
{
return zipPath.endsWith(".vue");
}

private boolean IsJavaScript(String zipPath)
{
return zipPath.endsWith(".js");
}

private List<String> ListFileInZip(String regexp)
{
return zipFile.stream()
.map(ZipEntry::getName)
.filter((x) -> {
return (Pattern.matches(regexp, x));
}).collect(Collectors.toList());
}

private byte[] ReadFileInZip(String path)
{
ZipEntry entry = zipFile.getEntry(path);
if(null == entry)
return null;

InputStream is = null;

try
{
is = zipFile.getInputStream(entry);
return IoUtil.readBytes(is);
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
finally
{
IoUtil.close(is);
}
}

private int mkdirs(String path)
{
File file = new File(path);
if(file.exists())
{
if(file.isDirectory())
return 0;
else
return -1;
}
return file.mkdirs() ? 1 : -2;
}

private String AppendPath(String basePath, String filePath)
{
String path = basePath + File.separator + filePath;
File file = new File(path);
try
{
return file.getCanonicalPath();
}
catch(Exception e)
{
e.printStackTrace();
return path;
}
}

public static void main(String[] args)
{
ExtractGeneratedSourceGUI program = new ExtractGeneratedSourceGUI();
program.setVisible(true);
}
}

+ 143
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/ExtractGeneratedSourceGUI.java Прегледај датотеку

@@ -0,0 +1,143 @@
package com.ruoyi.common.utils.dev;

import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.dev.gui.FileField;
import com.ruoyi.common.utils.dev.gui.InputField;

import javax.swing.*;
import java.awt.*;

public class ExtractGeneratedSourceGUI extends JFrame
{
private ExtractGeneratedSource engine;
private FileField zipPath;
private FileField javaProjectPath;
private FileField webProjectPath;
private InputField module;
private JTextPane result;
private JButton writeBtn;
private boolean canWrite;

public ExtractGeneratedSourceGUI()
{
super();
engine = new ExtractGeneratedSource();
Setup();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("代码解压器");
pack();
}

private void Reset()
{
engine.Reset();
zipPath.Reset();
javaProjectPath.Reset();
module.Reset();
webProjectPath.Reset();
canWrite = false;
writeBtn.setEnabled(false);
}

private void Setup()
{
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu fileMenu = new JMenu("文件");
JMenuItem menuItem = new JMenuItem("清空");
menuItem.addActionListener(x -> Reset());
fileMenu.add(menuItem);
menuItem = new JMenuItem("退出");
menuItem.addActionListener(x -> System.exit(0));
fileMenu.add(menuItem);
JMenu otherMenu = new JMenu("其他");
menuItem = new JMenuItem("关于");
menuItem.addActionListener(x -> JOptionPane.showMessageDialog(this, "解压生成的代码压缩包", "关于", JOptionPane.INFORMATION_MESSAGE));
otherMenu.add(menuItem);
menuBar.add(fileMenu);
menuBar.add(otherMenu);
zipPath = new FileField("源码zip文件(可拖拽)");
javaProjectPath = new FileField("后端项目根目录(可拖拽)");
webProjectPath = new FileField("前端项目根目录(可拖拽)");
String path;
path = System.getenv("RUOYI_SOURCE_DIRECTORY_PATH");
if(StringUtils.isNotEmpty(path))
zipPath.SetLastPath(path);
path = System.getenv("RUOYI_JAVA_PROJECT_PATH");
if(StringUtils.isNotEmpty(path))
javaProjectPath.SetPath(path);
path = System.getenv("RUOYI_WEB_PROJECT_PATH");
if(StringUtils.isNotEmpty(path))
webProjectPath.SetPath(path);
module = new InputField("模块");
module.SetToolTipText("例如. home(为空则自动从zip中获取)");
zipPath.SetFilter(".zip");
javaProjectPath.SetMode(JFileChooser.DIRECTORIES_ONLY);
webProjectPath.SetMode(JFileChooser.DIRECTORIES_ONLY);
Box formPanel = Box.createVerticalBox();
formPanel.setAutoscrolls(true);
formPanel.add(zipPath);
formPanel.add(javaProjectPath);
formPanel.add(webProjectPath);
formPanel.add(module);
result = new JTextPane();
JScrollPane scrollPane = new JScrollPane(result);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
result.setFont(Font.getFont(Font.MONOSPACED));
formPanel.add(scrollPane);
BorderLayout mainLayout = new BorderLayout();
JPanel panel = new JPanel();
panel.setLayout(mainLayout);
panel.add(formPanel, BorderLayout.CENTER);
Box toolbar = Box.createHorizontalBox();
toolbar.add(Box.createHorizontalGlue());
writeBtn = new JButton("复制");
writeBtn.addActionListener(e -> Copy());
writeBtn.setEnabled(false);
toolbar.add(writeBtn);
JButton startBtn = new JButton("测试");
startBtn.addActionListener(e -> Test());
toolbar.add(startBtn);
JButton clearBtn = new JButton("清空");
clearBtn.addActionListener(e -> Reset());
toolbar.add(clearBtn);
panel.add(toolbar, BorderLayout.SOUTH);
setContentPane(panel);
}

private void Test()
{
engine.Set(zipPath.Path(), javaProjectPath.Path(), webProjectPath.Path(), module.Text());
if(!engine.IsValid())
{
JOptionPane.showMessageDialog(this, "必须设置源码zip和后端/前端项目目录", "警告", JOptionPane.ERROR_MESSAGE);
return;
}
engine.Begin();
String[] res = {null};
canWrite = engine.Test(res);
result.setText(res[0]);
writeBtn.setEnabled(canWrite);
}

private void Copy()
{
if(canWrite)
{
boolean r = engine.Extract((src, dst) -> {
int res = JOptionPane.showConfirmDialog(this, "是否覆盖已存在文件: " + dst + "(原文件: " + src + ")", "警告", JOptionPane.YES_NO_CANCEL_OPTION);
if(res == JOptionPane.YES_OPTION)
return 1;
else if(res == JOptionPane.NO_OPTION)
return 0;
else// if(res == JOptionPane.CANCEL_OPTION)
return -1;
});
if(r)
JOptionPane.showMessageDialog(this, "复制文件成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
else
JOptionPane.showMessageDialog(this, "复制文件失败!", "错误", JOptionPane.ERROR_MESSAGE);
}
engine.End();
}
}

+ 301
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/Konsole.java Прегледај датотеку

@@ -0,0 +1,301 @@
package com.ruoyi.common.utils.dev;

import java.util.Objects;

// Unix \033[字背景颜色;字体颜色m字符串\033[0m
// 高亮+闪烁+红色前景+蓝色背景
// 32位 |设置8位 0 0 0 0 0 启用背景色 背景高亮 字体高亮|字体风格8位|字体色8位|背景色8位
public class Konsole {
private static final String RESET = "\033[0m"; // Text Reset
private static final int COLOR_OFFSET = 8;
private static final int COLOR_MASK = 0xFF00;
private static final int BG_COLOR_OFFSET = 0;
private static final int BG_COLOR_MASK = 0xFF;
private static final int FONT_STYLE_OFFSET = 16;
private static final int FONT_STYLE_MASK = 0xFF0000;
private static final int STYLE_OFFSET = 24;
private static final int STYLE_MASK = 0x7F000000;

// 1. 原始值: 需要SetXXX(值)设置, MakeStyle
public static final int FONT_BRIGHT = 1;
public static final int BG_BRIGHT = 1 << 1;
public static final int BG_ENABLED = 1 << 2;

public static final int NORMAL = 0; // 3:斜体 4:下划线 5:闪烁 6:默认 7:白底 8:透明 9:删除线
public static final int BOLD = 1;
public static final int FAINT = 2;
public static final int ITALIC = 3;
public static final int UNDERLINE = 4;
public static final int FLASH = 5;
public static final int DEFAULT = 6;
public static final int WHITE_BACKGROUND = 7;
public static final int TRANSLUCENT = 8;
public static final int STRIKETHROUGH = 9;
public static final int DOUBLE_UNDER_LINE = 21;

public static final int BLACK = 30; // BLACK
public static final int RED = 31; // RED
public static final int GREEN = 32; // GREEN
public static final int YELLOW = 33; // YELLOW
public static final int BLUE = 34; // BLUE
public static final int PURPLE = 35; // PURPLE
public static final int CYAN = 36; // CYAN
public static final int WHITE = 37; // WHITE

// 2. 预置值: 可以 | 或拼接
public static final int S_FONT_BRIGHT = FONT_BRIGHT << STYLE_OFFSET;
public static final int S_BG_BRIGHT = BG_BRIGHT << STYLE_OFFSET;
public static final int S_BG_ENABLED = BG_BRIGHT << STYLE_OFFSET;

public static final int FS_NORMAL = NORMAL;
public static final int FS_BOLD = BOLD << FONT_STYLE_OFFSET;
public static final int FS_FAINT = FAINT << FONT_STYLE_OFFSET;
public static final int FS_ITALIC = ITALIC << FONT_STYLE_OFFSET;
public static final int FS_UNDERLINE = UNDERLINE << FONT_STYLE_OFFSET;
public static final int FS_FLASH = FLASH << FONT_STYLE_OFFSET;
public static final int FS_DEFAULT = DEFAULT << FONT_STYLE_OFFSET;
public static final int FS_WHITE_BACKGROUND = WHITE_BACKGROUND << FONT_STYLE_OFFSET;
public static final int FS_TRANSLUCENT = TRANSLUCENT << FONT_STYLE_OFFSET;
public static final int FS_STRIKETHROUGH = STRIKETHROUGH << FONT_STYLE_OFFSET;
public static final int FS_DOUBLE_UNDER_LINE = DOUBLE_UNDER_LINE << STYLE_OFFSET;

public static final int FC_BLACK = BLACK << COLOR_OFFSET;
public static final int FC_RED = RED << COLOR_OFFSET;
public static final int FC_GREEN = GREEN << COLOR_OFFSET;
public static final int FC_YELLOW = YELLOW << COLOR_OFFSET;
public static final int FC_BLUE = BLUE << COLOR_OFFSET;
public static final int FC_PURPLE = PURPLE << COLOR_OFFSET;
public static final int FC_CYAN = CYAN << COLOR_OFFSET;
public static final int FC_WHITE = WHITE << COLOR_OFFSET;

public static final int BC_BLACK = BLACK;
public static final int BC_RED = RED;
public static final int BC_GREEN = GREEN;
public static final int BC_YELLOW = YELLOW;
public static final int BC_BLUE = BLUE;
public static final int BC_PURPLE = PURPLE;
public static final int BC_CYAN = CYAN;
public static final int BC_WHITE = WHITE;

public static final int FC_BRIGHT_BLACK = (BLACK + 60) << COLOR_OFFSET;
public static final int FC_BRIGHT_RED = (RED + 60) << COLOR_OFFSET;
public static final int FC_BRIGHT_GREEN = (GREEN + 60) << COLOR_OFFSET;
public static final int FC_BRIGHT_YELLOW = (YELLOW + 60) << COLOR_OFFSET;
public static final int FC_BRIGHT_BLUE = (BLUE + 60) << COLOR_OFFSET;
public static final int FC_BRIGHT_PURPLE = (PURPLE + 60) << COLOR_OFFSET;
public static final int FC_BRIGHT_CYAN = (CYAN + 60) << COLOR_OFFSET;
public static final int FC_BRIGHT_WHITE = (WHITE + 60) << COLOR_OFFSET;

public static final int BC_BRIGHT_BLACK = BLACK + 70;
public static final int BC_BRIGHT_RED = RED + 70;
public static final int BC_BRIGHT_GREEN = GREEN + 70;
public static final int BC_BRIGHT_YELLOW = YELLOW + 70;
public static final int BC_BRIGHT_BLUE = BLUE + 70;
public static final int BC_BRIGHT_PURPLE = PURPLE + 70;
public static final int BC_BRIGHT_CYAN = CYAN + 70;
public static final int BC_BRIGHT_WHITE = WHITE + 70;

public int style;

public Konsole(int style) {
this.style = style;
}

public Konsole SetFontColor(int color) {
this.style = SetAttribute(color, COLOR_OFFSET, COLOR_MASK);
return this;
}

public Konsole SetFontStyle(int style) {
this.style = SetAttribute(style, FONT_STYLE_OFFSET, FONT_STYLE_MASK);
return this;
}

public Konsole SetBGColor(int color) {
this.style = SetAttribute(color, BG_COLOR_OFFSET, BG_COLOR_MASK);
return this;
}

public Konsole SetStyleConfig(int style, boolean enabled) {
if(enabled)
this.style = style << STYLE_OFFSET | (this.style & ~STYLE_MASK);
else
this.style = (this.style & ~STYLE_MASK) & ~(style << STYLE_OFFSET);
return this;
}

public int Style() {
return style;
}

public Konsole Style(int style) {
this.style = style;
return this;
}

private int SetAttribute(int color, int offset, int mask) {
int newColor = color << offset;
return (this.style & ~mask) | newColor;
}

private static int GetAttribute(int style, int offset, int mask) {
return (style & mask) >> offset;
}

@Override
public String toString() {
return GetEscString(this.style);
}

public String Output(String str)
{
StringBuilder sb = new StringBuilder();
sb.append(GetEscString(style));
sb.append(str);
sb.append(RESET);
return sb.toString();
}

public static String MakeText(String str, int style)
{
StringBuilder sb = new StringBuilder();
sb.append(GetEscString(style));
sb.append(str);
sb.append(RESET);
return sb.toString();
}

public static int MakeStyle(int fontColor, int fontStyle, int bgColor, int style)
{
return (fontColor << COLOR_OFFSET) | (fontStyle << FONT_STYLE_OFFSET) | (bgColor << BG_COLOR_OFFSET) << (style << STYLE_OFFSET);
}

public static int GenStyle(int... mask)
{
int style = 0;
for (int j : mask) style |= j;
return style;
}

private static String GetEscString(int style) {
if (style == 0) return RESET;
StringBuilder sb = new StringBuilder();
sb.append("\033[");
sb.append(GenStyleStr(style));
sb.append("m");
return sb.toString();
}

private static String GenStyleStr(int style) {
int enableBG = GetAttribute(style, 2, STYLE_MASK);
int fontColor = GetAttribute(style, COLOR_OFFSET, COLOR_MASK);
int fontStyle = GetAttribute(style, FONT_STYLE_OFFSET, FONT_STYLE_MASK);

StringBuilder sb = new StringBuilder();
if(fontStyle != 0)
sb.append(fontStyle).append(";");
if(fontColor != 0)
{
int hlFont = GetAttribute(style, 0, STYLE_MASK);
fontColor = GenColor(fontColor, hlFont != 0 ? 90 - 30 : 0);
sb.append(fontColor).append(";");
}
if(enableBG != 0)
{
int bgColor = GetAttribute(style, BG_COLOR_OFFSET, BG_COLOR_MASK);
if(bgColor != 0)
{
int hlBG = GetAttribute(style, 1, STYLE_MASK);
bgColor = GenColor(bgColor, hlBG != 0 ? 100 - 30 : 40 - 30);
sb.append(bgColor).append(";");
}
}

if(sb.length() > 0 && sb.lastIndexOf(";") == sb.length() - 1)
sb.deleteCharAt(sb.length() - 1);

return sb.toString();
}

private static int GenColor(int color, int base)
{
return color + base;
}

public static final int STDOUT = 1;
public static final int STDERR = 2;
public static class out
{
public static void println(int style, Object obj)
{
System.out.println(MakeText(Objects.toString(obj), style));
}

public static void print(int style, Object obj)
{
System.out.print(MakeText(Objects.toString(obj), style));
}

public static void printf(int style, String fmt, Object...args)
{
if(null == fmt)
println(style, fmt);
else
println(style, String.format(fmt, args));
}
}

public static class err
{
public static void println(int style, Object obj)
{
System.err.println(MakeText(Objects.toString(obj), style));
}

public static void print(int style, Object obj)
{
System.err.print(MakeText(Objects.toString(obj), style));
}

public static void printf(int style, String fmt, Object...args)
{
if(null == fmt)
println(style, fmt);
else
println(style, String.format(fmt, args));
}
}

public static void cout(int style, Object obj)
{
out.println(style, obj);
}

public static void cerr(int style, Object obj)
{
err.println(style, obj);
}

public static void printf(int style, String fmt, Object...args)
{
out.printf(style, fmt, args);
}

public static void fprintf(int file, int style, String fmt, Object...args)
{
if(file == STDERR)
err.printf(style, fmt, args);
else
out.printf(style, fmt, args);
}

public static String sprintf(int style, String fmt, Object...args)
{
return MakeText(null != fmt ? String.format(fmt, args) : "null", style);
}

public static void main(String[] args) {
System.out.println("\033[0;7;31;44m TEXT \033[0m");
System.out.println(MakeText("TEXT", FS_UNDERLINE | FC_BLUE | S_BG_BRIGHT | S_BG_ENABLED | BC_CYAN | S_FONT_BRIGHT));
}
}

+ 394
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/SQLQueryFuncGen.java Прегледај датотеку

@@ -0,0 +1,394 @@
package com.ruoyi.common.utils.dev;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.utils.StringUtils;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.File;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

@Data
@Accessors(chain = true)
public class SQLQueryFuncGen
{
private String workPath;
private String queryId;
private String entity;
private String module;
private String packageName;
private String comment;
private Map<String, String> parameterType;
private String returnType;
private String mapper_java;
private String service_java;
private String serviceImpl_java;
private final static String PARAM_DEFAULT_NAME = "cond";

public String GetParameterType()
{
return GenParameterStr(1);
}

public void SetParameterType(String type)
{
parameterType = ParseParameterType(type);
}

public String GetReturnType()
{
return returnType;
}

public void SetReturnType(String type)
{
this.returnType = ParseReturnType(type);
}

public SQLQueryFuncGen()
{
workPath = System.getProperty("user.dir").replaceAll(File.pathSeparator, "/");
}

private String In(String label)
{
Konsole.out.print(Konsole.FC_BLUE, label);
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
if(StrUtil.isEmpty(str))
return "";
return str.trim();
}

private String WaitIn(String label)
{
String str;
do
{
str = In(label);
}
while(StrUtil.isEmpty(str));
return str;
}

private String ParseReturnType(String type)
{
if(StrUtil.isEmpty(type))
return "void" ; // entity;
if(type.equalsIgnoreCase("List"))
return String.format("List<%s>", entity);
if(type.equalsIgnoreCase("Map"))
return "Map<String, Object>";
if(type.equalsIgnoreCase("List<Map>"))
return "List<Map<String, Object>>";
return type;
}

private String ReadReturnType(String label)
{
String type = In(label);
return ParseReturnType(type);

}

private void GuessType(String type, Map<String, String> res)
{
String name = null;
String newType = null;
if(type.equalsIgnoreCase("List"))
{
name = StrUtil.lowerFirst(entity) + "List";
newType = String.format("List<%s>", entity);
}
else if(type.equalsIgnoreCase("Map"))
{
name = "map";
newType = "Map<String, Object>";
}
else if(type.equalsIgnoreCase("ID"))
{
name = "id";
newType = "Long";
}
else if(type.equalsIgnoreCase("Long"))
{
name = "num";
newType = "Long";
}
else if(type.equalsIgnoreCase("int"))
{
name = "i";
newType = "int";
}
else if(type.equalsIgnoreCase("BigDecimal"))
{
name = "num";
newType = "BigDecimal";
}
else if(type.equalsIgnoreCase("String"))
{
name = "name";
newType = "String";
}
else if(type.equalsIgnoreCase("List<Map>"))
{
name = "mapList";
newType = "List<Map<String, Object>>";
}
else if(type.equalsIgnoreCase("void"))
{
name = "";
newType = "";
}
else
{
if(!type.contains(" "))
{
name = StrUtil.lowerFirst(type);
newType = type;
}
else
{
String[] arr = type.split(" ");
for(String s : arr)
{
GuessType(s.trim(), res);
}
}
}
if(StrUtil.isNotEmpty(name))
{
int i = 0;
String newName = name;
while(res.containsKey(newName))
newName = name + (++i);
res.put(newName, newType);
}
}

private Map<String, String> ReadParameterType(String label)
{
String type = In(label);
return ParseParameterType(type);
}

private Map<String, String> ParseParameterType(String type)
{
Map<String, String> res = new LinkedHashMap<>();
if(StrUtil.isEmpty(type))
{
/*res.put(PARAM_DEFAULT_NAME, entity);
return res;*/
return null;
}
GuessType(type, res);
return res;
}

private String GenParameterStr(int type)
{
if(null == parameterType)
return "";
List<String> list = new ArrayList<>();
parameterType.forEach((k, v) -> {
String str = "";
if((type & 1) != 0)
str += v;
if((type & 2) != 0)
str += (str.isEmpty() ? k : (" " + k));
list.add(str);
});
return CollectionUtil.join(list, ", ");
}

public void ScanFilePath()
{
String modulePath = String.format("%s/ruoyi-%s/src/main/java/com/ruoyi/%s", workPath, module, StringUtils.isNotEmpty(packageName) ? packageName : module);
String mapperPath = modulePath + "/" + "mapper";
String servicePath = modulePath + "/" + "service";
String serviceImplPath = modulePath + "/" + "service/impl";
String mapperName = entity + "Mapper";
String serviceName = "I" + entity + "Service";
String serviceImplName = entity + "ServiceImpl";
mapper_java = mapperPath + "/" + mapperName + ".java";
service_java = servicePath + "/" + serviceName + ".java";
serviceImpl_java = serviceImplPath + "/" + serviceImplName + ".java";
}

private void PrintSummary()
{
Konsole.cout(Konsole.FC_GREEN, "Configure: ");
Konsole.cout(Konsole.FC_CYAN, "Mybatis query ID: " + queryId);
Konsole.cout(Konsole.FC_CYAN, "Entity class: " + entity);
Konsole.cout(Konsole.FC_CYAN, "Module name: " + module);
Konsole.cout(Konsole.FC_CYAN, "Package name: " + packageName);
Konsole.cout(Konsole.FC_CYAN, "Return type: " + returnType);
Konsole.cout(Konsole.FC_CYAN, "Parameter type: " + parameterType);
Konsole.cout(Konsole.FC_CYAN, "Parameter type string: " + GenParameterStr(1 | 2));
Konsole.cout(Konsole.FC_CYAN, "Mapper file: " + mapper_java);
Konsole.cout(Konsole.FC_CYAN, "Service type: " + service_java);
Konsole.cout(Konsole.FC_CYAN, "Service implement type: " + serviceImpl_java);
Konsole.cout(Konsole.FC_CYAN, "Comment: \n" + GenComment());
Konsole.cout(Konsole.FC_CYAN, "Function define: \n" + GenFuncDef());
Konsole.cout(Konsole.FC_CYAN, "Function declare: \n" + GenFuncDecl());
}

public boolean IsValid()
{
return StrUtil.isNotEmpty(queryId)
&& StrUtil.isNotEmpty(entity)
&& StrUtil.isNotEmpty(module)
&& StrUtil.isNotEmpty(queryId)
// && StrUtil.isNotEmpty(returnType)
// && CollectionUtil.isNotEmpty(parameterType)
;
}

private boolean CheckFile()
{
File file = new File(mapper_java);
if(!file.isFile()) return false;
file = new File(service_java);
if(!file.isFile()) return false;
file = new File(serviceImpl_java);
if(!file.isFile()) return false;
return true;
}

private String GenFuncDef()
{
String str = String.format("\tpublic %s %s(%s);", returnType, queryId, GenParameterStr(1 | 2));
return str;
}

private String GenFuncDecl()
{
String mapperProp = StrUtil.lowerFirst(entity) + "Mapper";

String str = String.format("\t@Override\n\tpublic %s %s(%s)\n\t{\n\t\treturn %s.%s(%s);\n\t}"
, returnType, queryId, GenParameterStr(1 | 2), mapperProp, queryId, GenParameterStr(2));
return str;
}

public String GenMapperCode()
{
StringBuilder sb = new StringBuilder();
String commentStr = GenComment();
if(StrUtil.isNotEmpty(commentStr))
commentStr += "\n";
String funcDef = commentStr + GenFuncDef();
sb.append(funcDef);
return sb.toString();
}

public String GenServiceCode()
{
return GenMapperCode();
}

public String GenServiceImplCode()
{
StringBuilder sb = new StringBuilder();
String commentStr = GenComment();
if(StrUtil.isNotEmpty(commentStr))
commentStr += "\n";
String funcDecl = commentStr + GenFuncDecl();
sb.append(funcDecl);
return sb.toString();
}

private boolean AppendFile(String content, String path)
{
File file = new File(path);
String source = FileUtil.readUtf8String(file);
StringBuilder sb = new StringBuilder(source);
int index = sb.lastIndexOf("}");
if(index == -1)
return false;
sb.insert(index, "\n" + content + "\n");
String newSource = sb.toString();
FileUtil.writeUtf8String(newSource, file);
return true;
}

public String GenComment()
{
if(StrUtil.isEmpty(comment))
return "";
StringBuilder sb = new StringBuilder();
sb.append("\t/**\n")
.append("\t * ").append(comment).append("\n")
.append("\t *\n");
if(null != parameterType)
{
parameterType.forEach((k, v) -> {
sb.append("\t * @param ").append(k).append(" ").append(v).append("\n");
});
}
sb.append("\t * @return 结果 ").append(returnType).append("\n")
.append("\t */");

return sb.toString();
}

public boolean Write()
{
Konsole.cout(Konsole.FC_GREEN, "Start......");
if(!CheckFile())
{
Konsole.cerr(Konsole.BC_YELLOW | Konsole.S_BG_ENABLED, "File not exists!");
return false;
}
Konsole.cout(Konsole.FC_GREEN, String.format("Handle mapper(%s)......", mapper_java));
AppendFile(GenMapperCode(), mapper_java);
Konsole.cout(Konsole.FC_GREEN, String.format("Handle service(%s)......", service_java));
AppendFile(GenServiceCode(), service_java);
Konsole.cout(Konsole.FC_GREEN, String.format("Handle serviceImpl(%s)......", serviceImpl_java));
AppendFile(GenServiceImplCode(), serviceImpl_java);
Konsole.cout(Konsole.FC_GREEN, "Done!");
return true;
}

public void Reset()
{
queryId = "";
entity = "";
module = "";
packageName = "";
comment = "";
parameterType = null;
returnType = "";
mapper_java = "";
service_java = "";
serviceImpl_java = "";
}

private boolean Run()
{
queryId = WaitIn("Please input Mybatis query id: ");
entity = WaitIn("Please input entity class: ");
module = WaitIn("Please input module: ");
packageName = WaitIn("Please input package name(If empty, using `module`): ");
returnType = ReadReturnType("Please input return type: ");
parameterType = ReadParameterType("Please input parameter type: ");
comment = In("Please input comment: ");
ScanFilePath();
PrintSummary();
return Write();
}

public static void main(String[] args)
{
SQLQueryFuncGenGUI frame = new SQLQueryFuncGenGUI();
frame.setVisible(true);

/*SQLQueryFuncGen gen = new SQLQueryFuncGen();
gen.Run();*/
}
}

+ 173
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/SQLQueryFuncGenGUI.java Прегледај датотеку

@@ -0,0 +1,173 @@
package com.ruoyi.common.utils.dev;

import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.utils.dev.gui.InputField;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SQLQueryFuncGenGUI extends JFrame
{
private SQLQueryFuncGen engine;
private InputField queryId;
private InputField entity;
private InputField module;
private InputField packageName;
private InputField comment;
private InputField parameterType;
private InputField returnType;
private JTextPane result;
private JButton writeBtn;
private ActionListener inputListener = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
writeBtn.setEnabled(false);
result.setText("");
}
};

public SQLQueryFuncGenGUI()
{
super();
engine = new SQLQueryFuncGen();
Setup();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Mybatis查询代码生成器");
pack();
}

private void Setup()
{
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu fileMenu = new JMenu("文件");
JMenuItem menuItem = new JMenuItem("清空");
menuItem.addActionListener(x -> Reset());
fileMenu.add(menuItem);
menuItem = new JMenuItem("退出");
menuItem.addActionListener(x -> System.exit(0));
fileMenu.add(menuItem);
JMenu otherMenu = new JMenu("其他");
menuItem = new JMenuItem("关于");
menuItem.addActionListener(x -> JOptionPane.showMessageDialog(this, "通过Mybatis查询ID自动生成mapper/service/serviceImpl源码", "关于", JOptionPane.INFORMATION_MESSAGE));
otherMenu.add(menuItem);
menuBar.add(fileMenu);
menuBar.add(otherMenu);
queryId = new InputField("Mybatis查询ID: ");
entity = new InputField("实体类名(短): ");
module = new InputField("模块: ");
packageName = new InputField("包名: ");
parameterType = new InputField("参数类型: ");
returnType = new InputField("返回类型: ");
comment = new InputField("注释: ");
queryId.AddActionListener(inputListener);
entity.AddActionListener(inputListener);
module.AddActionListener(inputListener);
packageName.AddActionListener(inputListener);
comment.AddActionListener(inputListener);
parameterType.AddActionListener(inputListener);
returnType.AddActionListener(inputListener);
queryId.SetToolTipText("例如. selectTHomeapplyYdjfsqList");
entity.SetToolTipText("例如. THomeapplyYdjfsq");
module.SetToolTipText("例如. house");
packageName.SetToolTipText("例如. home(如果和模块名称相同则可为空)");
comment.SetToolTipText("例如. 查询宅基地申请列表");
parameterType.SetToolTipText("例如. THomeapplyYdjfsq");
returnType.SetToolTipText("例如. List<THomeapplyYdjfsq>");
Box formPanel = Box.createVerticalBox();
formPanel.setAutoscrolls(true);
formPanel.add(queryId);
formPanel.add(entity);
formPanel.add(module);
formPanel.add(packageName);
formPanel.add(parameterType);
formPanel.add(returnType);
formPanel.add(comment);
result = new JTextPane();
JScrollPane scrollPane = new JScrollPane(result);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
result.setFont(Font.getFont(Font.MONOSPACED));
formPanel.add(scrollPane);
BorderLayout mainLayout = new BorderLayout();
JPanel panel = new JPanel();
panel.setLayout(mainLayout);
panel.add(formPanel, BorderLayout.CENTER);
Box toolbar = Box.createHorizontalBox();
toolbar.add(Box.createHorizontalGlue());
writeBtn = new JButton("写入");
writeBtn.addActionListener(e -> Write());
writeBtn.setEnabled(false);
toolbar.add(writeBtn);
JButton startBtn = new JButton("生成");
startBtn.addActionListener(e -> Gen());
toolbar.add(startBtn);
JButton clearBtn = new JButton("清空");
clearBtn.addActionListener(e -> Reset());
toolbar.add(clearBtn);
panel.add(toolbar, BorderLayout.SOUTH);
setContentPane(panel);
}

public String PreviewSourceCode()
{
engine.ScanFilePath();
if(!engine.IsValid())
{
JOptionPane.showMessageDialog(this, "缺失必要的信息!", "错误", JOptionPane.ERROR_MESSAGE);
return "";
}
StringBuilder sb = new StringBuilder();
sb.append(engine.getMapper_java()).append(": \n");
sb.append(engine.GenMapperCode()).append("\n\n");
sb.append(engine.getService_java()).append(": \n");
sb.append(engine.GenServiceCode()).append("\n\n");
sb.append(engine.getServiceImpl_java()).append(": \n");
sb.append(engine.GenServiceImplCode()).append("\n\n");
return sb.toString();
}

private void Reset()
{
engine.Reset();
queryId.Reset();
entity.Reset();
module.Reset();
packageName.Reset();
comment.Reset();
parameterType.Reset();
returnType.Reset();
result.setText("");
writeBtn.setEnabled(false);
}

private void Write()
{
if(engine.Write())
{
JOptionPane.showMessageDialog(this, "写入源码文件成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
}
else
{
JOptionPane.showMessageDialog(this, "写入源码文件失败!", "错误", JOptionPane.ERROR_MESSAGE);
}
}

private void Gen()
{
engine.setQueryId(queryId.Text());
engine.setEntity(entity.Text());
engine.setModule(module.Text());
engine.setPackageName(packageName.Text());
engine.setComment(comment.Text());
engine.SetParameterType(parameterType.Text());
engine.SetReturnType(returnType.Text());
String code = PreviewSourceCode();
result.setText(code);
writeBtn.setEnabled(StrUtil.isNotEmpty(code));
}
}


+ 220
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/gui/FileField.java Прегледај датотеку

@@ -0,0 +1,220 @@
package com.ruoyi.common.utils.dev.gui;

import com.ruoyi.common.utils.StringUtils;

import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.io.File;
import java.util.List;

public class FileField extends Box
{
private String lastPath;
private String path;
private final JTextField textField;
private String filter;
private String name;
private int mode = JFileChooser.FILES_ONLY;
private FileFilter fileFilter = new FileFilter()
{
@Override
public boolean accept(File f)
{
if(f.isFile())
{
if(StringUtils.isNotEmpty(filter))
{
return f.getName().endsWith(filter);
}
}
return true;
}

@Override
public String getDescription()
{
if(StringUtils.isNotEmpty(filter))
{
return "*" + filter;
}
return null;
}
};

public FileField(String name)
{
super(BoxLayout.X_AXIS);
this.name = name;
textField = new JTextField();
lastPath = System.getProperty("user.dir");
Setup();
}

private void Setup()
{
JLabel l = new JLabel(name);
JButton button = new JButton("选择");
Dimension labelMinimumSize = l.getMinimumSize();
Dimension compMinimumSize = textField.getMinimumSize();
Dimension buttonMinimumSize = button.getMinimumSize();
labelMinimumSize.width = 128;
l.setHorizontalAlignment(SwingConstants.RIGHT);
l.setMinimumSize(labelMinimumSize);
l.setPreferredSize(labelMinimumSize);
l.setMaximumSize(labelMinimumSize);
compMinimumSize.width = 256;
textField.setMinimumSize(compMinimumSize);
Dimension compPreferredSize = textField.getPreferredSize();
compPreferredSize.width = 256;
textField.setPreferredSize(compPreferredSize);
buttonMinimumSize.width = 64;
button.setHorizontalAlignment(SwingConstants.CENTER);
button.setMinimumSize(buttonMinimumSize);
button.setPreferredSize(buttonMinimumSize);
button.setMaximumSize(buttonMinimumSize);
this.add(l);
this.add(textField);
this.add(button);
this.setMinimumSize(new Dimension(labelMinimumSize.width + compMinimumSize.width, Math.max(labelMinimumSize.height, compMinimumSize.height)));
this.setMaximumSize(new Dimension(Integer.MAX_VALUE, Math.max(labelMinimumSize.height, compMinimumSize.height)));
button.addActionListener((x) -> OpenFileChooser());

textField.setDragEnabled(true);
new DropTarget(textField, DnDConstants.ACTION_COPY_OR_MOVE, new DropTargetAdapter()
{
@Override
public void drop(DropTargetDropEvent dt)
{
try
{
if(dt.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
{
dt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
List<File> files = (List<File>)dt.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
File first = files.get(0);
switch(mode)
{
case JFileChooser.FILES_ONLY:
if(first.isFile())
{
if(fileFilter.accept(first))
SetPath(first);
return;
}
break;
case JFileChooser.DIRECTORIES_ONLY:
if(!first.isFile())
{
SetPath(first);
return;
}
break;
case JFileChooser.FILES_AND_DIRECTORIES:
if(!first.isFile() || fileFilter.accept(first))
SetPath(first);
return;
}
return;
}
}
catch(Exception e)
{
e.printStackTrace();
}
dt.rejectDrop();
}
});
}

private void OpenFileChooser()
{
JFileChooser jFileChooser = new JFileChooser(lastPath);
jFileChooser.setDialogTitle("选择" + name);
jFileChooser.addActionListener((x) -> {
File currentDirectory = jFileChooser.getCurrentDirectory();
if(null != currentDirectory)
lastPath = currentDirectory.getAbsolutePath();

if(JFileChooser.APPROVE_SELECTION.equals(x.getActionCommand()))
{
File selectedFile = jFileChooser.getSelectedFile();
SetPath(selectedFile);
}
});
jFileChooser.setFileSelectionMode(mode);
jFileChooser.setFileFilter(fileFilter);
jFileChooser.showOpenDialog(this);
}

public void SetLastPath(String path)
{
if(StringUtils.isEmpty(path))
lastPath = System.getProperty("user.dir");
else
{
File file = new File(path);
if(file.exists())
{
if(!file.isDirectory())
file = file.getParentFile();
try
{
lastPath = file.getCanonicalPath();
}
catch(Exception e)
{
e.printStackTrace();
lastPath = file.getAbsolutePath();
}
}
else
lastPath = System.getProperty("user.dir");
}
}

private void SetPath(File selectedFile)
{
if(null != selectedFile)
{
path = selectedFile.getAbsolutePath();
lastPath = selectedFile.getParent();
}
else
{
path = null;
}
textField.setText(null != path ? path : "");
}

public void SetPath(String path)
{
SetPath(StringUtils.isNotEmpty(path) ? new File(path) : null);
}

public void Reset()
{
path = null;
textField.setText("");
}

public String Path()
{
return textField.getText();
}

public void SetFilter(String filter)
{
this.filter = filter;
}

public void SetMode(int mode)
{
this.mode = mode;
}
}

+ 69
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/gui/InputField.java Прегледај датотеку

@@ -0,0 +1,69 @@
package com.ruoyi.common.utils.dev.gui;

import javax.swing.*;
import java.awt.*;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.event.ActionListener;

public class InputField extends Box
{
private final JTextField textField;
private final JLabel label;

public InputField(String text)
{
super(BoxLayout.X_AXIS);
textField = new JTextField();
label = new JLabel(text);
Setup();
}

private void Setup()
{
Dimension labelMinimumSize = label.getMinimumSize();
Dimension compMinimumSize = textField.getMinimumSize();
labelMinimumSize.width = 128;
label.setHorizontalAlignment(SwingConstants.RIGHT);
label.setMinimumSize(labelMinimumSize);
label.setPreferredSize(labelMinimumSize);
label.setMaximumSize(labelMinimumSize);
compMinimumSize.width = 256;
textField.setMinimumSize(compMinimumSize);
Dimension compPreferredSize = textField.getPreferredSize();
compPreferredSize.width = 256;
textField.setPreferredSize(compPreferredSize);
this.add(label);
this.add(textField);
this.setMinimumSize(new Dimension(labelMinimumSize.width + compMinimumSize.width, Math.max(labelMinimumSize.height, compMinimumSize.height)));
this.setMaximumSize(new Dimension(Integer.MAX_VALUE, Math.max(labelMinimumSize.height, compMinimumSize.height)));
}

public void SetToolTipText(String str)
{
label.setToolTipText(str);
textField.setToolTipText(str);
}

public void AddActionListener(ActionListener l)
{
textField.addActionListener(l);
}

public void Reset()
{
textField.setText("");
}

public String Text()
{
return textField.getText();
}

public JTextField TextField()
{
return textField;
}
}

+ 113
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/mybatis/MybatisStdOutputLog.java Прегледај датотеку

@@ -0,0 +1,113 @@
package com.ruoyi.common.utils.dev.mybatis;

import com.ruoyi.common.utils.dev.Konsole;
import org.apache.ibatis.logging.Log;

import static java.lang.System.out;
import static java.lang.System.err;

public class MybatisStdOutputLog implements Log {
private String mapperStatement;
private boolean disable = false;

private final static boolean ENABLE_OUTPUT = true;

static final int SQL_START_STYLE = Konsole.GenStyle(Konsole.FC_BLACK, Konsole.FS_BOLD, Konsole.BC_YELLOW, Konsole.S_BG_ENABLED);
static final int SQL_STATEMENT_STYLE = Konsole.GenStyle(Konsole.FC_BLUE, Konsole.FS_BOLD);
static final int SQL_PARAMETER_STYLE = Konsole.GenStyle(Konsole.FC_CYAN, Konsole.FS_BOLD);
static final int SQL_RESULT_STYLE = Konsole.GenStyle(Konsole.FC_PURPLE, Konsole.FS_BOLD, Konsole.BC_YELLOW, Konsole.S_BG_ENABLED);
static final int SQL_ROWS_STYLE = Konsole.GenStyle(Konsole.FC_GREEN);
static final int SQL_COLUMNS_STYLE = Konsole.GenStyle(Konsole.FC_YELLOW, Konsole.FS_BOLD);
static final int SQL_STYLE = Konsole.GenStyle(Konsole.FC_RED);

// 不输出的查询
private static final String[] UnhandleClass = {
"org.activiti.engine.impl.persistence.entity.JobEntityImpl.selectJobsToExecute",
"org.activiti.engine.impl.persistence.entity.TimerJobEntityImpl.selectTimerJobsToExecute",
"org.activiti.engine.impl.persistence.entity.JobEntityImpl.selectExpiredJobs",
};

public MybatisStdOutputLog(String clazz) {
SetMapperStatement(clazz);
}

private void SetMapperStatement(String clazz)
{
mapperStatement = clazz;
for(String unhandleClass : UnhandleClass)
{
if(unhandleClass.equals(mapperStatement))
disable = true;
}
}

public boolean isDebugEnabled() {
return ENABLE_OUTPUT && !disable;
}

public boolean isTraceEnabled() {
return ENABLE_OUTPUT && !disable;
}

public void error(String s, Throwable e) {
SQLQueue.Exception(mapperStatement, s, e);
}

public void error(String s) {
SQLQueue.Error(mapperStatement, s);
}

public void debug(String s) {
SQLQueue.Debug(mapperStatement, s);
}

public void trace(String s) {
SQLQueue.Trace(mapperStatement, s);
}

public void warn(String s) {
SQLQueue.Warning(mapperStatement, s);
}

static void cout(String str)
{
out.println(str);
}

static void cerr(String str)
{
err.println(str);
}

static void clog(String str)
{
}

static void cout()
{
out.println();
}

static void cerr()
{
err.println();
}

static void clog()
{
}

static void cout(String str, int style)
{
out.println(Konsole.MakeText(str, style));
}

static void cerr(String str, int style)
{
err.println(Konsole.MakeText(str, style));
}

static void clog(String str, int style)
{
}
}

+ 275
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/mybatis/SQLQuery.java Прегледај датотеку

@@ -0,0 +1,275 @@
package com.ruoyi.common.utils.dev.mybatis;

import java.util.ArrayList;
import java.util.List;

import static java.lang.System.out;

public class SQLQuery
{
private static class Error
{
public final String log;
public final Throwable e;

public Error(String log, Throwable e)
{
this.log = log;
this.e = e;
}
}

private String mapper;
private String sql;
private String parms;
private String columns;
private long result;
private final List<String> warnings;
private final List<String> rows;
private final List<Error> errors;
private long counter;
private long takeTime;
private long readRows;
private long startTime;
private long effect;

private static final int OUTPUT_ROWS = 5; // -1: not limit, 0: disable, positive number: max
private static final Object LOCK = new Object();

public SQLQuery()
{
warnings = new ArrayList<>();
rows = new ArrayList<>();
errors = new ArrayList<>();
Clear();
}

public void Clear()
{
sql = "";
parms = "";
columns = "";
result = -1;
readRows = 0;
takeTime = 0;
effect = -1;
startTime = System.currentTimeMillis();
warnings.clear();
rows.clear();
errors.clear();
}

public void Mapper(String mapper)
{
this.mapper = mapper;
}

public void Debug(String mapper, String log)
{
Add(mapper, log);
}

public void Trace(String mapper, String log)
{
Add(mapper, log);
}

public void Warning(String mapper, String log)
{
warnings.add(log);
Mapper(mapper);
}

public void Error(String mapper, String log)
{
AddError(log, null);
Mapper(mapper);
}

public void Exception(String mapper, String log, Throwable e)
{
AddError(log, e);
Mapper(mapper);
}

private void AddError(String log, Throwable e)
{
errors.add(new Error(log, e));
}

private void AddOther(String log)
{
// other.add(log);
}

private void SetResult(String log)
{
String s = log.substring("<== Total: ".length());
int index = s.lastIndexOf("<-- [");
if(index >= 0)
s = s.substring(0, index);
s = s.trim();
try
{
result = Long.parseLong(s);
}
catch(Exception e)
{
e.printStackTrace();
}
if(result <= 0 || result == readRows)
EndQuery();
}

private void SetEffect(String log)
{
String s = log.substring("<== Updates: ".length());
try
{
effect = Long.parseLong(s);
}
catch(Exception e)
{
e.printStackTrace();
}
EndQuery();
}

private void EndQuery()
{
long l = System.currentTimeMillis();
takeTime = l - startTime;

Output();
}

private void AddRow(String log)
{
if(OUTPUT_ROWS < 0 || readRows < OUTPUT_ROWS)
rows.add(log.substring("<== Row: ".length()));
readRows++;
if(readRows == result)
EndQuery();
}

public void Output()
{
if(null == sql || sql.isEmpty())
return;
synchronized(LOCK) {
MybatisStdOutputLog.cout();
String action = "查询";
if(effect >= 0)
action = "更新";

// SQL
MybatisStdOutputLog.cout("[Mybatis " + action + " ] " + Thread.currentThread().getName() + ": " + counter + " -> " + mapper, MybatisStdOutputLog.SQL_START_STYLE);
MybatisStdOutputLog.cout(sql, MybatisStdOutputLog.SQL_STATEMENT_STYLE);
if(null != parms && !parms.isEmpty())
MybatisStdOutputLog.cout(parms, MybatisStdOutputLog.SQL_PARAMETER_STYLE);

SQLStatement sqlStatement = new SQLStatement(sql, parms);
String parsedSql = sqlStatement.Parse();
if(null != parsedSql)
MybatisStdOutputLog.cout(/*"编译SQL: \n" + */parsedSql, MybatisStdOutputLog.SQL_STYLE);

// Select query
if(result >= 0)
{
MybatisStdOutputLog.cout("结果行数: " + result, MybatisStdOutputLog.SQL_RESULT_STYLE);
MybatisStdOutputLog.cout(columns, MybatisStdOutputLog.SQL_COLUMNS_STYLE);
int size = rows.size();
if(OUTPUT_ROWS != 0 && size > 0)
{
for(int i = 0; i < size; i++)
{
MybatisStdOutputLog.cout(String.format("%5d", i) + ": " + rows.get(i), MybatisStdOutputLog.SQL_ROWS_STYLE);
}
long remain = readRows - size;
if(remain > 0)
MybatisStdOutputLog.cout("更多 : " + remain + "条数据......", MybatisStdOutputLog.SQL_ROWS_STYLE);
}
}
// Update
if(effect >= 0)
{
MybatisStdOutputLog.cout("影响行数: " + effect, MybatisStdOutputLog.SQL_RESULT_STYLE);
}

// Warning
if(!warnings.isEmpty())
{
MybatisStdOutputLog.cout("警告: " + warnings.size(), MybatisStdOutputLog.SQL_RESULT_STYLE);
for(int i = 0; i < warnings.size(); i++)
{
MybatisStdOutputLog.cout(String.format("%2d", i) + ": " + warnings.get(i), MybatisStdOutputLog.SQL_ROWS_STYLE);
}
}

// Error / Exception
if(!errors.isEmpty())
{
MybatisStdOutputLog.cout("错误: " + errors.size(), MybatisStdOutputLog.SQL_RESULT_STYLE);
for(int i = 0; i < errors.size(); i++)
{
Error error = errors.get(i);
MybatisStdOutputLog.cout(String.format("%2d", i) + ": " + error.log, MybatisStdOutputLog.SQL_ROWS_STYLE);
error.e.printStackTrace(out);
}
}
//MybatisStdOutputLog.cout("[Mybatis 结束 ] " + Thread.currentThread().getName() + ": " + counter + " -> Time(" + takeTime + " ms) " + mapper + " ---------------------------------------------------------", MybatisStdOutputLog.SQL_START_STYLE);
MybatisStdOutputLog.cout("");
}
Clear();
}

private void Add(String mapper, String log)
{
if(log.startsWith("==>")) {
if(log.startsWith("==> Preparing: "))
{
counter++;
Mapper(mapper);
sql = log.substring("==> Preparing: ".length());
}
else if(log.startsWith("==> Parameters: "))
{
parms = log.substring("==> Parameters: ".length());
int index = parms.lastIndexOf("<-- [");
if(index >= 0)
parms = parms.substring(0, index);
parms = parms.trim();
}
else
{
AddOther(log);
}
}
else if(log.startsWith("<==")) {
if(log.startsWith("<== Columns: "))
{
columns = log.substring("<== Columns: ".length());
}
else if(log.startsWith("<== Total: "))
{
SetResult(log);
}
else if(log.startsWith("<== Row: "))
{
AddRow(log);
}
else if(log.startsWith("<== Updates: "))
{
SetEffect(log);
}
else
{
AddOther(log);
}
}
else
{
AddOther(log);
}
}
}

+ 55
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/mybatis/SQLQueue.java Прегледај датотеку

@@ -0,0 +1,55 @@
package com.ruoyi.common.utils.dev.mybatis;

public class SQLQueue
{
private static final ThreadLocal<SQLQuery> _state = new ThreadLocal<>();

private static SQLQuery SQLQUERY()
{
SQLQuery sqlQuery = _state.get();
if(null == sqlQuery)
{
sqlQuery = new SQLQuery();
_state.set(sqlQuery);
}
return sqlQuery;
}

public static void Error(String mapper, String log)
{
if(log == null || log.isEmpty())
return;
SQLQUERY().Error(mapper, log);
}

public static void Debug(String mapper, String log)
{
if(log == null || log.isEmpty())
return;
SQLQUERY().Debug(mapper, log);
}

public static void Trace(String mapper, String log)
{
if(log == null || log.isEmpty())
return;
SQLQUERY().Trace(mapper, log);
}

public static void Warning(String mapper, String log)
{
if(log == null || log.isEmpty())
return;
SQLQUERY().Warning(mapper, log);
}

public static void Exception(String mapper, String log, Throwable e)
{
if(log == null || log.isEmpty())
return;
if(null != e)
SQLQUERY().Exception(mapper, log, e);
else
SQLQUERY().Error(mapper, log);
}
}

+ 143
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/dev/mybatis/SQLStatement.java Прегледај датотеку

@@ -0,0 +1,143 @@
package com.ruoyi.common.utils.dev.mybatis;

import java.math.BigDecimal;
import java.text.NumberFormat;

public class SQLStatement
{
public final String sql;
public final String arguments;

public SQLStatement(String sql, String arguments)
{
this.sql = sql;
this.arguments = arguments;
}

public String Parse()
{
String str;
if(null == arguments || arguments.isEmpty())
str = sql;
else
{
String[] args = ParseArguments();
str = ReplacePlaceholder(args);
}
return Format(str);
}

private String[] ParseArguments()
{
String[] split = (arguments + ", ").split("\\(\\w+\\), ");
return split;
}

private String ReplacePlaceholder(String[] args)
{
try
{
int lastIndex = 0;
int i = 0;
StringBuilder sb = new StringBuilder();
int length = sql.length();
while(lastIndex < length)
{
int index = sql.indexOf('?', lastIndex);
if(i < args.length && index >= 0)
{
String str = sql.substring(lastIndex, index);
sb.append(str);
sb.append(ToStr(args[i++]));
lastIndex = index + 1;
}
else
{
String str = sql.substring(lastIndex);
sb.append(str);
lastIndex = length;
}
}
return sb.toString();
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}

private String ReplacePlaceholder_rev(String[] args)
{
try
{
int lastIndex = sql.length() - 1;
int i = args.length - 1;
StringBuilder sb = new StringBuilder();
while(lastIndex >= 0)
{
int index = sql.lastIndexOf('?', lastIndex);
if(i >= 0 && index >= 0)
{
String str = sql.substring(index + 1, lastIndex + 1);
sb.insert(0, str);
sb.insert(0, "'" + args[i--] + "'");
lastIndex = index - 1;
}
else
{
String str = sql.substring(0, lastIndex + 1);
sb.insert(0, str);
lastIndex = -1;
}
}
return sb.toString();
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}

private String Format(String sql)
{
if(null == sql)
return null;
sql = sql.trim();
if(!sql.endsWith(";"))
sql = sql + ";";
return sql;
}

private static String ToStr(String arg)
{
if(arg == null)
return "null";
else if(arg.isEmpty())
return "''";
else if(IsNum(arg))
return arg;
else
return "'" + arg + "'";
}

// 10
private static boolean IsNum(String str)
{
if(null == str || str.isEmpty())
return false;
try
{
boolean matches = str.matches("^[\\d.-]*$");
if(!matches)
return false;
Double.parseDouble(str);
return true;
}
catch(Exception e)
{
return false;
}
}
}

+ 62
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/translation/Translate.java Прегледај датотеку

@@ -0,0 +1,62 @@
package com.ruoyi.common.utils.translation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* 额外字典翻译字段注解, 用来代替无法使用Excel注解的情况, 优先级大于Excel注解
* 优先级(5种):
* sql [+ referenceProperty]: 单条SQL语句: 建议加上LIMIT 1, 多条时取第一条, 必须指定占位符?. 例如: @Translate(sql = "SELECT * FROM t_finance_book WHERE id = ? LIMIT 1")
* table + tableKeyColumn + tableValueColumn [+ referenceProperty]: 拼接为 SELECT `tableValueColumn` FROM `table` WHERE `tableKeyColumn` = ? LIMIT 1. 例如: @Translate(table = "t_finance_book", tableValueColumn = "book_name", tableKeyColumn = "id")
*
* dictSql + tableKeyColumn + tableValueColumn: 执行查询SQL后, 取tableKeyColumn(), tableValueColumn()作为字典键值. 例如: @Translate(dictSql = "SELECT * FROM t_finance_book", tableValueColumn = "book_name", tableKeyColumn = "id")
* readConverterExp
* dictType
*
* 前两种方式使用待翻译字段值直查
* 后三种都是加载对应键值字典, 然后用待翻译字段值匹配. 如果都指定了, 会按优先级混合在一起, 优先级高的覆盖优先级低的
*
* 关于referenceProperty
* 如果带翻译字段为Long的其他表ID, 如:
* private Long bookId;
* 如果需要翻译bookId
* 一种方法是将bookId设为String类型
* 还有一种方法是声明String类型的属性辅助翻译bookId, 该新属性不需要原来本身就有bookId的值, 如
* @Translate(table = "t_finance_book", tableKeyColumn = "id", tableValueColumn = "book_name", referenceProperty = "bookId") // 引用bookId属性的值
* // @Translate(sql = "SELECT * FROM t_finance_book WHERE id = ? LIMIT 1", referenceProperty = "bookId") // 也可以写成这样
* private String bookName; // bookName的值不需要读取, 只写入
* private Long typeId;
* @Translate(dictType = "dict_xxx_type", referenceProperty = "typeId") // 引用typeId属性的值
* private String typeName; // typeName的值不需要读取, 只写入
*
* @author zhao
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Translate
{
/**
* 如果是字典类型,请设置字典的type值 (如: sys_user_sex)
*/
public String dictType() default "";

/**
* 读取内容转表达式 (如: 0=男,1=女,2=未知)
*/
public String readConverterExp() default "";

// 查询数据库字典, 字段必须为String, 不能为Long/Integer等数字型
// 方式1: SQL, ?号占位
public String sql() default "";
// 方式2: 表名 + 对应列名 + 名称列
// 拼接为 SELECT tableValueColumn() FROM table() WHERE tableKeyColumn() = ? LIMIT 1
public String table() default ""; // 表名
public String tableKeyColumn() default "id"; // 键的列名
public String tableValueColumn() default "name"; // 值的列名
public String referenceProperty() default ""; // 引用其他类成员属性
// 方式3: SQL + 对应列名 + 名称列: 无占位符, 从数据库加载键值对
// 执行查询SQL后, 取tableKeyColumn(), tableValueColumn()作为字典键值
public String dictSql() default "";
}

+ 66
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/translation/TranslateUtils.java Прегледај датотеку

@@ -0,0 +1,66 @@
package com.ruoyi.common.utils.translation;

import com.ruoyi.common.core.domain.BaseEntity;

import java.util.List;
import java.util.Map;

/**
* zhao: 字段自动字典翻译
* 需要翻译的字段必须使用Translate注解或Excel注解标记
* 优先级:
* 注解: Translate优先级大于Excel. 只会使用Translate或Excel其中的一种, 不会混合
* 注解属性: readConverterExp优先级大于dictType. readConverterExp和dictType的键值对最终会混合在一起
* 字段类型:
* 如果是String类型, 必须赋值注解的dictType或readConverterExp
* 如果是其他复合类型/List, 无需赋值dictType或readConverterExp, 仅标记注解即可, 此时将递归翻译(注意不要循环嵌套对象)
*
* 数据库表数据字典: 仅Translate注解支持
* 字段必须为String类型
*/
public final class TranslateUtils
{
private TranslateUtils() {}

public static void translateList(List<?> list, Object...args)
{
new Translator().translateList(list, args);
}

public static void translate(Object obj, Object...args)
{
new Translator().translate(obj, args);
}

public static void translateMapList(List<Map<String, Object>> list, Map<String, String> dictMap)
{
new Translator().translateMapList(list, dictMap);
}

public static void translateMap(Map<String, Object> map, Map<String, String> dictMap)
{
new Translator().translateMap(map, dictMap);
}

public static <T> void translateObjectList(List<T> list)
{
new Translator().translateObjectList(list);
}

public static <T> void translateObject(T object)
{
new Translator().translateObject(object);
}

public static <T extends BaseEntity> void translateEntityList(List<T> list, boolean...keepRawField)
{
boolean b = null != keepRawField && keepRawField.length > 0 ? keepRawField[0] : false;
new Translator().translateEntityList(list, b);
}

public static <T extends BaseEntity> void translateEntity(T object, boolean...keepRawField)
{
boolean b = null != keepRawField && keepRawField.length > 0 ? keepRawField[0] : false;
new Translator().translateEntity(object, b);
}
}

+ 578
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/translation/Translator.java Прегледај датотеку

@@ -0,0 +1,578 @@
package com.ruoyi.common.utils.translation;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.reflect.ReflectUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import org.springframework.jdbc.core.JdbcTemplate;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public final class Translator
{
private static final String KEY_SQL_KEY = "$__SQL__";

private final List<Object> handledObjects = new ArrayList<>();

public Translator() {}

public void translateList(List<?> list, Object...args)
{
if(CollectionUtil.isEmpty(list))
return;
if(startTranslate(list))
list.forEach((x) -> translate(x, args));
}

@SuppressWarnings("unchecked")
public void translate(Object obj, Object...args)
{
if(null == obj)
return;
if(obj instanceof BaseEntity)
{
Object o = DEF_PARM(args);
boolean b = o instanceof Boolean ? (Boolean)o : false;
translateEntity((BaseEntity)obj, b);
}
else if(obj instanceof Map)
{
Object o = DEF_PARM(args);
Map<String, String> dictMap = o instanceof Map ? (Map<String, String>)args[0] : null;
translateMap((Map<String, Object>)obj, dictMap);
}
else if(obj instanceof List)
{
translateList((List<?>)obj, args);
}
else
{
translateObject(obj);
}
}

public <T extends BaseEntity> void translateEntityList(List<T> list, boolean keepRawField)
{
if(CollectionUtil.isEmpty(list))
return;
list.forEach((x) -> translateEntity(x, keepRawField));
}

public <T extends BaseEntity> void translateEntity(T object, boolean keepRawField)
{
if(null == object)
return;
translateEntity_r(object, object.getClass(), keepRawField);
}

public void translateMapList(List<Map<String, Object>> list, Map<String, String> dictMap)
{
if(CollectionUtil.isEmpty(list))
return;
list.forEach((x) -> translateMap(x, dictMap));
}

public void translateMap(Map<String, Object> map, Map<String, String> dictMap)
{
if(CollectionUtil.isEmpty(map) || CollectionUtil.isEmpty(dictMap))
return;
if(!startTranslate(map))
return;
dictMap.forEach((k, v) -> {
if(!map.containsKey(k))
return;
Object o = map.get(k);
if(null == o)
return;
Class<?> clazz = o.getClass();
if(clazz.equals(String.class))
{
String str = (String)o;
if(StringUtils.isEmpty(str))
return;
map.put(k, getDictLabelElseOriginValue(v, str));
}
else if(canRecursionClassObjectField(clazz))
translate(o, dictMap);
});
}

// 判断是否翻译对象属性
private boolean canRecursionClassObjectField(Class<?> clazz)
{
/* if(Object.class.equals(clazz)) // is Object class
return false;
if(!Object.class.isAssignableFrom(clazz)) // is internal class, e.g. int long boolean
return false;
if(clazz.getPackage().getName().startsWith("java.lang")) // class in java.lang.**, e.g. Long Integer
return false;
return true;*/
return BaseEntity.class.isAssignableFrom(clazz) // BaseEntity
|| List.class.isAssignableFrom(clazz) // List
|| Map.class.isAssignableFrom(clazz) // Map
;
}

public <T> void translateObjectList(List<T> list)
{
if(CollectionUtil.isEmpty(list))
return;
list.forEach(this::translateObject);
}

public <T> void translateObject(T object)
{
if(null == object)
return;
translateObject_r(object, object.getClass());
}

private <T> void translateObject_r(T object, Class<?> clazz)
{
if(!startTranslate(object))
return;
Field[] declaredFields = clazz.getDeclaredFields();
for(Field field : declaredFields)
{
boolean trans = hasTranslateFlag(field); // check translate flag
if(!trans)
continue;
translateField(field, object);
}
Class<?> superclass = getSuperClass(clazz);
if(null != superclass)
translateObject_r(object, superclass);
}

private <T extends BaseEntity> void translateEntity_r(T object, Class<?> clazz, boolean keepRawField)
{
if(!startTranslate(object))
return;

Field[] declaredFields = clazz.getDeclaredFields();
for(Field field : declaredFields)
{
boolean trans = hasTranslateFlag(field); // check translate flag
if(!trans)
continue;
translateField(field, object, keepRawField);
}
Class<?> superclass = getSuperClass(clazz);
if(null != superclass)
translateEntity_r(object, superclass, keepRawField);
}

// 解析readConverterExp
private Map<String, String> parseReadConverterExp(String str)
{
Map<String, String> dict = new LinkedHashMap<>();
if(StringUtils.isNotEmpty(str))
{
List<String> split = StrUtil.split(str, ',', true, true);
split.forEach((x) -> {
List<String> arr = StrUtil.split(x, '=', 2, true, true);
if(CollectionUtil.isEmpty(arr))
return;
dict.put(arr.get(0), arr.size() > 1 ? arr.get(1) : null);
});
}
return dict;
}

// 读取数据库数据作为字典
private Map<String, String> loadDBDict(String sql, String keyColumn, String nameColumn)
{
Map<String, String> dict = new LinkedHashMap<>();
if(StringUtils.isNotEmpty(sql) && StringUtils.isNotEmpty(keyColumn) && StringUtils.isNotEmpty(nameColumn))
{
JdbcTemplate jdbcTemplate = SpringUtils.getBean(JdbcTemplate.class);
try
{
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
if(CollectionUtil.isNotEmpty(list))
{
for(Map<String, Object> map : list)
{
String key = toString_s(map.get(keyColumn));
if(StringUtils.isEmpty(key))
continue;
dict.put(key, toString_s(map.get(nameColumn)));
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
return dict;
}

// 生成查询SQL
private String genRelationSQL(String table, String keyColumn, String nameColumn)
{
if(StringUtils.isNotEmpty(table) && StringUtils.isNotEmpty(keyColumn) && StringUtils.isNotEmpty(nameColumn))
{
return String.format("SELECT `%s` FROM `%s` WHERE `%s` = ? LIMIT 1", nameColumn, table, keyColumn);
}
return null;
}

// 直接取SQL值
private String readDBValue(String sql, String id)
{
if(StringUtils.isNotEmpty(sql) && StringUtils.isNotEmpty(id))
{
JdbcTemplate jdbcTemplate = SpringUtils.getBean(JdbcTemplate.class);
try
{
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, id);
if(CollectionUtil.isNotEmpty(list))
{
Map<String, Object> map = list.get(0);
return toString_s(map.get(map.keySet().iterator().next()));
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
return null;
}

// 检查是否需要翻译
private boolean hasTranslateFlag(Field field)
{
// 静态/不可重赋值 不翻译
int modifiers = field.getModifiers();
if(Modifier.isStatic(modifiers) || Modifier.isFinal(modifiers))
return false;

return null != field.getAnnotation(Translate.class) || null != field.getAnnotation(Excel.class);
}

// 获取翻译来源
// 返回: dictType对应的字典键值对和readConverterExp解析后的键值对的组合
// 优先级: Translate > Excel | readConverterExp > dictType
private Map<String, String> getTranslateDict(Field field)
{
Map<String, String> dict = new LinkedHashMap<>();
String str;

Translate translate = field.getAnnotation(Translate.class); // First check Translate annotation
if(null != translate)
{
// 1. SQL 直查
str = translate.sql();
if(StringUtils.isNotEmpty(str))
{
dict.put(KEY_SQL_KEY, str);
}
// 2. table + tableKeyColumn + tableValueColumn 直查
str = translate.table();
if(StringUtils.isNotEmpty(str))
{
str = genRelationSQL(str, translate.tableKeyColumn(), translate.tableValueColumn());
dict.put(KEY_SQL_KEY, str);
}

// 3. dict缓存
str = translate.dictType();
if(StringUtils.isNotEmpty(str))
{
dict.putAll(dictCacheValueLabelMap(str));
}
// 4. readConverterExp配置
str = translate.readConverterExp();
if(StringUtils.isNotEmpty(str))
{
dict.putAll(parseReadConverterExp(str));
}
// 5. 数据库任意表数据
str = translate.dictSql();
if(StringUtils.isNotEmpty(str))
{
dict.putAll(loadDBDict(str, translate.tableKeyColumn(), translate.tableValueColumn()));
}
}
if(StringUtils.isNotEmpty(dict))
return dict;

Excel excel = field.getAnnotation(Excel.class); // And then check Excel annotation
if(null != excel)
{
str = excel.dictType();
if(StringUtils.isNotEmpty(str))
{
dict.putAll(dictCacheValueLabelMap(str));
}
str = excel.readConverterExp();
if(StringUtils.isNotEmpty(str))
{
dict.putAll(parseReadConverterExp(str));
}
}
return dict;
}

private boolean translateField(Field field, Object object)
{
if(field.getType().equals(String.class))
return translateField_String(field, object);
else
return translateField_Object(field, object);
}

private boolean translateField_Object(Field field, Object object)
{
if(field.getType().equals(String.class))
return false;

if(!canRecursionClassObjectField(field.getType()))
return false;

Object val = null;
if(!field.isAccessible())
field.setAccessible(true);
try
{
val = field.get(object);
}
catch(IllegalAccessException e)
{
e.printStackTrace();
}
if(null != val)
{
translate(val);
return true;
}
return false;
}

private boolean translateField_String(Field field, Object object)
{
boolean trans = false;

if(!field.getType().equals(String.class))
return false;

Map<String, String> dict = getTranslateDict(field);
if(CollectionUtil.isEmpty(dict))
return false;

if(!field.isAccessible())
field.setAccessible(true);
try
{
Object val = getField(object, field);
if(null != val)
{
String str = (String)val;
if(StringUtils.isNotEmpty(str))
{
if(dict.containsKey(KEY_SQL_KEY))
{
String dbVal = readDBValue(dict.get(KEY_SQL_KEY), str);
if(StringUtils.isNotEmpty(dbVal))
{
field.set(object, dbVal);
trans = true;
}
}
if(!trans && dict.containsKey(str))
{
field.set(object, dict.get(str));
trans = true;
}
}
}
}
catch(IllegalAccessException e)
{
e.printStackTrace();
return false;
}
return trans;
}

private <T extends BaseEntity> boolean translateField(Field field, T entity, boolean keepRawField)
{
if(field.getType().equals(String.class))
return translateField_String(field, entity, keepRawField);
else
return translateField_Object(field, entity, keepRawField);
}

private <T extends BaseEntity> boolean translateField_Object(Field field, T entity, boolean keepRawField)
{
if(field.getType().equals(String.class))
return false;

if(!canRecursionClassObjectField(field.getType()))
return false;

Object val = null;
try
{
val = getField(entity, field);
}
catch(IllegalAccessException e)
{
e.printStackTrace();
}
if(null != val)
{
translate(val, keepRawField);
return true;
}
return false;
}

private <T extends BaseEntity> boolean translateField_String(Field field, T entity, boolean keepRawField)
{
boolean trans = false;

if(!field.getType().equals(String.class))
return false;

Map<String, String> dict = getTranslateDict(field);
if(CollectionUtil.isEmpty(dict))
return false;

try
{
Object val = getField(entity, field);
if(keepRawField)
entity.getParams().put(field.getName(), val); // backup raw value to params
if(null != val)
{
String str = (String)val;
if(StringUtils.isNotEmpty(str))
{
if(dict.containsKey(KEY_SQL_KEY))
{
String dbVal = readDBValue(dict.get(KEY_SQL_KEY), str);
if(StringUtils.isNotEmpty(dbVal))
{
field.set(entity, dbVal);
trans = true;
}
}
if(!trans && dict.containsKey(str))
{
field.set(entity, dict.get(str));
trans = true;
}
}
}
}
catch(IllegalAccessException e)
{
e.printStackTrace();
return false;
}
return trans;
}

private Object getField(Object obj, Field field) throws IllegalAccessException
{
if(!field.isAccessible())
field.setAccessible(true);
Translate annotation = field.getAnnotation(Translate.class);
if(null != annotation)
{
String refProp = annotation.referenceProperty();
if(StringUtils.isNotEmpty(refProp))
{
Field refField = ReflectUtils.getAccessibleField(obj, refProp);
if(null != refField)
return toString_s(refField.get(obj)); // 转换为String
}
}
return field.get(obj);
}

private Class<?> getSuperClass(Class<?> clazz)
{
if(null == clazz)
return null;
Class<?> superclass = clazz.getSuperclass(); // translate parent class
if(null != superclass && !superclass.equals(Object.class)) // check is top or is Object
return superclass;
return null;
}

// 允许翻译则返回true
private boolean startTranslate(Object o)
{
if(null == o)
return false;
if(o instanceof String) // String类型总是重新翻译
return true;
if(contains_ptr(handledObjects, o)) // 其他类型防止循环递归
{
return false;
}
handledObjects.add(o);
return true;
}

public void Reset()
{
handledObjects.clear();
}


public static <T> boolean contains_ptr(Collection<T> list, T target)
{
if(CollectionUtil.isEmpty(list))
return false;
return list.stream().anyMatch((x) -> x == target);
}

public static String toString_s(Object obj)
{
if(null == obj)
return "";
if(obj instanceof String)
return (String)obj;
else
return obj.toString();
}

public static <T> T DEF_PARM(T...args)
{
return null != args && args.length > 0 ? args[0] : null;
}


public static Map<String, String> dictCacheValueLabelMap(String key)
{
List<SysDictData> dictCache = DictUtils.getDictCache(key);
if(CollectionUtil.isEmpty(dictCache))
return new LinkedHashMap<>(); // safety
return dictCache.stream().collect(Collectors.toMap(SysDictData::getDictValue, SysDictData::getDictLabel, (a, b) -> a, LinkedHashMap::new));
}

public static String getDictLabelElseOriginValue(String dictType, String dictValue)
{
if(StringUtils.isEmpty(dictValue))
return dictValue;
String res = DictUtils.getDictLabel(dictType, dictValue);
return StringUtils.isEmpty(res) ? dictValue : res;
}
}

+ 14
- 5
ruoyi-generator/src/main/resources/vm/java/controller.java.vm Прегледај датотеку

@@ -16,6 +16,8 @@ import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import ${packageName}.domain.${ClassName}; import ${packageName}.domain.${ClassName};
import ${packageName}.service.I${ClassName}Service; import ${packageName}.service.I${ClassName}Service;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -30,6 +32,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
* @author ${author} * @author ${author}
* @date ${datetime} * @date ${datetime}
*/ */
@Api(tags = "${functionName}")
@RestController @RestController
@RequestMapping("/${moduleName}/${businessName}") @RequestMapping("/${moduleName}/${businessName}")
public class ${ClassName}Controller extends BaseController public class ${ClassName}Controller extends BaseController
@@ -40,6 +43,7 @@ public class ${ClassName}Controller extends BaseController
/** /**
* 查询${functionName}列表 * 查询${functionName}列表
*/ */
@ApiOperation("查询${functionName}列表")
@PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')")
@GetMapping("/list") @GetMapping("/list")
#if($table.crud || $table.sub) #if($table.crud || $table.sub)
@@ -60,6 +64,7 @@ public class ${ClassName}Controller extends BaseController
/** /**
* 导出${functionName}列表 * 导出${functionName}列表
*/ */
@ApiOperation("导出${functionName}列表")
@PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')") @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')")
@Log(title = "${functionName}", businessType = BusinessType.EXPORT) @Log(title = "${functionName}", businessType = BusinessType.EXPORT)
@PostMapping("/export") @PostMapping("/export")
@@ -73,6 +78,7 @@ public class ${ClassName}Controller extends BaseController
/** /**
* 获取${functionName}详细信息 * 获取${functionName}详细信息
*/ */
@ApiOperation("获取${functionName}详细信息")
@PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')") @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')")
@GetMapping(value = "/get/{${pkColumn.javaField}}") @GetMapping(value = "/get/{${pkColumn.javaField}}")
public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField})
@@ -83,9 +89,10 @@ public class ${ClassName}Controller extends BaseController
/** /**
* 新增${functionName} * 新增${functionName}
*/ */
@ApiOperation("新增${functionName}")
@PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')") @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')")
@Log(title = "${functionName}", businessType = BusinessType.INSERT) @Log(title = "${functionName}", businessType = BusinessType.INSERT)
@PostMapping(value = "/add")
@PostMapping("/add")
public AjaxResult add(@RequestBody ${ClassName} ${className}) public AjaxResult add(@RequestBody ${ClassName} ${className})
{ {
${className}.setCreateBy(getUsername()); ${className}.setCreateBy(getUsername());
@@ -95,9 +102,10 @@ public class ${ClassName}Controller extends BaseController
/** /**
* 修改${functionName} * 修改${functionName}
*/ */
@ApiOperation("修改${functionName}")
@PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')") @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')")
@Log(title = "${functionName}", businessType = BusinessType.UPDATE) @Log(title = "${functionName}", businessType = BusinessType.UPDATE)
@PutMapping(value = "/edit")
@PostMapping("/edit")
public AjaxResult edit(@RequestBody ${ClassName} ${className}) public AjaxResult edit(@RequestBody ${ClassName} ${className})
{ {
${className}.setUpdateBy(getUsername()); ${className}.setUpdateBy(getUsername());
@@ -107,11 +115,12 @@ public class ${ClassName}Controller extends BaseController
/** /**
* 删除${functionName} * 删除${functionName}
*/ */
@ApiOperation("删除${functionName}")
@PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')") @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')")
@Log(title = "${functionName}", businessType = BusinessType.DELETE) @Log(title = "${functionName}", businessType = BusinessType.DELETE)
@DeleteMapping(value = "/remove/{${pkColumn.javaField}}")
public AjaxResult remove(@PathVariable ${pkColumn.javaType} ${pkColumn.javaField})
@PostMapping("/remove/{${pkColumn.javaField}s}")
public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s)
{ {
return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}));
return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s));
} }
} }

+ 34
- 4
ruoyi-generator/src/main/resources/vm/java/domain.java.vm Прегледај датотеку

@@ -3,8 +3,6 @@ package ${packageName}.domain;
#foreach ($import in $importList) #foreach ($import in $importList)
import ${import}; import ${import};
#end #end
import lombok.Data;
import lombok.experimental.Accessors;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle; import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.annotation.Excel;
@@ -25,8 +23,6 @@ import com.ruoyi.common.core.domain.TreeEntity;
#elseif($table.tree) #elseif($table.tree)
#set($Entity="TreeEntity") #set($Entity="TreeEntity")
#end #end
@Data
@Accessors(chain = true)
public class ${ClassName} extends ${Entity} public class ${ClassName} extends ${Entity}
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -59,6 +55,24 @@ public class ${ClassName} extends ${Entity}
private List<${subClassName}> ${subclassName}List; private List<${subClassName}> ${subclassName}List;


#end #end
#foreach ($column in $columns)
#if(!$table.isSuperColumn($column.javaField))
#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
#set($AttrName=$column.javaField)
#else
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#end
public void set${AttrName}($column.javaType $column.javaField)
{
this.$column.javaField = $column.javaField;
}

public $column.javaType get${AttrName}()
{
return $column.javaField;
}
#end
#end


#if($table.sub) #if($table.sub)
public List<${subClassName}> get${subClassName}List() public List<${subClassName}> get${subClassName}List()
@@ -72,4 +86,20 @@ public class ${ClassName} extends ${Entity}
} }


#end #end
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
#foreach ($column in $columns)
#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
#set($AttrName=$column.javaField)
#else
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#end
.append("${column.javaField}", get${AttrName}())
#end
#if($table.sub)
.append("${subclassName}List", get${subClassName}List())
#end
.toString();
}
} }

+ 8
- 9
ruoyi-generator/src/main/resources/vm/java/mapper.java.vm Прегледај датотеку

@@ -46,14 +46,6 @@ public interface ${ClassName}Mapper
*/ */
public int insert${ClassName}Batch(List<${ClassName}> list); public int insert${ClassName}Batch(List<${ClassName}> list);


/**
* 批量修改 ${functionName}
*
* @param list ${functionName}
* @return 结果
*/
public int update${ClassName}Batch(List<${ClassName}> list);

/** /**
* 修改${functionName} * 修改${functionName}
* *
@@ -62,6 +54,14 @@ public interface ${ClassName}Mapper
*/ */
public int update${ClassName}(${ClassName} ${className}); public int update${ClassName}(${ClassName} ${className});


/**
* 批量修改 ${functionName}
*
* @param list ${functionName}
* @return 结果
*/
public int update${ClassName}Batch(List<${ClassName}> list);

/** /**
* 删除${functionName} * 删除${functionName}
* *
@@ -105,7 +105,6 @@ public interface ${ClassName}Mapper
public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField});
#end #end


// Harm
/** /**
* 条件单条查询${functionName} * 条件单条查询${functionName}
* *


+ 1
- 2
ruoyi-generator/src/main/resources/vm/java/service.java.vm Прегледај датотеку

@@ -74,8 +74,7 @@ public interface I${ClassName}Service
* @return 结果 * @return 结果
*/ */
public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
// Harm

/** /**
* 条件单条查询${functionName} * 条件单条查询${functionName}
* *


+ 4
- 5
ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm Прегледај датотеку

@@ -9,8 +9,6 @@ import com.ruoyi.common.utils.DateUtils;
#end #end
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.apache.commons.collections4.ListUtils;
#if($table.sub) #if($table.sub)
import java.util.ArrayList; import java.util.ArrayList;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
@@ -19,6 +17,8 @@ import ${packageName}.domain.${subClassName};
import ${packageName}.mapper.${ClassName}Mapper; import ${packageName}.mapper.${ClassName}Mapper;
import ${packageName}.domain.${ClassName}; import ${packageName}.domain.${ClassName};
import ${packageName}.service.I${ClassName}Service; import ${packageName}.service.I${ClassName}Service;
import org.springframework.transaction.annotation.Transactional;
import org.apache.commons.collections4.ListUtils;


/** /**
* ${functionName}Service业务层处理 * ${functionName}Service业务层处理
@@ -93,7 +93,7 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
public int insert${ClassName}Batch(List<${ClassName}> list){ public int insert${ClassName}Batch(List<${ClassName}> list){
List<List<${ClassName}>> splists = ListUtils.partition(list, 50); List<List<${ClassName}>> splists = ListUtils.partition(list, 50);
splists.forEach(splist->{ splists.forEach(splist->{
${className}Mapper.insert${ClassName}Batch(splist);
${className}Mapper.insert${ClassName}Batch(splist);
}); });
return 1; return 1;
} }
@@ -133,7 +133,7 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
public int update${ClassName}Batch(List<${ClassName}> list) { public int update${ClassName}Batch(List<${ClassName}> list) {
List<List<${ClassName}>> splists = ListUtils.partition(list, 50); List<List<${ClassName}>> splists = ListUtils.partition(list, 50);
splists.forEach(splist->{ splists.forEach(splist->{
${className}Mapper.update${ClassName}Batch(splist);
${className}Mapper.update${ClassName}Batch(splist);
}); });
return 1; return 1;
} }
@@ -200,7 +200,6 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
} }
#end #end


// Harm
/** /**
* 单条条件查询${functionName} * 单条条件查询${functionName}
* *


+ 6
- 14
ruoyi-generator/src/main/resources/vm/js/api.js.vm Прегледај датотеку

@@ -1,13 +1,5 @@
import request from '@/utils/request' import request from '@/utils/request'


/* ${functionName} JSON
{
#foreach ($column in $columns)
"${column.javaField}": "${column.columnComment}"#if($velocityCount != $columns.size()),#end // ${column.javaType}
#end
}
*/

// 查询${functionName}列表 // 查询${functionName}列表
export function list${BusinessName}(query) { export function list${BusinessName}(query) {
return request({ return request({
@@ -20,7 +12,7 @@ export function list${BusinessName}(query) {
// 查询${functionName}详细 // 查询${functionName}详细
export function get${BusinessName}(${pkColumn.javaField}) { export function get${BusinessName}(${pkColumn.javaField}) {
return request({ return request({
url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
url: '/${moduleName}/${businessName}/get/' + ${pkColumn.javaField},
method: 'get' method: 'get'
}) })
} }
@@ -28,7 +20,7 @@ export function get${BusinessName}(${pkColumn.javaField}) {
// 新增${functionName} // 新增${functionName}
export function add${BusinessName}(data) { export function add${BusinessName}(data) {
return request({ return request({
url: '/${moduleName}/${businessName}',
url: '/${moduleName}/${businessName}/add',
method: 'post', method: 'post',
data: data data: data
}) })
@@ -37,8 +29,8 @@ export function add${BusinessName}(data) {
// 修改${functionName} // 修改${functionName}
export function update${BusinessName}(data) { export function update${BusinessName}(data) {
return request({ return request({
url: '/${moduleName}/${businessName}',
method: 'put',
url: '/${moduleName}/${businessName}/edit',
method: 'post',
data: data data: data
}) })
} }
@@ -46,7 +38,7 @@ export function update${BusinessName}(data) {
// 删除${functionName} // 删除${functionName}
export function del${BusinessName}(${pkColumn.javaField}) { export function del${BusinessName}(${pkColumn.javaField}) {
return request({ return request({
url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
method: 'delete'
url: '/${moduleName}/${businessName}/remove/' + ${pkColumn.javaField},
method: 'post'
}) })
} }

+ 1
- 1
ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm Прегледај датотеку

@@ -453,7 +453,7 @@ export default {
this.reset(); this.reset();
this.getTreeselect(); this.getTreeselect();
if (row != null) { if (row != null) {
this.form.${treeParentCode} = row.${treeCode};
this.form.${treeParentCode} = row.${treeParentCode};
} }
get${BusinessName}(row.${pkColumn.javaField}).then(response => { get${BusinessName}(row.${pkColumn.javaField}).then(response => {
this.form = response.data; this.form = response.data;


+ 247
- 124
ruoyi-generator/src/main/resources/vm/vue/index.vue.vm Прегледај датотеку

@@ -1,3 +1,39 @@
#macro(GET_CHAR_COLUMN_LENGTH $column)## * 如果表列是char/varchar, 获取其最大字符长度, 否则为空字符串 * 参数: 列 * 结果保存在变量名为 $_char_column_length 字符串型
#set($_char_column_length="")
#if($column.columnType.startsWith("char") || $column.columnType.startsWith("varchar"))
#set($startLeft=$column.columnType.indexOf("("))
#if($startLeft != -1)
#set($endRight=$column.columnType.indexOf(")", $startLeft))
#if($endRight != -1)
#set($startLeft=$startLeft+1)
#set($_char_column_length=$column.columnType.substring($startLeft, $endRight))
#end
#end
#end
#end## GET_CHAR_COLUMN_LENGTH
#macro(COLUMN_IS_NUMBER $column)## * 检查表列是否是数字型 * 参数: 列 * 结果保存在变量名为 $_column_is_number bool型
#set($_column_is_number=$column.columnType.startsWith("decimal") || $column.columnType.startsWith("tinyint") || $column.columnType.startsWith("mediumint") || $column.columnType.startsWith("int") || $column.columnType.startsWith("bigint") || $column.columnType.startsWith("smallint"))
#end## COLUMN_IS_NUMBER
#macro(GET_NUMBER_COLUMN_MIN_AND_PRECISION $column)## * 如果表列是数字型, 获取其最小值和浮点数部分精度, 否则为空字符串 * 参数: 列 * 最小值结果保存在变量名为 $_number_column_min 字符串型 * 浮点数部分精度结果保存在变量名为 $_number_column_precision 字符串型
#set($_number_column_min="")
#set($_number_column_precision="")
#if($column.columnType.contains("unsigned"))
#set($_number_column_min="0")
#end
#set($startLeft=$column.columnType.indexOf("("))
#if($startLeft != -1)
#set($endRight=$column.columnType.indexOf(")", $startLeft))
#if($endRight != -1)
#set($startLeft=$startLeft+1)
#set($internalText=$column.columnType.substring($startLeft, $endRight))
#set($splitIndex=$internalText.indexOf(","))
#if($splitIndex != -1)
#set($splitIndex=$splitIndex+1)
#set($_number_column_precision=$internalText.substring($splitIndex))
#end
#end
#end
#end## GET_NUMBER_COLUMN_MIN_AND_PRECISION
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
@@ -13,22 +49,12 @@
#end #end
#if($column.htmlType == "input") #if($column.htmlType == "input")
<el-form-item label="${comment}" prop="${column.javaField}"> <el-form-item label="${comment}" prop="${column.javaField}">
<el-input
v-model="queryParams.${column.javaField}"
placeholder="请输入${comment}"
clearable
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.${column.javaField}" placeholder="请输入${comment}" clearable @keyup.enter.native="handleQuery"/>
</el-form-item> </el-form-item>
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType) #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
<el-form-item label="${comment}" prop="${column.javaField}"> <el-form-item label="${comment}" prop="${column.javaField}">
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable> <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
<el-option
v-for="dict in dict.type.${dictType}"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
<el-option v-for="dict in dict.type.${dictType}" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select> </el-select>
</el-form-item> </el-form-item>
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType) #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
@@ -39,24 +65,11 @@
</el-form-item> </el-form-item>
#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN") #elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
<el-form-item label="${comment}" prop="${column.javaField}"> <el-form-item label="${comment}" prop="${column.javaField}">
<el-date-picker clearable
v-model="queryParams.${column.javaField}"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择${comment}">
</el-date-picker>
<el-date-picker clearable v-model="queryParams.${column.javaField}" type="date" value-format="yyyy-MM-dd" placeholder="请选择${comment}"/>
</el-form-item> </el-form-item>
#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN") #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
<el-form-item label="${comment}"> <el-form-item label="${comment}">
<el-date-picker
v-model="daterange${AttrName}"
style="width: 240px"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
<el-date-picker v-model="daterange${AttrName}" style="width: 240px" value-format="yyyy-MM-dd" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"/>
</el-form-item> </el-form-item>
#end #end
#end #end
@@ -69,52 +82,25 @@


<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['${moduleName}:${businessName}:add']"
>新增</el-button>
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['${moduleName}:${businessName}:add']">新增</el-button>
</el-col> </el-col>
<!--
<el-col :span="1.5"> <el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['${moduleName}:${businessName}:edit']"
>修改</el-button>
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate" v-hasPermi="['${moduleName}:${businessName}:edit']">修改</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['${moduleName}:${businessName}:remove']"
>删除</el-button>
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete" v-hasPermi="['${moduleName}:${businessName}:remove']">删除</el-button>
</el-col> </el-col>
-->
<el-col :span="1.5"> <el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['${moduleName}:${businessName}:export']"
>导出</el-button>
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['${moduleName}:${businessName}:export']" :loading="exportLoading">导出</el-button>
</el-col> </el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>


<el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!--<el-table-column type="selection" width="55" align="center" />-->
<el-table-column type="index" label="序号" width="50" align="center" />
#foreach($column in $columns) #foreach($column in $columns)
#set($javaField=$column.javaField) #set($javaField=$column.javaField)
#set($parentheseIndex=$column.columnComment.indexOf("(")) #set($parentheseIndex=$column.columnComment.indexOf("("))
@@ -124,13 +110,18 @@
#set($comment=$column.columnComment) #set($comment=$column.columnComment)
#end #end
#if($column.pk) #if($column.pk)
<el-table-column label="${comment}" align="center" prop="${javaField}" />
<!--<el-table-column label="${comment}" align="center" prop="${javaField}" min-width="60" />-->
#elseif($column.list && $column.htmlType == "datetime") #elseif($column.list && $column.htmlType == "datetime")
#GET_CHAR_COLUMN_LENGTH($column)
#if($_char_column_length == "4" || $_char_column_length == "6" || $_char_column_length == "7")
<el-table-column label="${comment}" align="center" prop="${javaField}" />
#else
<el-table-column label="${comment}" align="center" prop="${javaField}" width="180"> <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
#end
#elseif($column.list && $column.htmlType == "imageUpload") #elseif($column.list && $column.htmlType == "imageUpload")
<el-table-column label="${comment}" align="center" prop="${javaField}" width="100"> <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
@@ -153,24 +144,18 @@
#end #end
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['${moduleName}:${businessName}:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['${moduleName}:${businessName}:remove']"
>删除</el-button>
<el-button size="mini" type="text" icon="el-icon-view" @click="handleLook(scope.row)" v-hasPermi="['${moduleName}:${businessName}:query']">查看</el-button>
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['${moduleName}:${businessName}:edit']">修改</el-button>
<el-dropdown :split-button="false" type="text" class="dropdown el-dropdown-link">
<span style="cursor: pointer; font-size: 10px; color:#1890FF"><!--更多--><i class="el-icon-arrow-down el-icon--right"></i></span>
<el-dropdown-menu slot="dropdown" style="padding: 10px">
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['${moduleName}:${businessName}:remove']">删除</el-button>
</el-dropdown-menu>
</el-dropdown>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>

<pagination <pagination
v-show="total>0" v-show="total>0"
:total="total" :total="total"
@@ -179,9 +164,35 @@
@pagination="getList" @pagination="getList"
/> />


<!-- 查看${functionName}对话框 -->
<el-dialog :title="title" :visible.sync="viewOpen" width="800px" append-to-body>
<el-descriptions :column="descColumn" border :labelStyle="{width: `${descLabelWidth}%`}" :contentStyle="{width: `${(100 / descColumn) - descLabelWidth}%`}">
#foreach($column in $columns)
#set($field=$column.javaField)
#if($column.insert && !$column.pk)
#if(($column.usableColumn) || (!$column.superColumn))
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#set($dictType=$column.dictType)
<el-descriptions-item label="${comment}">#if(($column.htmlType == "select" || $column.htmlType == "checkbox" || $column.htmlType == "radio") && "" != $dictType)<el-tooltip effect="light" :content="form.${field}" placement="right"><dict-tag :options="dict.type.${dictType}" :value="form.${field}"/></el-tooltip>#elseif($column.htmlType == "imageUpload")<div v-if="!!form.${field}"><el-tooltip effect="light" :content="item" placement="bottom" v-for="(item, index) in form.${field}.split(',')" :key="index"><el-image style="height: 64px; width: 64px; margin: 2px; display: inline-block;" fit="scale-down" :src="$store.getters.baseRoutingUrl + item" :preview-src-list="form.${field}.split(',').map((x) => $store.getters.baseRoutingUrl + x)"/></el-tooltip></div>#elseif($column.htmlType == "editor")<el-tooltip placement="bottom" effect="light"><div slot="content" v-html="form.${field}"/><div style="overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 230px;">{{ form.${field} }}</div></el-tooltip>#elseif($column.htmlType == "fileUpload")<div v-if="!!form.${field}"><el-tooltip effect="light" :content="item.substr(item.lastIndexOf('/') + 1)" placement="bottom" v-for="(item, index) in form.${field}.split(',')" :key="index"><a :href="$store.getters.baseRoutingUrl + item" target="_blank" style="height: 48px; width: 48px; margin: 2px; display: inline-block; text-align: center;"><img :src="getFileIcon(item)" style="height: 100%;"/></a></el-tooltip></div>#else{{ form.${field} }}#end</el-descriptions-item>
#end
#end
#end
</el-descriptions>

<!-- 弹框操作按钮 -->
<div slot="footer" class="dialog-footer">
<el-button @click="cancel">关 闭</el-button>
</div>
</el-dialog>

<!-- 添加或修改${functionName}对话框 --> <!-- 添加或修改${functionName}对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="110px">
#foreach($column in $columns) #foreach($column in $columns)
#set($field=$column.javaField) #set($field=$column.javaField)
#if($column.insert && !$column.pk) #if($column.insert && !$column.pk)
@@ -194,9 +205,18 @@
#end #end
#set($dictType=$column.dictType) #set($dictType=$column.dictType)
#if($column.htmlType == "input") #if($column.htmlType == "input")
#COLUMN_IS_NUMBER($column)
#if($_column_is_number)
#GET_NUMBER_COLUMN_MIN_AND_PRECISION($column)
<el-form-item label="${comment}" prop="${field}">
<el-input-number v-model="form.${field}" placeholder="请输入${comment}" controls-position="right" #if($_number_column_min != "") :min="${_number_column_min}"#end #if($_number_column_precision != "") :precision="${_number_column_precision}"#end/>
</el-form-item>
#else
#GET_CHAR_COLUMN_LENGTH($column)
<el-form-item label="${comment}" prop="${field}"> <el-form-item label="${comment}" prop="${field}">
<el-input v-model="form.${field}" placeholder="请输入${comment}" />
<el-input v-model="form.${field}" placeholder="请输入${comment}" #if($_char_column_length != "") show-word-limit :maxlength="${_char_column_length}"#end/>
</el-form-item> </el-form-item>
#end
#elseif($column.htmlType == "imageUpload") #elseif($column.htmlType == "imageUpload")
<el-form-item label="${comment}" prop="${field}"> <el-form-item label="${comment}" prop="${field}">
<image-upload v-model="form.${field}"/> <image-upload v-model="form.${field}"/>
@@ -206,22 +226,19 @@
<file-upload v-model="form.${field}"/> <file-upload v-model="form.${field}"/>
</el-form-item> </el-form-item>
#elseif($column.htmlType == "editor") #elseif($column.htmlType == "editor")
<el-form-item label="${comment}">
<el-form-item label="${comment}" prop="${field}">
<editor v-model="form.${field}" :min-height="192"/> <editor v-model="form.${field}" :min-height="192"/>
</el-form-item> </el-form-item>
#elseif($column.htmlType == "select" && "" != $dictType) #elseif($column.htmlType == "select" && "" != $dictType)
<el-form-item label="${comment}" prop="${field}"> <el-form-item label="${comment}" prop="${field}">
<el-select v-model="form.${field}" placeholder="请选择${comment}"> <el-select v-model="form.${field}" placeholder="请选择${comment}">
<el-option
v-for="dict in dict.type.${dictType}"
:key="dict.value"
:label="dict.label"
<el-option v-for="dict in dict.type.${dictType}" :key="dict.value" :label="dict.label"
#if($column.javaType == "Integer" || $column.javaType == "Long") #if($column.javaType == "Integer" || $column.javaType == "Long")
:value="parseInt(dict.value)" :value="parseInt(dict.value)"
#else #else
:value="dict.value" :value="dict.value"
#end #end
></el-option>
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
#elseif($column.htmlType == "select" && $dictType) #elseif($column.htmlType == "select" && $dictType)
@@ -233,12 +250,7 @@
#elseif($column.htmlType == "checkbox" && "" != $dictType) #elseif($column.htmlType == "checkbox" && "" != $dictType)
<el-form-item label="${comment}" prop="${field}"> <el-form-item label="${comment}" prop="${field}">
<el-checkbox-group v-model="form.${field}"> <el-checkbox-group v-model="form.${field}">
<el-checkbox
v-for="dict in dict.type.${dictType}"
:key="dict.value"
:label="dict.value">
{{dict.label}}
</el-checkbox>
<el-checkbox v-for="dict in dict.type.${dictType}" :key="dict.value" :label="dict.value">{{dict.label}}</el-checkbox>
</el-checkbox-group> </el-checkbox-group>
</el-form-item> </el-form-item>
#elseif($column.htmlType == "checkbox" && $dictType) #elseif($column.htmlType == "checkbox" && $dictType)
@@ -250,9 +262,7 @@
#elseif($column.htmlType == "radio" && "" != $dictType) #elseif($column.htmlType == "radio" && "" != $dictType)
<el-form-item label="${comment}" prop="${field}"> <el-form-item label="${comment}" prop="${field}">
<el-radio-group v-model="form.${field}"> <el-radio-group v-model="form.${field}">
<el-radio
v-for="dict in dict.type.${dictType}"
:key="dict.value"
<el-radio v-for="dict in dict.type.${dictType}" :key="dict.value"
#if($column.javaType == "Integer" || $column.javaType == "Long") #if($column.javaType == "Integer" || $column.javaType == "Long")
:label="parseInt(dict.value)" :label="parseInt(dict.value)"
#else #else
@@ -268,17 +278,18 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
#elseif($column.htmlType == "datetime") #elseif($column.htmlType == "datetime")
#GET_CHAR_COLUMN_LENGTH($column)
<el-form-item label="${comment}" prop="${field}"> <el-form-item label="${comment}" prop="${field}">
<el-date-picker clearable <el-date-picker clearable
v-model="form.${field}" v-model="form.${field}"
type="date"
value-format="yyyy-MM-dd"
#if($_char_column_length == "4")type="year" value-format="yyyy" #elseif($_char_column_length == "6")type="yearmonth" value-format="yyyyMM" #elseif($_char_column_length == "7")type="yearmonth" value-format="yyyy-MM" #else type="date" value-format="yyyy-MM-dd" #end
placeholder="请选择${comment}"> placeholder="请选择${comment}">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
#elseif($column.htmlType == "textarea") #elseif($column.htmlType == "textarea")
#GET_CHAR_COLUMN_LENGTH($column)
<el-form-item label="${comment}" prop="${field}"> <el-form-item label="${comment}" prop="${field}">
<el-input v-model="form.${field}" type="textarea" placeholder="请输入内容" />
<el-input v-model="form.${field}" type="textarea" :autosize="{ minRows: 2, maxRows: 3}" #if($_char_column_length != "") :maxlength="${_char_column_length}"#end show-word-limit placeholder="请输入${comment}" />
</el-form-item> </el-form-item>
#end #end
#end #end
@@ -322,12 +333,7 @@
<el-table-column label="$comment" prop="${javaField}" width="150"> <el-table-column label="$comment" prop="${javaField}" width="150">
<template slot-scope="scope"> <template slot-scope="scope">
<el-select v-model="scope.row.$javaField" placeholder="请选择$comment"> <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
<el-option
v-for="dict in dict.type.$column.dictType"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
<el-option v-for="dict in dict.type.$column.dictType" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
@@ -345,8 +351,8 @@
#end #end
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
<el-button type="primary" v-if="diglogStatus" @click="submitForm">保 存</el-button>
<el-button @click="cancel">关 闭</el-button>
</div> </div>
</el-dialog> </el-dialog>
</div> </div>
@@ -355,15 +361,58 @@
<script> <script>
import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}"; import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";


#foreach($column in $columns)
#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "imageUpload")
import ImageUpload from '@/components/ImageUpload';
#break
#end
#end
#foreach($column in $columns)
#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "fileUpload")
import FileUpload from '@/components/FileUpload';
#break
#end
#end
#foreach($column in $columns)
#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "editor")
import Editor from '@/components/Editor';
#break
#end
#end

export default { export default {
name: "${BusinessName}", name: "${BusinessName}",
components: {
#foreach($column in $columns)
#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "imageUpload")
ImageUpload,
#break
#end
#end
#foreach($column in $columns)
#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "fileUpload")
FileUpload,
#break
#end
#end
#foreach($column in $columns)
#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "editor")
Editor,
#break
#end
#end
},
#if(${dicts} != '') #if(${dicts} != '')
dicts: [${dicts}], dicts: [${dicts}],
#end #end
data() { data() {
return { return {
// 遮罩层 // 遮罩层
loading: true,
loading: false,
// 遮罩按钮新增点击状态
diglogStatus: true,
// 导出遮罩层
exportLoading: false,
// 选中数组 // 选中数组
ids: [], ids: [],
#if($table.sub) #if($table.sub)
@@ -374,8 +423,8 @@ export default {
single: true, single: true,
// 非多个禁用 // 非多个禁用
multiple: true, multiple: true,
// 显示搜索条件
showSearch: true,
// 默认隐藏搜索条件
showSearch: false,
// 总条数 // 总条数
total: 0, total: 0,
// ${functionName}表格数据 // ${functionName}表格数据
@@ -389,7 +438,16 @@ export default {
// 是否显示弹出层 // 是否显示弹出层
open: false, open: false,
#foreach ($column in $columns) #foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if(${column.dictType} != '')
// $comment字典
${column.javaField}Options: [],
#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
// $comment时间范围 // $comment时间范围
daterange${AttrName}: [], daterange${AttrName}: [],
@@ -397,11 +455,17 @@ export default {
#end #end
// 查询参数 // 查询参数
queryParams: { queryParams: {
// 分页
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
// 查询排序
//orderByColumn: "id",
//isAsc: "desc",
// 翻译字典
//translate_dict: "1",
#foreach ($column in $columns) #foreach ($column in $columns)
#if($column.query) #if($column.query)
$column.javaField: null#if($foreach.count != $columns.size()),#end
$column.javaField: null,
#end #end
#end #end
}, },
@@ -418,11 +482,17 @@ export default {
#set($comment=$column.columnComment) #set($comment=$column.columnComment)
#end #end
$column.javaField: [ $column.javaField: [
{ required: true, message: "$comment不能为空", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
]#if($foreach.count != $columns.size()),#end
{ required: true, message: "$comment不能为空", trigger: #if($column.htmlType == "select" || $column.htmlType == "imageUpload" || $column.htmlType == "fileUpload" || $column.htmlType == "editor" || $column.htmlType == "radio")"change"#else"blur"#end },
],
#end #end
#end #end
}
},
// 详情组件列数
descColumn: 2,
// 详情组件Label所占百分比, 最大={100 / descColumn}. 内容所占百分比={100 / descColumn - descLabelWidth}
descLabelWidth: 15,
// 对话框显示只读的详情
viewOpen: false,
}; };
}, },
created() { created() {
@@ -450,12 +520,26 @@ export default {
list${BusinessName}(this.queryParams).then(response => { list${BusinessName}(this.queryParams).then(response => {
this.${businessName}List = response.rows; this.${businessName}List = response.rows;
this.total = response.total; this.total = response.total;
this.loading = false;
});
}).finally(() => this.loading = false );
}, },
#foreach ($column in $columns)
#if(${column.dictType} != '')
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
// $comment字典翻译
${column.javaField}Format(row, column) {
return this.selectDictLabel#if($column.htmlType == "checkbox")s#end(this.dict.type.${column.dictType}, row.${column.javaField});
},
#end
#end
// 取消按钮 // 取消按钮
cancel() { cancel() {
this.open = false; this.open = false;
this.viewOpen = false;
this.reset(); this.reset();
}, },
// 表单重置 // 表单重置
@@ -473,6 +557,8 @@ export default {
this.${subclassName}List = []; this.${subclassName}List = [];
#end #end
this.resetForm("form"); this.resetForm("form");
// 防止表单提交失败再次打开按钮隐藏
this.diglogStatus = true;
}, },
/** 搜索按钮操作 */ /** 搜索按钮操作 */
handleQuery() { handleQuery() {
@@ -499,6 +585,7 @@ export default {
/** 新增按钮操作 */ /** 新增按钮操作 */
handleAdd() { handleAdd() {
this.reset(); this.reset();
this.viewOpen = false;
this.open = true; this.open = true;
this.title = "添加${functionName}"; this.title = "添加${functionName}";
}, },
@@ -516,14 +603,37 @@ export default {
#if($table.sub) #if($table.sub)
this.${subclassName}List = response.data.${subclassName}List; this.${subclassName}List = response.data.${subclassName}List;
#end #end
this.viewOpen = false;
this.open = true; this.open = true;
this.title = "修改${functionName}"; this.title = "修改${functionName}";
}); });
},
/** 查看按钮操作 */
handleLook(row) {
this.reset();
// 查看时不允许提交
this.diglogStatus = false;
const ${pkColumn.javaField} = row.${pkColumn.javaField} || this.ids
get${BusinessName}(${pkColumn.javaField}).then(response => {
this.form = response.data;
#foreach ($column in $columns)
#if($column.htmlType == "checkbox")
this.form.$column.javaField = this.form.${column.javaField}.split(",");
#end
#end
#if($table.sub)
this.${subclassName}List = response.data.${subclassName}List;
#end
this.viewOpen = true;
this.open = false;
this.title = "查看${functionName}";
});
}, },
/** 提交按钮 */ /** 提交按钮 */
submitForm() { submitForm() {
this.#[[$]]#refs["form"].validate(valid => { this.#[[$]]#refs["form"].validate(valid => {
if (valid) { if (valid) {
this.diglogStatus = false;
#foreach ($column in $columns) #foreach ($column in $columns)
#if($column.htmlType == "checkbox") #if($column.htmlType == "checkbox")
this.form.$column.javaField = this.form.${column.javaField}.join(","); this.form.$column.javaField = this.form.${column.javaField}.join(",");
@@ -534,16 +644,20 @@ export default {
#end #end
if (this.form.${pkColumn.javaField} != null) { if (this.form.${pkColumn.javaField} != null) {
update${BusinessName}(this.form).then(response => { update${BusinessName}(this.form).then(response => {
if(response.code != 200) throw response.msg;
this.#[[$modal]]#.msgSuccess("修改成功"); this.#[[$modal]]#.msgSuccess("修改成功");
this.open = false; this.open = false;
this.getList(); this.getList();
});
this.diglogStatus = true;
}).catch(() => this.diglogStatus = true);
} else { } else {
add${BusinessName}(this.form).then(response => { add${BusinessName}(this.form).then(response => {
if(response.code != 200) throw response.msg;
this.#[[$modal]]#.msgSuccess("新增成功"); this.#[[$modal]]#.msgSuccess("新增成功");
this.open = false; this.open = false;
this.getList(); this.getList();
});
this.diglogStatus = true;
}).catch(() => this.diglogStatus = true);
} }
} }
}); });
@@ -593,10 +707,19 @@ export default {
#end #end
/** 导出按钮操作 */ /** 导出按钮操作 */
handleExport() { handleExport() {
this.download('${moduleName}/${businessName}/export', {
...this.queryParams
}, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`)
}
}
const queryParams = this.queryParams;
var _this = this;
this.#[[$modal]]#.confirm('是否确认导出所有${functionName}数据项?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(function() {
_this.exportLoading = true;
_this.download('${moduleName}/${businessName}/export', {
..._this.queryParams
}, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`).then(() => _this.exportLoading = false);
}).catch(() => { _this.exportLoading = false });
},
},
}; };
</script> </script>

+ 1
- 1
ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm Прегледај датотеку

@@ -420,7 +420,7 @@ async function handleUpdate(row) {
reset(); reset();
await getTreeselect(); await getTreeselect();
if (row != null) { if (row != null) {
form.value.${treeParentCode} = row.${treeCode};
form.value.${treeParentCode} = row.${treeParentCode};
} }
get${BusinessName}(row.${pkColumn.javaField}).then(response => { get${BusinessName}(row.${pkColumn.javaField}).then(response => {
form.value = response.data; form.value = response.data;


+ 2
- 16
ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm Прегледај датотеку

@@ -26,7 +26,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName} select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName}
</sql> </sql>


<!--条件查询-->
<select id="select${ClassName}List" parameterType="${ClassName}" resultMap="${ClassName}Result"> <select id="select${ClassName}List" parameterType="${ClassName}" resultMap="${ClassName}Result">
<include refid="select${ClassName}Vo"/> <include refid="select${ClassName}Vo"/>
<where> <where>
@@ -59,7 +58,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</where> </where>
</select> </select>
<!--主键查询-->
<select id="select${ClassName}By${pkColumn.capJavaField}" parameterType="${pkColumn.javaType}" resultMap="#if($table.sub)${ClassName}${subClassName}Result#else${ClassName}Result#end"> <select id="select${ClassName}By${pkColumn.capJavaField}" parameterType="${pkColumn.javaType}" resultMap="#if($table.sub)${ClassName}${subClassName}Result#else${ClassName}Result#end">
#if($table.crud || $table.tree) #if($table.crud || $table.tree)
<include refid="select${ClassName}Vo"/> <include refid="select${ClassName}Vo"/>
@@ -74,7 +72,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#end #end
</select> </select>
<!--新增-->
<insert id="insert${ClassName}" parameterType="${ClassName}"#if($pkColumn.increment) useGeneratedKeys="true" keyProperty="$pkColumn.javaField"#end> <insert id="insert${ClassName}" parameterType="${ClassName}"#if($pkColumn.increment) useGeneratedKeys="true" keyProperty="$pkColumn.javaField"#end>
insert into ${tableName} insert into ${tableName}
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -115,7 +112,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach> </foreach>
</insert> </insert>


<!--更新-->
<update id="update${ClassName}" parameterType="${ClassName}"> <update id="update${ClassName}" parameterType="${ClassName}">
update ${tableName} update ${tableName}
<trim prefix="SET" suffixOverrides=","> <trim prefix="SET" suffixOverrides=",">
@@ -124,7 +120,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="$column.javaField != null#if($column.javaType == 'String' && $column.required) and $column.javaField != ''#end">$column.columnName = #{$column.javaField},</if> <if test="$column.javaField != null#if($column.javaType == 'String' && $column.required) and $column.javaField != ''#end">$column.columnName = #{$column.javaField},</if>
#end #end
#end #end
<if test="params != null and params.__UPDATE != null"><foreach collection="params.__UPDATE" item="val" index="col">`${col}` = #{val},</foreach></if>
</trim> </trim>
where ${pkColumn.columnName} = #{${pkColumn.javaField}} where ${pkColumn.columnName} = #{${pkColumn.javaField}}
</update> </update>
@@ -139,18 +134,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="item.$column.javaField != null#if($column.javaType == 'String' && $column.required) and item.$column.javaField != ''#end">$column.columnName = #{item.$column.javaField},</if> <if test="item.$column.javaField != null#if($column.javaType == 'String' && $column.required) and item.$column.javaField != ''#end">$column.columnName = #{item.$column.javaField},</if>
#end #end
#end #end
<if test="item.params != null and item.params.__UPDATE != null"><foreach collection="item.params.__UPDATE" item="val" index="col">`${col}` = #{val},</foreach></if>
</set> </set>
where ${pkColumn.columnName} = #{item.${pkColumn.javaField}} where ${pkColumn.columnName} = #{item.${pkColumn.javaField}}
</foreach> </foreach>
</update> </update>


<!--主键删除-->
<delete id="delete${ClassName}By${pkColumn.capJavaField}" parameterType="${pkColumn.javaType}"> <delete id="delete${ClassName}By${pkColumn.capJavaField}" parameterType="${pkColumn.javaType}">
delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}}
</delete> </delete>


<!--主键批量删除-->
<delete id="delete${ClassName}By${pkColumn.capJavaField}s" parameterType="String"> <delete id="delete${ClassName}By${pkColumn.capJavaField}s" parameterType="String">
delete from ${tableName} where ${pkColumn.columnName} in delete from ${tableName} where ${pkColumn.columnName} in
<foreach item="${pkColumn.javaField}" collection="array" open="(" separator="," close=")"> <foreach item="${pkColumn.javaField}" collection="array" open="(" separator="," close=")">
@@ -159,8 +151,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</delete> </delete>
#if($table.sub) #if($table.sub)

<!--按主表N个主键批量删除子表-->
<delete id="delete${subClassName}By${subTableFkClassName}s" parameterType="String"> <delete id="delete${subClassName}By${subTableFkClassName}s" parameterType="String">
delete from ${subTableName} where ${subTableFkName} in delete from ${subTableName} where ${subTableFkName} in
<foreach item="${subTableFkclassName}" collection="array" open="(" separator="," close=")"> <foreach item="${subTableFkclassName}" collection="array" open="(" separator="," close=")">
@@ -168,13 +158,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach> </foreach>
</delete> </delete>


<!--按主表主键删除子表-->
<delete id="delete${subClassName}By${subTableFkClassName}" parameterType="${pkColumn.javaType}"> <delete id="delete${subClassName}By${subTableFkClassName}" parameterType="${pkColumn.javaType}">
delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}}
</delete> </delete>
<!--子表语法 (要求主表、子表关联主键字段名称相同)-->
<!--批量新增子表-->

<insert id="batch${subClassName}"> <insert id="batch${subClassName}">
insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end) values insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end) values
<foreach item="item" index="index" collection="list" separator=","> <foreach item="item" index="index" collection="list" separator=",">
@@ -183,7 +170,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</insert> </insert>
#end #end


<!-- Harm -->
<!--单条条件查询--> <!--单条条件查询-->
<select id="select${ClassName}" parameterType="${ClassName}" resultMap="${ClassName}Result"> <select id="select${ClassName}" parameterType="${ClassName}" resultMap="${ClassName}Result">
<include refid="select${ClassName}Vo"/> <include refid="select${ClassName}Vo"/>
@@ -220,7 +206,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"


<!--条件查询数量--> <!--条件查询数量-->
<select id="select${ClassName}Count" parameterType="${ClassName}" resultType="Long"> <select id="select${ClassName}Count" parameterType="${ClassName}" resultType="Long">
select count(*) from ${tableName}
select count(*) from ${tableName}
<where> <where>
#foreach($column in $columns) #foreach($column in $columns)
#set($queryType=$column.queryType) #set($queryType=$column.queryType)


+ 2
- 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java Прегледај датотеку

@@ -123,4 +123,6 @@ public interface SysDeptMapper
*/ */
public SysDept selectSysDept(SysDept sysDept); public SysDept selectSysDept(SysDept sysDept);
public SysDept selectSysDeptByOrgCode(String orgCode); public SysDept selectSysDeptByOrgCode(String orgCode);

public List<SysDept> getDeptList(SysDept cond);
} }

+ 11
- 0
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java Прегледај датотеку

@@ -128,4 +128,15 @@ public interface ISysDeptService
* @return 部门条目 * @return 部门条目
*/ */
public SysDept selectSysDept(SysDept sysDept); public SysDept selectSysDept(SysDept sysDept);

/**
* 查询部门列表, 不受当前用户影响
*
* @param sysDept 部门
* @return 部门条目
*/
public List<SysDept> getDeptList(SysDept sysDept);

public List<SysDept> getDeptTree(SysDept dept);
public List<SysDept> getCityTree(SysDept dept);
} }

+ 37
- 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java Прегледај датотеку

@@ -4,6 +4,8 @@ import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;

import com.ruoyi.common.utils.TreeUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.annotation.DataScope;
@@ -345,4 +347,39 @@ public class SysDeptServiceImpl implements ISysDeptService
public SysDept selectSysDept(SysDept sysDept) { public SysDept selectSysDept(SysDept sysDept) {
return deptMapper.selectSysDept(sysDept); return deptMapper.selectSysDept(sysDept);
} }

@Override
public List<SysDept> getDeptList(SysDept sysDept)
{
return deptMapper.getDeptList(sysDept);
}

@Override
public List<SysDept> getDeptTree(SysDept dept)
{
List<SysDept> deptList = getDeptList(dept);

return TreeUtils.makeTree(deptList, TreeUtils.Config.<SysDept>builder()
.getParentIdFunc(SysDept::getParentId)
.setChildrenFunc(SysDept::setChildren)
.getIdFunc(SysDept::getDeptId)
.getChildrenFunc(SysDept::getChildren)
.build(),
SysDept.ROOT_DEPT_ID
);
}

@Override
public List<SysDept> getCityTree(SysDept dept)
{
List<SysDept> deptTree = getDeptTree(dept);
List<SysDept> depts = TreeUtils.makeList(deptTree, TreeUtils.Config.<SysDept>builder()
.getParentIdFunc(SysDept::getParentId)
.setChildrenFunc(SysDept::setChildren)
.getIdFunc(SysDept::getDeptId)
.getChildrenFunc(SysDept::getChildren)
.build());
depts.removeIf((x) -> x.orgCodeLength() != 6);
return depts;
}
} }

+ 24
- 0
ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml Прегледај датотеку

@@ -187,4 +187,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND `status` = '0' AND `status` = '0'
limit 1 limit 1
</select> </select>

<select id="getDeptList" parameterType="SysDept" resultMap="SysDeptResult">
<include refid="selectDeptVo"/>
where d.del_flag = '0'
<if test="deptId != null and deptId != 0">
AND dept_id = #{deptId}
</if>
<if test="parentId != null and parentId != 0">
AND parent_id = #{parentId}
</if>
<if test="deptName != null and deptName != ''">
AND dept_name like concat('%', #{deptName}, '%')
</if>
<if test="status != null and status != ''">
AND status = #{status}
</if>
<if test="rootId != null and rootId != 0">
AND (dept_id = #{rootId} OR dept_id IN (SELECT dept_id FROM sys_dept WHERE FIND_IN_SET(#{rootId}, ancestors)))
</if>
<if test="orgCodeLength != null and orgCodeLength != ''">
AND LENGTH(org_code) = #{orgCodeLength}
</if>
order by d.parent_id, d.order_num
</select>
</mapper> </mapper>

Loading…
Откажи
Сачувај