1. 调整condition , 注入方式进行where 条件编写

This commit is contained in:
zhaowenyuan 2024-06-28 09:43:44 +08:00
parent 93120f3778
commit 7fd574d4ad
23 changed files with 1047 additions and 297 deletions

View File

@ -36,16 +36,21 @@ public class DictJsonSerializer extends JsonSerializer<Object> implements Contex
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
try {
String dictLabel = DictUtils.getDictLabel(dictType, Convert.toStr(value));
if (rewrite) {
// 重写了 原先的 code
gen.writeString(dictLabel);
if (null != value){
String dictLabel = DictUtils.getDictLabel(dictType, Convert.toStr(value));
if (rewrite) {
// 重写了 原先的 code
gen.writeString(dictLabel);
}else {
// value == code
gen.writeObject(value);
gen.writeFieldName(gen.getOutputContext().getCurrentName() + "Name");
gen.writeString(dictLabel);
}
}else {
// value == code
gen.writeObject(value);
gen.writeFieldName(gen.getOutputContext().getCurrentName() + "Name");
gen.writeString(dictLabel);
}
} catch (BeansException e) {
log.error("字典数据未查到, 采用默认处理【{}】", e.getMessage());
gen.writeObject(value);

View File

@ -13,9 +13,13 @@ public @interface Condition {
String name();
ConditionType[] type() default {eq};
String tableName() default "";
/**
* 用于 批量获取
* @return
*/
ConditionType type() default eq;
enum ConditionType {
ge,

View File

@ -9,7 +9,9 @@ import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.chushang.common.core.util.StringUtils;
import com.chushang.common.mybatis.annotation.Condition;
import com.chushang.common.mybatis.base.BaseEntity;
import com.chushang.common.mybatis.exception.MybatisConditionException;
import com.chushang.common.mybatis.page.CommonParam;
import lombok.AccessLevel;
@ -28,7 +30,153 @@ public class WrapperUtils {
return builder(null, null, columns);
}
public static <T> LambdaQueryWrapper<T> builder(Object query, CommonParam commonParam, String... columns) {
public static void buildSql(Object query)
{
// 获取注解
Field[] fields = ReflectUtil.getFields(query.getClass(), field -> field.isAnnotationPresent(Condition.class));
StringBuilder allSql = new StringBuilder();
for (Field field : fields) {
Condition condition = field.getAnnotation(Condition.class);
Object value = ReflectUtil.getFieldValue(query, field);
if (ObjectUtil.isEmpty(value)) {
continue;
}
String name = condition.name();
String tableName = condition.tableName();
String[] split = name.split(",");
Condition.ConditionType conditionType = condition.type();
if (null != conditionType) {
switch (conditionType) {
case ge:
if (StringUtils.isNotEmpty(tableName)) {
allSql.append(" AND ").append(tableName).append(".")
.append(name).append(" $ge; ").append(value).append(" ");
}
break;
case le:
if (StringUtils.isNotEmpty(tableName))
allSql.append(" AND ").append(tableName).append(".")
.append(name).append(" $le; ").append(value).append(" ");
break;
case gt:
if (StringUtils.isNotEmpty(tableName)) allSql.append(" AND ").append(tableName).append(".")
.append(name).append(" $gt; ").append(value).append(" ");
break;
case lt:
if (StringUtils.isNotEmpty(tableName)) allSql.append(" AND ").append(tableName).append(".")
.append(name).append(" $lt; ").append(value).append(" ");
break;
case isNull:
if (StringUtils.isNotEmpty(tableName)) allSql.append(" AND ").append(tableName).append(".")
.append(name).append(" is null ").append(" ");
break;
case eq:
if (StringUtils.isNotEmpty(tableName)) allSql.append(" AND ").append(tableName).append(".")
.append(name).append(" = ").append(value).append(" ");
break;
case like:
if (StringUtils.isNotEmpty(tableName)) allSql.append(" AND ").append(tableName).append(".")
.append(name).append(" like concat('%', ").append(value).append(", '%'").append(" ");
break;
case in:
if (value instanceof Collection<?> values) {
if (StringUtils.isNotEmpty(tableName)) {
allSql.append(" AND ").append(tableName).append(".")
.append(name).append(" in (");
for (Object o : values) {
allSql.append(o).append(",");
}
if (allSql.toString().endsWith(",")) {
allSql.delete(allSql.length() - 1, allSql.length());
}
allSql.append(" )").append(" ");
}
} else {
throw new MybatisConditionException("in 条件必须为集合");
}
break;
case between:
if (value instanceof Collection<?>) {
List<?> list = Convert.toList(value);
if (CollUtil.size(list) == 2) {
if (StringUtils.isNotEmpty(tableName))
allSql.append(" AND ").append(tableName).append(".")
.append(name).append(" between ").append(list.get(0)).append(" AND ").append(list.get(1)).append(" ");
}
} else {
throw new MybatisConditionException("between 条件必须为集合");
}
break;
case likeLeft:
if (StringUtils.isNotEmpty(tableName)) allSql.append(" AND ").append(tableName).append(".")
.append(name).append(" like concat('%', ").append(value).append(", '')").append(" ");
break;
case dataScope:
// TODO 因为 dataScope 是在父类, 所以没有指定tableName, 此处无法获取对应的dataScopeIds
if (value instanceof HashMap sqlParam) {
// dataScope 拼接部门Ids
Object dataScope = sqlParam.get("dataScope");
if (ObjectUtil.isNotEmpty(dataScope) && dataScope instanceof String sql) {
allSql.append(sql).append(" ");
}
}
break;
case or_eq:
if (StringUtils.isNotEmpty(tableName)) {
allSql.append(" OR ");
for (String key : split) {
allSql.append(tableName).append(".")
.append(key).append(" = ").append(value).append(" AND ");
}
allSql.deleteCharAt(allSql.length() - 4);
if (allSql.toString().endsWith("AND ")) {
allSql.delete(allSql.length() - 4, allSql.length());
}
allSql.append(") ");
}
break;
case or_like:
if (StringUtils.isNotEmpty(tableName)) {
allSql.append(" OR (");
for (String key : split) {
allSql.append(tableName).append(".")
.append(key).append(" like concat('%', ").append(value).append(", '%'").append(" AND ");
}
if (allSql.toString().endsWith("AND ")) {
allSql.delete(allSql.length() - 4, allSql.length());
}
allSql.append(") ");
}
break;
case or_likeLeft:
if (StringUtils.isNotEmpty(tableName)) {
allSql.append(" OR (");
for (String key : split) {
allSql.append(tableName).append(".")
.append(key).append(" like concat('%', ").append(value).append(", '')").append(" AND ");
}
// 去掉末尾的 AND
if (allSql.toString().endsWith("AND ")) {
allSql.delete(allSql.length() - 4, allSql.length());
}
allSql.append(") ");
}
break;
}
}
}
if (query instanceof CommonParam commonParam){
commonParam.getSqlParam().put("sqlWhere", allSql.toString());
}else if (query instanceof BaseEntity baseEntity){
baseEntity.getSqlParam().put("sqlWhere", allSql.toString());
}
}
public static <T> LambdaQueryWrapper<T> builder(Object query, CommonParam commonParam, String... columns)
{
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
if (null != columns) {
queryWrapper = queryWrapper.select(columns);
@ -38,9 +186,9 @@ public class WrapperUtils {
queryWrapper = queryWrapper
.orderBy(true, "asc".equals(commonParam.getIsAsc()), commonParam.getOrderBy());
String groupStr = commonParam.getGroupStr();
if (null != groupStr){
if (null != groupStr) {
String[] split = groupStr.split(",");
if (split.length > 0){
if (split.length > 0) {
queryWrapper.groupBy(Arrays.asList(split));
}
}
@ -63,87 +211,97 @@ public class WrapperUtils {
continue;
}
String name = condition.name();
String tableName = condition.tableName();
String[] split = name.split(",");
Condition.ConditionType[] type = condition.type();
if (null != type){
for (Condition.ConditionType conditionType : type) {
switch (conditionType) {
case ge:
queryWrapper = queryWrapper.ge(ObjectUtil.isNotEmpty(value), name, value);
break;
case le:
queryWrapper = queryWrapper.le(ObjectUtil.isNotEmpty(value), name, value);
break;
case gt:
queryWrapper = queryWrapper.gt(ObjectUtil.isNotEmpty(value), name, value);
break;
case lt:
queryWrapper = queryWrapper.lt(ObjectUtil.isNotEmpty(value), name, value);
break;
case isNull:
queryWrapper = queryWrapper.isNull(name);
break;
case eq:
queryWrapper = queryWrapper.eq(ObjectUtil.isNotEmpty(value), name, value);
break;
case like:
queryWrapper = queryWrapper.like(ObjectUtil.isNotEmpty(value), name, value);
break;
case in:
if (value instanceof Collection<?>) {
queryWrapper = queryWrapper.in(ObjectUtil.isNotEmpty(value), name, (Collection) value);
} else {
throw new MybatisConditionException("in 条件必须为集合");
Condition.ConditionType conditionType = condition.type();
if (null != conditionType) {
switch (conditionType) {
case ge:
queryWrapper = queryWrapper.ge(ObjectUtil.isNotEmpty(value), name, value);
break;
case le:
queryWrapper = queryWrapper.le(ObjectUtil.isNotEmpty(value), name, value);
break;
case gt:
queryWrapper = queryWrapper.gt(ObjectUtil.isNotEmpty(value), name, value);
break;
case lt:
queryWrapper = queryWrapper.lt(ObjectUtil.isNotEmpty(value), name, value);
break;
case isNull:
queryWrapper = queryWrapper.isNull(name);
break;
case eq:
queryWrapper = queryWrapper.eq(ObjectUtil.isNotEmpty(value), name, value);
break;
case like:
queryWrapper = queryWrapper.like(ObjectUtil.isNotEmpty(value), name, value);
break;
case in:
if (value instanceof Collection<?>) {
queryWrapper = queryWrapper.in(ObjectUtil.isNotEmpty(value), name, (Collection) value);
} else {
throw new MybatisConditionException("in 条件必须为集合");
}
break;
case between:
if (value instanceof Collection<?>) {
List<?> list = Convert.toList(value);
if (CollUtil.size(list) == 2) {
queryWrapper = queryWrapper.between(name, list.get(0), list.get(1));
}
break;
case between:
if (value instanceof Collection<?>) {
List<?> list = Convert.toList(value);
if (CollUtil.size(list) == 2) {
queryWrapper = queryWrapper.between(name, list.get(0), list.get(1));
}
} else {
throw new MybatisConditionException("between 条件必须为集合");
} else {
throw new MybatisConditionException("between 条件必须为集合");
}
break;
case likeLeft:
queryWrapper = queryWrapper.likeLeft(ObjectUtil.isNotEmpty(value), name, value);
break;
case dataScope:
if (value instanceof HashMap sqlParam) {
// dataScope 拼接部门Ids
Object dataScope = sqlParam.get("dataScopeIds");
if (ObjectUtil.isNotEmpty(dataScope) && dataScope instanceof Collection<?> deptIds) {
queryWrapper = queryWrapper.in(CollectionUtil.isNotEmpty(deptIds), name, deptIds);
}
break;
case likeLeft:
queryWrapper = queryWrapper.likeLeft(ObjectUtil.isNotEmpty(value), name, value);
break;
case dataScope:
if (value instanceof HashMap sqlParam) {
// dataScope 拼接部门Ids
Object dataScope = sqlParam.get("dataScopeIds");
if (ObjectUtil.isNotEmpty(dataScope) && dataScope instanceof Collection<?> deptIds) {
queryWrapper = queryWrapper.in(CollectionUtil.isNotEmpty(deptIds), name, deptIds);
}
}
break;
case or_eq:
queryWrapper.and(q -> {
for (String key : split) {
q.or().eq(ObjectUtil.isNotEmpty(value), key, value);
}
break;
case or_eq:
queryWrapper.and(q -> {
for (String key : split) {
q.or().eq(ObjectUtil.isNotEmpty(value), key, value);
}
});
break;
case or_like:
queryWrapper.and(q -> {
for (String key : split) {
q.or().like(ObjectUtil.isNotEmpty(value), key, value);
}
});
break;
case or_likeLeft:
queryWrapper.and(q -> {
for (String key : split) {
q.or().likeLeft(ObjectUtil.isNotEmpty(value), key, value);
}
});
break;
}
});
break;
case or_like:
queryWrapper.and(q -> {
for (String key : split) {
q.or().like(ObjectUtil.isNotEmpty(value), key, value);
}
});
break;
case or_likeLeft:
queryWrapper.and(q -> {
for (String key : split) {
q.or().likeLeft(ObjectUtil.isNotEmpty(value), key, value);
}
});
break;
}
}
}
return queryWrapper.lambda();
}
public static void main(String[] args) {
StringBuilder s = new StringBuilder();
s.append("sss")
.append("(")
.append(",")
.append(")")
.append(" AND ");
s.delete(s.length() - 4, s.length());
System.out.println(s.toString());
}
}

View File

@ -19,6 +19,7 @@ import lombok.NoArgsConstructor;
*/
/**
* 工单信息
* 通过 wrk_id store 获取 商户信息, terminal 获取终端信息
*/
@Data
@EqualsAndHashCode(callSuper=true)
@ -37,19 +38,8 @@ public class WrkInfo extends BaseEntity {
*/
@TableField(value = "dept_id")
private Long deptId;
/**
* 商户id
*/
@TableField(value = "store_id")
private Long storeId;
/**
* 终端id
*/
@TableField(value = "terminal_id")
private Long terminalId;
@TableField(value = "dept_name")
private String deptName;
/**
* 总任务id
*/
@ -66,12 +56,6 @@ public class WrkInfo extends BaseEntity {
@TableField(value = "lower_task_name")
private String lowerTaskName;
/**
* 终端记录id
*/
@TableField(value = "terminal_records_id")
private Long terminalRecordsId;
/**
* 业务员id
*/
@ -131,13 +115,6 @@ public class WrkInfo extends BaseEntity {
*/
@TableField(value = "account_phone")
private String accountPhone;
/**
* 终端状态
*/
@TableField(value = "terminal_status")
private Integer terminalStatus;
/**
* 服务结果
*/
@ -149,16 +126,15 @@ public class WrkInfo extends BaseEntity {
*/
@TableField(value = "remark")
private String remark;
/**
* 状态
*/
@TableField(value = "`state`")
private Integer state;
/**
* 结束时间
*/
@TableField(value = "end_time")
private LocalDateTime endTime;
/**
* 工单状态
*/
@TableField(value = "wrk_status")
private Integer wrkStatus;
}

View File

@ -0,0 +1,80 @@
package com.chushang.inspection.work.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.chushang.common.mybatis.base.BaseEntity;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @auther: zhao
* @date: 2024/6/27 18:13
*/
/**
* 工单审核表
*/
@Data
@EqualsAndHashCode(callSuper=true)
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "wrk_info_audit")
public class WrkInfoAudit extends BaseEntity {
/**
* id
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
/**
* 工单id
*/
@TableField(value = "wrk_id")
private Long wrkId;
/**
* 审核人
*/
@TableField(value = "user_id")
private Long userId;
/**
* 审核人
*/
@TableField(value = "user_name")
private String userName;
/**
* 审核时间
*/
@TableField(value = "audit_time")
private Date auditTime;
/**
* 审核状态
*/
@TableField(value = "audit_state")
private Byte auditState;
/**
* 审核描述
*/
@TableField(value = "remark")
private String remark;
/**
* 是否为历史记录 1是 0否
*/
@TableField(value = "is_record")
private Byte isRecord;
/**
* 所属部门
*/
@TableField(value = "dept_id")
private Long deptId;
}

View File

@ -32,60 +32,6 @@ public class WrkInfoStoreRecord extends BaseEntity {
@TableId(value = "wrk_id", type = IdType.INPUT)
private Long wrkId;
/**
* 工单编号
*/
@TableField(value = "wrk_no")
private Long wrkNo;
/**
* 租户id
*/
@TableField(value = "dept_id")
private Long deptId;
/**
* 总任务id
*/
@TableField(value = "task_id")
private Long taskId;
/**
* 本级id
*/
@TableField(value = "lower_task_id")
private Long lowerTaskId;
/**
* 任务名称
*/
@TableField(value = "task_name")
private String taskName;
/**
* 本级任务名称
*/
@TableField(value = "lower_task_name")
private String lowerTaskName;
/**
* 服务结果
*/
@TableField(value = "service_result")
private Integer serviceResult;
/**
* 备注
*/
@TableField(value = "remark")
private String remark;
/**
* 结束时间
*/
@TableField(value = "end_time")
private LocalDateTime endTime;
/**
* 商户id
*/
@ -157,19 +103,11 @@ public class WrkInfoStoreRecord extends BaseEntity {
*/
@TableField(value = "tip_tool")
private String tipTool;
/**
* 操作员编号
*/
@TableField(value = "admin_id")
private String adminId;
/**
* 巡检频次
*/
@TableField(value = "ins_fre")
private Integer insFre;
/**
* 注册地址
*/

View File

@ -32,60 +32,6 @@ public class WrkInfoTerminalRecord extends BaseEntity {
@TableId(value = "wrk_id", type = IdType.INPUT)
private Long wrkId;
/**
* 租户id
*/
@TableField(value = "dept_id")
private Long deptId;
/**
* 工单编号
*/
@TableField(value = "wrk_no")
private Long wrkNo;
/**
* 总任务id
*/
@TableField(value = "task_id")
private Long taskId;
/**
* 本级id
*/
@TableField(value = "lower_task_id")
private Long lowerTaskId;
/**
* 任务名称
*/
@TableField(value = "task_name")
private String taskName;
/**
* 本级任务名称
*/
@TableField(value = "lower_task_name")
private String lowerTaskName;
/**
* 服务结果
*/
@TableField(value = "service_result")
private Integer serviceResult;
/**
* 备注
*/
@TableField(value = "remark")
private String remark;
/**
* 结束时间
*/
@TableField(value = "end_time")
private LocalDateTime endTime;
/**
* 终端id
*/

View File

@ -0,0 +1,130 @@
package com.chushang.inspection.work.query;
import cn.hutool.core.date.DatePattern;
import com.chushang.common.mybatis.annotation.Condition;
import com.chushang.common.mybatis.page.CommonParam;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class ReviewedQuery extends CommonParam {
/**
* 工单编号
*/
@Condition(name = "work_no", tableName = "i")
private String workNo;
/**
* 商户编号
*/
@Condition(name = "store_no", tableName = "i")
@Size(max = 64, message = "商户编号不能超过64个字符")
private String storeNo;
/**
* 终端sn号
*/
@Condition(name = "terminal_sn", tableName = "itr")
@Size(max = 100, message = "终端sn号不能超过100个字符")
private String terminalSn;
/**
* 终端编号
*/
@Condition(name = "terminal_no", tableName = "itr")
@Size(max = 30, message = "终端sn号不能超过30个字符")
private String terminalNo;
/**
* 任务id
*/
@Condition(name = "task_id", tableName = "i")
@NotNull(message = "任务id不能为空")
private Long taskId;
/**
* 工单类型
*/
@Condition(name = "work_type", tableName = "i")
@Range(min = 1, max = 50, message = "工单类型非法")
private Integer workType;
/**
* 工单状态
*/
@Condition(name = "wrk_status", tableName = "i")
@Range(min = 1, max = 6, message = "工单状态非法")
private Integer wrkStatus;
/**
* 终端类型
*/
@Condition(name = "terminal_type", tableName = "itr")
@Range(min = 1, max = 9, message = "终端类型非法")
private Integer terminalType;
/**
* 巡检频次
*/
@Condition(name = "ins_fre", tableName = "isr")
@Range(min = 1, max = 5, message = "巡检频次非法")
private Integer insFre;
/**
* 处理时间
*/
@Condition(name = "dispose_time", type = Condition.ConditionType.between, tableName = "i")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATETIME_PATTERN)
private List<LocalDateTime> disposeTime;
/**
* 审核时间
*/
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATETIME_PATTERN)
private List<LocalDateTime> auditTime;
/**
* 领用时间
*/
@Condition(name = "create_time", type = Condition.ConditionType.between, tableName = "i")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATETIME_PATTERN)
private List<LocalDateTime> createTime;
/**
* 复审时间
*/
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATETIME_PATTERN)
private List<LocalDateTime> reviewTime;
/**
* 工单状态
*/
@Condition(name = "wrk_status", type = Condition.ConditionType.in, tableName = "i")
@Null(message = "内部参数,不允许访问")
private List<Integer> states;
/**
* 业务员名称/门店名称
*/
@Size(max = 128, message = "业务员名称/门店名称不能超过128个字符")
@Condition(name = "shop_name,user_name,store_name", type = Condition.ConditionType.or_like, tableName = "isr")
private String universal;
/**
* 下级任务id
*/
@Condition(name = "lower_task_id", type = Condition.ConditionType.in, tableName = "i")
private List<Long> lowerTaskIds;
}

View File

@ -22,61 +22,61 @@ public class WrkInfoQuery extends CommonParam {
/**
* 工单编号
*/
@Condition(name = "work_no")
@Condition(name = "work_no", tableName = "i")
private String workNo;
/**
* 业务员名称
*/
@Condition(name = "work_name")
@Condition(name = "user_name", tableName = "i")
@Size(max = 32, message = "业务员名称不能超过32个字符")
private String workName;
private String userName;
/**
* 商户编号
*/
@Condition(name = "no")
@Condition(name = "store_no", tableName = "isr")
@Size(max = 64, message = "商户编号不能超过64个字符")
private String no;
private String storeNo;
/**
* 任务id
*/
@Condition(name = "task_id")
@Condition(name = "task_id", tableName = "i")
@NotNull(message = "任务id不能为空")
private Long taskId;
/**
* 终端编号
*/
@Condition(name = "terminal_no")
@Condition(name = "terminal_no", tableName = "itr")
@Size(max = 30, message = "终端sn号不能超过30个字符")
private String terminalNo;
/**
* 商户名称
*/
@Condition(name = "name",type = Condition.ConditionType.like)
@Condition(name = "store_name",type = Condition.ConditionType.like, tableName = "isr")
@Size(max = 128, message = "商户名称不能超过128个字符")
private String name;
private String storeName;
/**
* 处理时间
*/
@Condition(name = "dispose_time", type = Condition.ConditionType.between)
@Condition(name = "dispose_time", type = Condition.ConditionType.between, tableName = "i")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATETIME_PATTERN)
private List<LocalDateTime> disposeTime;
/**
* 工单状态
*/
@Condition(name = "state", type = Condition.ConditionType.in)
@Condition(name = "wrk_status", type = Condition.ConditionType.in, tableName = "i")
@Null(message = "内部参数,不允许访问")
private List<Integer> states;
/**
* 下级任务id
*/
@Condition(name = "lower_task_id", type = Condition.ConditionType.in)
@Condition(name = "lower_task_id", type = Condition.ConditionType.in, tableName = "i")
private List<Long> lowerTaskIds;
}

View File

@ -0,0 +1,109 @@
package com.chushang.inspection.work.vo;
import com.chushang.common.dict.annotation.DictFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WrkAuditVO {
/**
* id
*/
private Long wrkId;
/**
* 工单编号
*/
private String workNo;
/**
* 商户编号
*/
private String storeNo;
/**
* 商户名称
*/
private String storeName;
/**
* 业务员名称
*/
private String userName;
/**
* 终端编号
*/
private String terminalNo;
/**
* 终端SN号
*/
private String terminalSn;
/**
* 工单类型
*/
@DictFormat(dictType = "wrk_type")
private Integer workType;
/**
* 巡检频次
*/
@DictFormat(dictType = "ins_fre")
private Integer insFre;
/**
* 审核状态
*/
@DictFormat(dictType = "wrk_status")
private Integer state;
/**
* 顶级任务名称
*/
private String taskName;
/**
* 下级任务名称
*/
private String lowerTaskName;
/**
* 地理位置信息 经度纬度
*/
private String geographicLocation;
/**
* 地理位置信息地址
*/
private String locationAddress;
/**
* 偏差
*/
private Long deviation;
/**
* 处理时间
*/
private LocalDateTime disposeTime;
/**
* 创建者
*/
protected String createBy;
/**
* 创建日期
*/
protected LocalDateTime createTime;
}

View File

@ -0,0 +1,94 @@
package com.chushang.inspection.work.vo;
import com.chushang.common.dict.annotation.DictFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WrkDispatchVO implements Serializable {
/**
* wrkId
*/
private Long wrkId;
/**
* 业务员名称
*/
private String userName;
/**
* 业务员名称
*/
private Long userId;
/**
* 部门id
*/
private Long deptId;
/**
* 所属部门
*/
private String deptName;
private Long storeId;
/**
* 商户名称
*/
private String storeName;
/**
* 商户编号
*/
private String storeNo;
/**
* 终端编号
*/
private String terminalNo;
private String terminalSn;
@DictFormat(dictType = "terminal_type")
private Integer terminalType;
/**
* 终端型号
*/
private String terminalModel;
private Long terminalId;
/**
* 工单类型
*/
@DictFormat(dictType = "wrk_type")
private Integer workType;
/**
* 工单编号
*/
private String workNo;
/**
* 工单优先级
*/
@DictFormat(dictType = "wrk_priority")
private Integer workSort;
/**
* 备注
*/
private String remark;
/**
* 截至时间
*/
private LocalDateTime endTime;
/**
* 派单时间
*/
private LocalDateTime createTime;
/**
* 派单人
*/
private String createBy;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,12 @@
package com.chushang.inspection.work.controller;
import org.springframework.web.bind.annotation.*;
/**
* 工单审核表(wrk_info_audit)表控制层
*
* @author xxxxx
*/
@RestController
@RequestMapping("/wrk_info_audit")
public class WrkInfoAuditController {
}

View File

@ -1,12 +1,62 @@
package com.chushang.inspection.work.controller;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.lang.Assert;
import com.chushang.common.core.web.AjaxResult;
import com.chushang.common.log.annotation.SysLog;
import com.chushang.common.log.enums.BusinessType;
import com.chushang.inspection.utils.TaskConfigUtils;
import com.chushang.inspection.work.query.ReviewedQuery;
import com.chushang.inspection.work.query.WrkInfoQuery;
import com.chushang.inspection.work.service.WrkInfoService;
import com.chushang.security.annotation.RequiresPermissions;
import com.google.common.collect.Lists;
import lombok.extern.java.Log;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* 工单信息(wrk_info)表控制层
*
* @author xxxxx
*/
@RestController
@RequestMapping("/wrk_info")
@RequestMapping("/wrk/info")
public class WrkInfoController {
@Resource
WrkInfoService wrkInfoService;
/**
* 查询派单/领取列表
*/
@SysLog(value = "派单/领取列表", businessType = BusinessType.QUERY)
@GetMapping("/dispatch/page")
// @RequiresPermissions("wrk:dispatch:page")
public AjaxResult queryDispatchPage(@Validated WrkInfoQuery query) {
query.setStates(Lists.newArrayList(1, 5, 6, 7));
return AjaxResult.success(wrkInfoService.queryDispatchPage(query));
}
/**
* 查询待审核列表
*
* @param query 条件
*/
@SysLog(value = "待审核列表", businessType = BusinessType.QUERY)
@GetMapping("/review/page")
@RequiresPermissions("wrk:reviewed:page")
public AjaxResult queryToDeReviewedPage(@Validated ReviewedQuery query) {
Integer reviewMethod = TaskConfigUtils.reviewMethod(query.getTaskId());
Assert.isTrue(reviewMethod != 1, "审核方式为无需审核,无法进入次页面");
List<Integer> status = ListUtil.toList(2, 5);
if (reviewMethod == 3) {
status.add(3);
status.add(6);
}
query.setStates(status);
return AjaxResult.success(wrkInfoService.queryArchivePage(query));
}
}

View File

@ -52,11 +52,11 @@ public class WrkInfoPhoneController {
@SysLog(value = "电话工单save",businessType = BusinessType.IMPORT)
@PostMapping(value = "/import/save")
@RequiresPermissions("wrk:phone:import")
public AjaxResult importSave(@RequestBody List<WrkInfoPhoneImportDTO> importReadList,
public AjaxResult importSave(@RequestBody List<WrkInfoPhoneImportDTO> dataList,
@RequestParam("taskId") Long taskId,
@RequestParam("lowerTaskId") Long lowerTaskId)
{
return infoPhoneService.importSave(importReadList, taskId, lowerTaskId);
return infoPhoneService.importSave(dataList, taskId, lowerTaskId);
}
/**
@ -86,7 +86,6 @@ public class WrkInfoPhoneController {
}
/**
* todo
* 单条删除
*/
@SysLog(value = "电话工单", businessType = BusinessType.DELETE)

View File

@ -0,0 +1,11 @@
package com.chushang.inspection.work.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.chushang.inspection.work.po.WrkInfoAudit;
/**
* @auther: zhao
* @date: 2024/6/27 18:13
*/
public interface WrkInfoAuditMapper extends BaseMapper<WrkInfoAudit> {
}

View File

@ -1,11 +1,24 @@
package com.chushang.inspection.work.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chushang.inspection.work.po.WrkInfo;
import com.chushang.inspection.work.query.ReviewedQuery;
import com.chushang.inspection.work.query.WrkInfoQuery;
import com.chushang.inspection.work.vo.WrkAuditVO;
import com.chushang.inspection.work.vo.WrkDispatchVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @auther: zhao
* @date: 2024/6/26 17:13
*/
public interface WrkInfoMapper extends BaseMapper<WrkInfo> {
List<WrkDispatchVO> queryDispatchPage(@Param("query") WrkInfoQuery query,
Page<WrkDispatchVO> page);
List<WrkAuditVO> queryArchivePage(ReviewedQuery query, Page<WrkAuditVO> page);
}

View File

@ -0,0 +1,12 @@
package com.chushang.inspection.work.service;
import com.chushang.inspection.work.po.WrkInfoAudit;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @auther: zhao
* @date: 2024/6/27 18:13
*/
public interface WrkInfoAuditService extends IService<WrkInfoAudit>{
}

View File

@ -1,12 +1,19 @@
package com.chushang.inspection.work.service;
import com.chushang.common.mybatis.utils.PageResult;
import com.chushang.inspection.work.po.WrkInfo;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @auther: zhao
* @date: 2024/6/26 17:13
*/
public interface WrkInfoService extends IService<WrkInfo>{
import com.chushang.inspection.work.query.ReviewedQuery;
import com.chushang.inspection.work.query.WrkInfoQuery;
/**
* @auther: zhao
* @date: 2024/6/26 17:13
*/
public interface WrkInfoService extends IService<WrkInfo> {
PageResult queryDispatchPage(WrkInfoQuery query);
PageResult queryArchivePage(ReviewedQuery query);
}

View File

@ -0,0 +1,16 @@
package com.chushang.inspection.work.service.impl;
import com.chushang.inspection.work.service.WrkInfoAuditService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.chushang.inspection.work.mapper.WrkInfoAuditMapper;
import com.chushang.inspection.work.po.WrkInfoAudit;
/**
* @auther: zhao
* @date: 2024/6/27 18:13
*/
@Service
public class WrkInfoAuditServiceImpl extends ServiceImpl<WrkInfoAuditMapper, WrkInfoAudit> implements WrkInfoAuditService {
}

View File

@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.chushang.common.core.constant.SecurityConstants;
import com.chushang.common.core.context.SecurityContextHolder;
import com.chushang.common.core.exception.ResultException;
import com.chushang.common.core.exception.utils.AssertUtil;
import com.chushang.common.core.text.Convert;
import com.chushang.common.core.util.StringUtils;
import com.chushang.common.core.web.AjaxResult;
@ -120,13 +121,119 @@ public class WrkInfoPhoneServiceImpl extends ServiceImpl<WrkInfoPhoneMapper, Wrk
* 单条录入
*/
@Override
@Transactional
public Long saveInfo(WrkInfoPhoneImportDTO info, Long taskId, Long lowerTaskId) {
return 1L;
Result<Map<String, Long>> result = remoteUserService.getIdByUsernames(Set.of(info.getUserName()), SecurityConstants.INNER);
AssertUtil.invalidate(!result.isSuccess() || CollectionUtil.isEmpty(result.getData()), "没有获取到业务员信息");
Map<String, Long> idByUsernames = result.getData();
PollingTask pollingTask = pollingTaskService.getById(taskId);
PollingTask lowerTask = pollingTaskService.getById(lowerTaskId);
AssertUtil.invalidate(ObjectUtil.isEmpty(pollingTask) || ObjectUtil.isEmpty(lowerTask), "没有获取到巡检任务信息");
WrkInfoPhone wrkInfoPhone = convert(info, idByUsernames);
wrkInfoPhone.setTaskId(taskId);
wrkInfoPhone.setTaskName(pollingTask.getName());
wrkInfoPhone.setLowerTaskId(lowerTaskId);
wrkInfoPhone.setLowerTaskName(lowerTask.getName());
String terminalNo = info.getTerminalNo();
String storeNo = info.getStoreNo();
String storeName = info.getStoreName();
if (StringUtils.isNotEmpty(storeNo) && StringUtils.isNotEmpty(storeName)) {
// 去获取唯一的 store 集合
List<Store> list = storeService.list(
new LambdaQueryWrapper<Store>()
.eq(Store::getStoreNo, storeNo)
.eq(Store::getStoreName, storeName));
// 不为空时走下一步
if (CollectionUtil.isNotEmpty(list)) {
if (list.size() > 1) {
AssertUtil.invalidate(true, "商户编号:" + storeNo + ",商户名称:" + storeName + "重复");
} else {
Store storeEntity = list.get(0);
assert null != storeEntity;
// 获取 到了 商户编号, 商户id, 商户名称
wrkInfoPhone.setStoreId(storeEntity.getStoreId());
wrkInfoPhone.setStoreNo(storeEntity.getStoreNo());
wrkInfoPhone.setStoreName(storeEntity.getStoreName());
}
}
}
// 终端不为空
if (StringUtils.isNotEmpty(terminalNo)) {
List<Terminal> list = terminalService.list(
new LambdaQueryWrapper<Terminal>()
.eq(Terminal::getTerminalNo, terminalNo)
.eq(Terminal::getStoreNo, storeNo));
if (CollectionUtil.isNotEmpty(list)) {
if (list.size() > 1) {
AssertUtil.invalidate(true, "商户编号:" + storeNo + ",商户名称:" + storeName + "终端编号:" + terminalNo + " 重复");
} else {
Terminal terminal = list.get(0);
assert null != terminal;
wrkInfoPhone.setTerminalType(terminal.getTerminalType());
wrkInfoPhone.setTerminalNo(terminal.getTerminalNo());
wrkInfoPhone.setTerminalId(terminal.getTerminalId());
}
}
// 去获取唯一的 store 集合
}
save(wrkInfoPhone);
return wrkInfoPhone.getWrkId();
}
@Override
public Long updateInfo(WrkInfoPhoneImportDTO info, Long wrkId) {
return 0L;
Result<Map<String, Long>> result = remoteUserService.getIdByUsernames(Set.of(info.getUserName()), SecurityConstants.INNER);
AssertUtil.invalidate(!result.isSuccess() || CollectionUtil.isEmpty(result.getData()), "没有获取到业务员信息");
Map<String, Long> idByUsernames = result.getData();
WrkInfoPhone wrkInfoPhone = convert(info, idByUsernames);
wrkInfoPhone.setWrkId(wrkId);
String terminalNo = info.getTerminalNo();
String storeNo = info.getStoreNo();
String storeName = info.getStoreName();
if (StringUtils.isNotEmpty(storeNo) && StringUtils.isNotEmpty(storeName)) {
// 去获取唯一的 store 集合
List<Store> list = storeService.list(
new LambdaQueryWrapper<Store>()
.eq(Store::getStoreNo, storeNo)
.eq(Store::getStoreName, storeName));
// 不为空时走下一步
if (CollectionUtil.isNotEmpty(list)) {
if (list.size() > 1) {
AssertUtil.invalidate(true, "商户编号:" + storeNo + ",商户名称:" + storeName + "重复");
} else {
Store storeEntity = list.get(0);
assert null != storeEntity;
// 获取 到了 商户编号, 商户id, 商户名称
wrkInfoPhone.setStoreId(storeEntity.getStoreId());
wrkInfoPhone.setStoreNo(storeEntity.getStoreNo());
wrkInfoPhone.setStoreName(storeEntity.getStoreName());
}
}
}
// 终端不为空
if (StringUtils.isNotEmpty(terminalNo)) {
List<Terminal> list = terminalService.list(
new LambdaQueryWrapper<Terminal>()
.eq(Terminal::getTerminalNo, terminalNo)
.eq(Terminal::getStoreNo, storeNo));
if (CollectionUtil.isNotEmpty(list)) {
if (list.size() > 1) {
AssertUtil.invalidate(true, "商户编号:" + storeNo + ",商户名称:" + storeName + "终端编号:" + terminalNo + " 重复");
} else {
Terminal terminal = list.get(0);
assert null != terminal;
wrkInfoPhone.setTerminalType(terminal.getTerminalType());
wrkInfoPhone.setTerminalNo(terminal.getTerminalNo());
wrkInfoPhone.setTerminalId(terminal.getTerminalId());
}
}
// 去获取唯一的 store 集合
}
updateById(wrkInfoPhone);
return wrkId;
}
/**
@ -210,7 +317,6 @@ public class WrkInfoPhoneServiceImpl extends ServiceImpl<WrkInfoPhoneMapper, Wrk
}
// 去获取唯一的 store 集合
}
successList.add(wrkInfoPhone);
}
}

View File

@ -1,16 +1,51 @@
package com.chushang.inspection.work.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chushang.common.mybatis.page.CommonParam;
import com.chushang.common.mybatis.utils.PageResult;
import com.chushang.common.mybatis.utils.WrapperUtils;
import com.chushang.datascope.annotation.DataScope;
import com.chushang.inspection.work.query.ReviewedQuery;
import com.chushang.inspection.work.query.WrkInfoQuery;
import com.chushang.inspection.work.service.WrkInfoService;
import com.chushang.inspection.work.vo.WrkAuditVO;
import com.chushang.inspection.work.vo.WrkDispatchVO;
import com.chushang.system.feign.RemoteUserService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.chushang.inspection.work.mapper.WrkInfoMapper;
import com.chushang.inspection.work.po.WrkInfo;
import javax.annotation.Resource;
import java.util.List;
/**
* @auther: zhao
* @date: 2024/6/26 17:13
*/
@Service
public class WrkInfoServiceImpl extends ServiceImpl<WrkInfoMapper, WrkInfo> implements WrkInfoService {
@Resource
RemoteUserService remoteUserService;
@Override
@DataScope(deptAlias = "i")
public PageResult queryDispatchPage(WrkInfoQuery query) {
CommonParam commonParam = CommonParam.buildPageRequest();
WrapperUtils.buildSql(query);
Page<WrkDispatchVO> page = new Page<>(commonParam.getPage(), commonParam.getLimit());
List<WrkDispatchVO> records = baseMapper.queryDispatchPage(query, page);
return new PageResult(records, page);
}
@Override
@DataScope(deptAlias = "i")
public PageResult queryArchivePage(ReviewedQuery query) {
CommonParam commonParam = CommonParam.buildPageRequest();
WrapperUtils.buildSql(query);
Page<WrkAuditVO> page = new Page<>(commonParam.getPage(), commonParam.getLimit());
List<WrkAuditVO> records = baseMapper.queryArchivePage(query, page);
return new PageResult(records, page);
}
}

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chushang.inspection.work.mapper.WrkInfoAuditMapper">
<resultMap id="BaseResultMap" type="com.chushang.inspection.work.po.WrkInfoAudit">
<!--@mbg.generated-->
<!--@Table wrk_info_audit-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="wrk_id" jdbcType="BIGINT" property="wrkId" />
<result column="user_id" jdbcType="BIGINT" property="userId" />
<result column="user_name" jdbcType="VARCHAR" property="userName" />
<result column="audit_time" jdbcType="TIMESTAMP" property="auditTime" />
<result column="audit_state" jdbcType="TINYINT" property="auditState" />
<result column="remark" jdbcType="VARCHAR" property="remark" />
<result column="is_record" jdbcType="TINYINT" property="isRecord" />
<result column="dept_id" jdbcType="BIGINT" property="deptId" />
<result column="version" jdbcType="BIGINT" property="version" />
<result column="del_state" jdbcType="BOOLEAN" property="delState" />
<result column="create_by" jdbcType="VARCHAR" property="createBy" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_by" jdbcType="VARCHAR" property="updateBy" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, wrk_id, user_id, user_name, audit_time, audit_state, remark, is_record, dept_id,
version, del_state, create_by, create_time, update_by, update_time
</sql>
</mapper>

View File

@ -1,43 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chushang.inspection.work.mapper.WrkInfoMapper">
<resultMap id="BaseResultMap" type="com.chushang.inspection.work.po.WrkInfo">
<!--@mbg.generated-->
<!--@Table wrk_info-->
<id column="wrk_id" jdbcType="BIGINT" property="wrkId" />
<result column="dept_id" jdbcType="BIGINT" property="deptId" />
<result column="store_id" jdbcType="BIGINT" property="storeId" />
<result column="terminal_id" jdbcType="BIGINT" property="terminalId" />
<result column="task_id" jdbcType="BIGINT" property="taskId" />
<result column="lower_task_id" jdbcType="BIGINT" property="lowerTaskId" />
<result column="terminal_records_id" jdbcType="BIGINT" property="terminalRecordsId" />
<result column="user_id" jdbcType="BIGINT" property="userId" />
<result column="user_name" jdbcType="VARCHAR" property="userName" />
<result column="work_no" jdbcType="BIGINT" property="workNo" />
<result column="work_type" jdbcType="SMALLINT" property="workType" />
<result column="work_method" jdbcType="SMALLINT" property="workMethod" />
<result column="work_sort" jdbcType="TINYINT" property="workSort" />
<result column="work_source" jdbcType="SMALLINT" property="workSource" />
<result column="dispose_time" jdbcType="TIMESTAMP" property="disposeTime" />
<result column="account_manager" jdbcType="VARCHAR" property="accountManager" />
<result column="account_phone" jdbcType="VARCHAR" property="accountPhone" />
<result column="terminal_status" jdbcType="TINYINT" property="terminalStatus" />
<result column="service_result" jdbcType="SMALLINT" property="serviceResult" />
<result column="remark" jdbcType="VARCHAR" property="remark" />
<result column="state" jdbcType="SMALLINT" property="state" />
<result column="end_time" jdbcType="TIMESTAMP" property="endTime" />
<result column="version" jdbcType="BIGINT" property="version" />
<result column="del_state" jdbcType="BOOLEAN" property="delState" />
<result column="create_by" jdbcType="VARCHAR" property="createBy" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_by" jdbcType="VARCHAR" property="updateBy" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
wrk_id, dept_id, store_id, terminal_id, task_id, lower_task_id, terminal_records_id,
user_id, user_name, work_no, work_type, work_method, work_sort, work_source, dispose_time,
account_manager, account_phone, terminal_status, service_result, remark, `state`,
end_time, version, del_state, create_by, create_time, update_by, update_time
</sql>
<select id="queryDispatchPage" resultType="com.chushang.inspection.work.vo.WrkDispatchVO">
SELECT i.wrk_id AS wrkId,
i.user_name AS userName,
i.user_id AS userId,
i.dept_id AS deptId,
i.dept_name AS deptName,
i.work_type AS workType,
i.work_no AS workNo,
i.work_sort AS workSort,
i.remark AS remark,
i.end_time AS endTime,
i.create_time AS createTime,
i.create_by AS createBy,
isr.store_id AS storeId,
isr.store_no AS storeName,
isr.store_name AS storeNo,
itr.terminal_id AS terminalId,
itr.terminal_no AS terminalNo,
itr.terminal_sn AS terminalSn,
itr.terminal_type AS terminalType,
itr.terminal_model AS terminalModel
FROM `wrk_info` i
INNER JOIN wrk_info_store_record isr ON i.wrk_id = isr.wrk_id
INNER JOIN wrk_info_terminal_record itr ON i.wrk_id = itr.wrk_id
<where>
<if test="1==1">
${query.sqlParam.get('sqlWhere')}
</if>
</where>
ORDER BY i.create_time desc
</select>
<select id="queryArchivePage" resultType="com.chushang.inspection.work.vo.WrkAuditVO">
SELECT i.wrk_id,
i.work_no,
isr.store_no,
isr.store_id,
i.user_id,
i.user_name,
itr.terminal_id,
itr.terminal_no,
i.work_type,
isr.ins_fre,
i.wrk_status,
isr.geographic_location,
isr.location_address,
isr.deviation,
i.dispose_time,
i.create_by,
i.create_time,
i.task_id,
i.task_name,
i.lower_task_id,
i.lower_task_name
FROM wrk_info i
INNER JOIN wrk_info_store_record isr ON i.wrk_id = isr.wrk_id
INNER JOIN wrk_info_terminal_record itr ON i.wrk_id = itr.wrk_id
ORDER BY i.create_time desc
</select>
</mapper>