feat(dispatch): 优化派工单功能并完善相关数据结构

- 在派工单创建时新增自动生成编码,保持编码格式7位数字且递增
- 增加派工单延期审批逻辑,防止已完成的派工单延期
- 更新派工单延期处理,完善计划开始和结束时间的设置及状态判定
- 在派工单实体及VO中新增编码字段,丰富数据内容
- 修改工单相关SQL查询,调整表连接及字段映射,增加相关信息查询
- 更新工单消息推送逻辑,支持基于工单视图对象的推送
- 增加TicketService接口新方法,支持通过视图对象获取工单详情
- 修改用户和客户相关逻辑,新增客户名称字段及区域权限判断改进
- 支持查询时按是否工服工单处理人筛选账户,提高查询灵活性
- 修改文件相关请求及响应对象,调整关联ID数据类型为Long
- 重构相关Mapper XML文件,统一工单关注表名及字段,优化查询效率
- 其他小范围代码和注释优化,提升代码整洁及可维护性
This commit is contained in:
曹鹏飞 2025-11-26 18:03:19 +08:00
parent 27c345fdfc
commit ced5b87a67
34 changed files with 239 additions and 168 deletions

View File

@ -179,7 +179,7 @@ public class FileController extends ControllerBase {
*/
@PostMapping("deleteFile")
@ApiMark(moduleName = "文件管理", apiName = "删除文件")
public ApiResult<Void> deleteFile(@Valid @RequestBody @NotEmpty List<Integer> ids) {
public ApiResult<Void> deleteFile(@Valid @RequestBody @NotEmpty List<Long> ids) {
fileUploadRecordService.removeBatchByIds(ids);
return ApiResult.success();
}

View File

@ -90,10 +90,7 @@ public class PositionController extends ControllerBase {
}
}
result.setLanguage(positionLanguageResult);
result.setTicketManage(ent.getTicketManage());
return ApiResult.success(result);
}
/**

View File

@ -40,10 +40,6 @@ public class PositionDetailDTO {
*/
private Boolean gongFuTicketManage;
/**
* 职位语言
*/

View File

@ -33,6 +33,11 @@ public class PositionDetailVO {
*/
private Boolean ticketManage;
/**
* 是否授予工服工单权限
*/
private Boolean gongFuTicketManage;
/**
* 创建人-账号
*/

View File

@ -109,6 +109,9 @@ public class TicketController extends ControllerBase {
@Resource
private ITicketSolutionAuditService ticketSolutionAuditService;
@Resource
private ITBaseAreaService baseAreaService;
/**
* 搜索设备
* @param request 搜索条件
@ -236,15 +239,24 @@ public class TicketController extends ControllerBase {
AppUser user = appUserService.getById(ticket.getUserId());
userName = user.getName();
userAvatar = user.getAvatar();
if (user.getIsPrimary()) {
areaName = StrUtil.join(",", customerService.getAreas(Arrays.stream(user.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList())));
} else if (Objects.nonNull(user.getAreaId())) {
AppArea area = appAreaService.getById(user.getAreaId());
if (Objects.nonNull(area)) {
areaName = area.getName();
if (user.getType() == 0) {
if (user.getIsPrimary()) {
areaName = StrUtil.join(",", customerService.getAreas(Arrays.stream(user.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList())));
} else if (Objects.nonNull(user.getAreaId())) {
AppArea area = appAreaService.getById(user.getAreaId());
if (Objects.nonNull(area)) {
areaName = area.getName();
}
}
companys = customerService.listByIds(Arrays.stream(user.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList()));
} else if (user.getType() == 1) {
if (Objects.nonNull(user.getAreaId())) {
TBaseArea area = baseAreaService.getById(user.getAreaId());
if (Objects.nonNull(area)) {
areaName = area.getAreaName();
}
}
}
companys = customerService.listByIds(Arrays.stream(user.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList()));
} else {
AdminUser adminUser = adminUserService.getById(ticket.getUserId());
userName = adminUser.getUserName();
@ -388,7 +400,7 @@ public class TicketController extends ControllerBase {
**/
@PostMapping("addChatMessage")
public ApiResult<Void> addChatMessage(@Valid @RequestBody AddChatMessageRequest request) {
Ticket ticket = ticketService.getById(request.getTicketId());
TicketVO ticket = ticketService.getFromView(request.getTicketId());
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在");
VUtils.trueThrowBusinessError(Byte.compare(ticket.getState(), TicketState.Processing.getState()) > 1)
.throwMessage("当前工单状态不允许发送消息");
@ -417,7 +429,7 @@ public class TicketController extends ControllerBase {
}
ticketChatService.addMessage(request.getTicketId(), message);
//推送消息
ssePushService.sendTicketMessageToAdmin(Long.valueOf(ticket.getId()), message);
ssePushService.sendTicketMessageToAdmin(ticket.getId(), message);
ticketEventPublisher.publishTicketReplyEvent(ticket, MultilingualUtil.getLanguage(), MultilingualUtil.getZone());
return ApiResult.success();
}

View File

@ -6,10 +6,10 @@ import cn.hutool.core.util.StrUtil;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.common.constant.MessageSubType;
import com.nflg.mobilebroken.common.constant.MessageType;
import com.nflg.mobilebroken.common.pojo.vo.TicketVO;
import com.nflg.mobilebroken.repository.entity.AdminMessage;
import com.nflg.mobilebroken.repository.entity.AdminUser;
import com.nflg.mobilebroken.repository.entity.AppUser;
import com.nflg.mobilebroken.repository.entity.Ticket;
import com.nflg.mobilebroken.repository.service.IAdminMessageService;
import com.nflg.mobilebroken.repository.service.IAdminUserService;
import com.nflg.mobilebroken.repository.service.IAppUserService;
@ -32,7 +32,7 @@ import java.util.stream.Collectors;
public class TicketReplyEvent extends ApplicationEvent implements ApplicationContextAware {
private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
private final Ticket ticket;
private final TicketVO ticket;
private final String language;
private final String zone;
private IDictionaryItemTranslateService dictionaryItemTranslateService;
@ -41,7 +41,7 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon
private IAdminUserService adminUserService;
private IAdminMessageService adminMessageService;
public TicketReplyEvent(Object source, Ticket ticket, String language, String zone) {
public TicketReplyEvent(Object source, TicketVO ticket, String language, String zone) {
super(source);
this.ticket = ticket;
this.language = language;
@ -73,7 +73,7 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon
.setNo(ticket.getNo())
.setTitle(ticket.getTitle())
.setUserId(c.getId())
.setSourceId(Long.valueOf(ticket.getId()))
.setSourceId(ticket.getId())
.setSource(0)
.setType(MessageType.WorkOrderAssignment.getState())
.setSubType(MessageSubType.TicketNewMessage.getState())

View File

@ -1,6 +1,7 @@
package com.nflg.mobilebroken.cfs.publisher;
import com.nflg.mobilebroken.cfs.event.*;
import com.nflg.mobilebroken.common.pojo.vo.TicketVO;
import com.nflg.mobilebroken.repository.entity.Ticket;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEventPublisher;
@ -23,7 +24,7 @@ public class TicketEventPublisher {
eventPublisher.publishEvent(event);
}
public void publishTicketReplyEvent(Ticket ticket, String language, String zone) {
public void publishTicketReplyEvent(TicketVO ticket, String language, String zone) {
TicketReplyEvent event = new TicketReplyEvent(this, ticket, language, zone);
event.setApplicationContext(applicationContext);
eventPublisher.publishEvent(event);

View File

@ -16,7 +16,7 @@ public class FileSearchRequest extends PageRequest {
private Integer source;
//文件来源id
private Integer sourceId;
private Long sourceId;
//文件类型
private String fileType;

View File

@ -6,7 +6,6 @@ import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.util.List;
@Data
@ -22,11 +21,9 @@ public class PrimaryAppUserAddRequest {
private String userName;
//公司id列表
@NotEmpty
private List<Integer> companyIds;
//销售人员姓名
@NotBlank
private String salesUserName;
//邮箱

View File

@ -18,4 +18,7 @@ public class SearchAccountRequest extends PageRequest {
// 状态
private Byte state;
// 是否是工服工单处理人
private Boolean gongfuHandler;
}

View File

@ -24,6 +24,9 @@ public class SolutionMeasuresSaveRequest {
@NotNull
private Byte accidentLevel;
//问题类型
private String question;
/**
* 根本原因
*/

View File

@ -14,5 +14,5 @@ public class ZipDownloadRequest {
* 文件id列表
*/
@NotEmpty
private List<Integer> fileIds;
private List<Long> fileIds;
}

View File

@ -111,6 +111,11 @@ public class AppUserForAdminVO {
*/
private Integer type;
/**
* 客户名称仅终端用户使用
*/
private String customerName;
//下级账号
private List<AppUserForAdminVO> children=new ArrayList<>();

View File

@ -13,6 +13,11 @@ public class DispatchVO {
private Long id;
/**
* 编码
*/
private String code;
/**
* 个案编号
*/
@ -87,10 +92,10 @@ public class DispatchVO {
return DateUtil.betweenDay(DateUtil.parseDate(planStartDate), DateUtil.parseDate(planEndDate), true) + 1;
}
/**
* 延期结束日期
*/
private String delayEndDate;
// /**
// * 延期结束日期
// */
// private String delayEndDate;
/**
* 是否延期过

View File

@ -9,18 +9,26 @@ public class FileVO {
//关联
public byte source;
public String sourceDesc;
//关联ID
public String sourceId;
public Long sourceId;
//文件路径
public String url;
//上传时间
public LocalDateTime createTime;
//上传人
public String createBy;
private Integer id;
// 文件名
private String fileName;
// 文件类型
private String fileType;

View File

@ -60,4 +60,14 @@ public class TicketVO {
//是否已关注
private boolean followed;
/**
* 创建人id
*/
private Integer userId;
/**
* 用户来源平台app或者admin
*/
private String userPlatform;
}

View File

@ -5,7 +5,7 @@ import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.AnonymousTicketSearchRequest;
import com.nflg.mobilebroken.common.pojo.vo.AnonymousTicketInfoVO;
import com.nflg.mobilebroken.common.pojo.vo.AnonymousTicketSearchVO;
import com.nflg.mobilebroken.repository.service.IAnonymousTicketService;
import com.nflg.mobilebroken.repository.service.IGongfuAnonymousTicketService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@ -20,7 +20,7 @@ import javax.validation.constraints.NotNull;
public class AnonymousTicketController {
@Resource
private IAnonymousTicketService anonymousTicketService;
private IGongfuAnonymousTicketService anonymousTicketService;
/**
* 搜索匿名工单

View File

@ -80,12 +80,18 @@ public class DispatchController extends ControllerBase {
.setRemark(request.getRemark())
.setCreateById(AdminUserUtil.getUserId())
.setCreateBy(AdminUserUtil.getUserName())
.setCreateTime(LocalDateTime.now());
.setCreateTime(LocalDateTime.now())
.setCode(genCode(dispatchService.getMaxCode()));
dispatchService.save(dispatch);
dispatchEventPublisher.publishDispatchCreateEvent(dispatch);
return ApiResult.success();
}
private String genCode(String code) {
int index = Integer.parseInt(code);
return String.format("%07d", index + 1);
}
/**
* 修改派工单
*/
@ -235,6 +241,7 @@ public class DispatchController extends ControllerBase {
VUtils.trueThrowBusinessError(!Objects.equals(applyfor.getAuditState(), 0)).throwMessage("已经审核过了");
GongfuDispatch dispatch = dispatchService.getById(applyfor.getTicketId());
VUtils.trueThrowBusinessError(Objects.isNull(dispatch)).throwMessage("派工单不存在");
VUtils.trueThrowBusinessError(dispatch.getState() == 2).throwMessage("派工单已完成不能延期");
VUtils.trueThrowBusinessError(!Objects.equals(dispatch.getCreateById(), AdminUserUtil.getUserId()))
.throwMessage("你不是派工单创建人,无法审核延期申请");
applyfor.setAuditState(request.getPass() ? 1 : 2);
@ -243,8 +250,11 @@ public class DispatchController extends ControllerBase {
applyfor.setAuditMsg(request.getReason());
dispatchApplyforService.updateById(applyfor);
if (request.getPass()) {
dispatch.setDelayEndDate(applyfor.getEndDate());
dispatch.setPlanStartDate(applyfor.getStartDate());
dispatch.setPlanEndDate(applyfor.getEndDate());
dispatch.setIsDelay(true);
String now = DateTimeUtil.format(LocalDate.now(), "yyyy-MM-dd");
dispatch.setState(dispatch.getPlanStartDate().compareTo(now) >= 0 ? 1 : 0);
dispatchService.updateById(dispatch);
}
adminMessageService.add(

View File

@ -1,33 +0,0 @@
package com.nflg.mobilebroken.gongfu.controller;
import com.nflg.mobilebroken.gongfu.service.ITranslate;
import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.pojo.request.TranslateWordRequest;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.Valid;
/**
* 翻译相关
*/
@RestController
@RequestMapping("/translate")
public class TranslateController extends ControllerBase {
@Resource
private ITranslate translate;
/**
* 文字翻译
* @param request 请求参数
* @return 翻译结果
*/
@PostMapping("word")
public ApiResult<String> translateWord(@Valid @RequestBody TranslateWordRequest request) {
return ApiResult.success(translate.translateWord(request.getText(), "auto", request.getTargetLanguage(), "html"));
}
}

View File

@ -0,0 +1,9 @@
import org.junit.jupiter.api.Test;
public class NTest {
@Test
public void test1() {
System.out.println(String.format("%07d", Integer.parseInt("0000001") + 1));
}
}

View File

@ -25,6 +25,11 @@ public class GongfuDispatch implements Serializable {
private Long id;
/**
* 编码
*/
private String code;
/**
* 名称
*/
@ -70,10 +75,10 @@ public class GongfuDispatch implements Serializable {
*/
private String planEndDate;
/**
* 延期结束日期
*/
private String delayEndDate;
// /**
// * 延期结束日期
// */
// private String delayEndDate;
/**
* 地址

View File

@ -44,4 +44,6 @@ public interface TicketMapper extends BaseMapper<Ticket> {
IPage<AdminTicketVO> searchByFavouritesId(Integer userId, Integer favouritesId, Page<?> page);
TicketDTO getDto(Long id);
TicketVO getById(Long id);
}

View File

@ -18,4 +18,6 @@ public interface IGongfuDispatchService extends IService<GongfuDispatch> {
IPage<DispatchVO> search(DispatchSearchRequest request);
DispatchVO getInfo(Long id);
String getMaxCode();
}

View File

@ -59,4 +59,6 @@ public interface ITicketService extends IService<Ticket> {
boolean close(Ticket ticket);
TicketDTO getDto(Long id);
TicketVO getFromView(Long ticketId);
}

View File

@ -136,6 +136,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
.eq(AdminUser::getIsDel, false)
.eq(Objects.nonNull(request.getState()), AdminUser::getState, request.getState())
.eq(Objects.nonNull(request.getDepartmentId()), AdminUser::getDepartmentId, request.getDepartmentId())
.eq(Objects.nonNull(request.getGongfuHandler()), AdminUser::isGongFuHandler, request.getGongfuHandler())
.like(StrUtil.isNotBlank(request.getLoginName()), AdminUser::getLoginName, request.getLoginName())
.like(StrUtil.isNotBlank(request.getUserName()), AdminUser::getUserName, request.getUserName())
.orderByAsc(AdminUser::getState)

View File

@ -276,17 +276,20 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
return vos;
} else {
AppUser user = getById(userId);
if (user.getIsPrimary()) {
List<TBaseArea> datas = adminAreaService.lambdaQuery().eq(TBaseArea::getAreaState, 1).eq(TBaseArea::getParentAreaRowId, 0).list();
List<AreaSimpleVO> vos = datas.stream().map(d -> new AreaSimpleVO().setId(d.getId()).setName(d.getAreaName())).collect(Collectors.toList());
vos.forEach(this::bindChildren);
return vos;
} else {
List<AppArea> datas = appAreaService.lambdaQuery().eq(AppArea::getEnable, true).eq(AppArea::getParentId, 0).list();
List<AreaSimpleVO> vos = datas.stream().map(d -> new AreaSimpleVO().setId(d.getId()).setName(d.getName())).collect(Collectors.toList());
vos.forEach(this::bindChildren1);
return vos;
if (user.getType() == 0) {
if (user.getIsPrimary()) {
List<TBaseArea> datas = adminAreaService.lambdaQuery().eq(TBaseArea::getAreaState, 1).eq(TBaseArea::getParentAreaRowId, 0).list();
List<AreaSimpleVO> vos = datas.stream().map(d -> new AreaSimpleVO().setId(d.getId()).setName(d.getAreaName())).collect(Collectors.toList());
vos.forEach(this::bindChildren);
return vos;
} else {
List<AppArea> datas = appAreaService.lambdaQuery().eq(AppArea::getEnable, true).eq(AppArea::getParentId, 0).list();
List<AreaSimpleVO> vos = datas.stream().map(d -> new AreaSimpleVO().setId(d.getId()).setName(d.getName())).collect(Collectors.toList());
vos.forEach(this::bindChildren1);
return vos;
}
}
return Collections.emptyList();
}
}

View File

@ -10,6 +10,8 @@ import com.nflg.mobilebroken.repository.mapper.GongfuDispatchMapper;
import com.nflg.mobilebroken.repository.service.IGongfuDispatchService;
import org.springframework.stereotype.Service;
import java.util.Objects;
/**
* <p>
* 派工单 服务实现类
@ -29,4 +31,14 @@ public class GongfuDispatchServiceImpl extends ServiceImpl<GongfuDispatchMapper,
public DispatchVO getInfo(Long id) {
return baseMapper.getInfo(id);
}
@Override
public String getMaxCode() {
GongfuDispatch dispatch = lambdaQuery().orderByDesc(GongfuDispatch::getId).last("limit 1").one();
if (Objects.isNull(dispatch)) {
return "1";
} else {
return dispatch.getCode();
}
}
}

View File

@ -15,6 +15,7 @@ import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
@ -24,7 +25,6 @@ import java.util.stream.Collectors;
* <p>
* 客户管理 服务实现类
* </p>
*
* @author 代码生成器生成
* @since 2025
*/
@ -34,13 +34,13 @@ public class TBaseCustomerServiceImpl extends ServiceImpl<TBaseCustomerMapper, T
@Resource
private IAppUserService appUserService;
public Page<TBaseCustomer> getList(@Param("page")Page<PageBaseQuery> page, @Param("query") PageBaseQuery query){
return this.getBaseMapper().getList(page, query);
}
public Page<TBaseCustomer> getList(@Param("page") Page<PageBaseQuery> page, @Param("query") PageBaseQuery query) {
return this.getBaseMapper().getList(page, query);
}
public void delByIds(@Param("ids") List<Long> ids ,@Param("userNo")String userNo , @Param("userName") String userName){
this.getBaseMapper().delByIds(ids,userNo,userName);
}
public void delByIds(@Param("ids") List<Long> ids, @Param("userNo") String userNo, @Param("userName") String userName) {
this.getBaseMapper().delByIds(ids, userNo, userName);
}
@Override
public List<CompanySimpleVO> getSimpleCompanys(Integer userId) {
@ -74,26 +74,28 @@ public class TBaseCustomerServiceImpl extends ServiceImpl<TBaseCustomerMapper, T
@Override
public List<CompanySimpleVO> getSimpleCompanysFromAdmin(Integer userId) {
List<TBaseCustomer> datas;
if (Objects.isNull(userId)){
List<TBaseCustomer> datas = new ArrayList<>();
if (Objects.isNull(userId)) {
datas = lambdaQuery()
.eq(TBaseCustomer::getEnableState, 1)
.eq(TBaseCustomer::getDelIs, 0)
.list();
}else {
} else {
AppUser appUser = appUserService.getById(userId);
VUtils.trueThrowBusinessError(Objects.isNull(appUser)).throwMessage("用户不存在");
if (appUser.getIsPrimary()){
datas = lambdaQuery()
.eq(TBaseCustomer::getEnableState, 1)
.eq(TBaseCustomer::getDelIs, 0)
.list();
}else {
datas = lambdaQuery()
.eq(TBaseCustomer::getEnableState, 1)
.eq(TBaseCustomer::getDelIs, 0)
.in(TBaseCustomer::getId, StrUtil.split(appUser.getCompanyId(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()))
.list();
if (appUser.getType() == 0) {
if (appUser.getIsPrimary()) {
datas = lambdaQuery()
.eq(TBaseCustomer::getEnableState, 1)
.eq(TBaseCustomer::getDelIs, 0)
.list();
} else {
datas = lambdaQuery()
.eq(TBaseCustomer::getEnableState, 1)
.eq(TBaseCustomer::getDelIs, 0)
.in(TBaseCustomer::getId, StrUtil.split(appUser.getCompanyId(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()))
.list();
}
}
}
return datas.stream()

View File

@ -365,7 +365,7 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
@Override
public List<AdminUserSimpleVO> getTicketHandle(Long id) {
Ticket ticket = lambdaQuery().select(Ticket::getHandle, Ticket::getId).eq(Ticket::getId, id).one();
TicketVO ticket = baseMapper.getById(id);
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("未找到工单");
List<Integer> handles = StrUtil.split(ticket.getHandle(), ",")
.stream()
@ -432,4 +432,9 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
public TicketDTO getDto(Long id) {
return baseMapper.getDto(id);
}
@Override
public TicketVO getFromView(Long ticketId) {
return baseMapper.getById(ticketId);
}
}

View File

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.common.constant.TicketState;
import com.nflg.mobilebroken.common.pojo.dto.TicketDTO;
import com.nflg.mobilebroken.common.pojo.request.SolutionMeasuresSaveRequest;
import com.nflg.mobilebroken.common.pojo.vo.SolutionMeasuresDataItemVO;
import com.nflg.mobilebroken.common.pojo.vo.SolutionMeasuresItemVO;
@ -28,7 +29,6 @@ import java.util.stream.Collectors;
* <p>
* 服务实现类
* </p>
*
* @author 代码生成器生成
* @since 2025
*/
@ -55,31 +55,33 @@ public class TicketSolutionServiceImpl extends ServiceImpl<TicketSolutionMapper,
@Override
public SolutionMeasuresVO getSolutionMeasures(Long ticketId) {
Ticket ticket = ticketService.getById(ticketId);
TicketDTO ticket = ticketService.getDto(ticketId);
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在");
List<DictionaryItem> initial= new ArrayList<>();
List<DictionaryItem> initial = new ArrayList<>();
if (Objects.equals(ticket.getState(), TicketState.Processing.getState()) || Objects.equals(ticket.getState(), TicketState.ProcessingCompleted.getState())) {
initial = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_SOLUTION_MEASURES,Constant.DEFAULT_LANGUAGE_CODE);
initial = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_SOLUTION_MEASURES, Constant.DEFAULT_LANGUAGE_CODE);
}
List<TicketSolution> solutions = lambdaQuery().eq(TicketSolution::getTicketId, ticketId).orderByAsc(TicketSolution::getId).list();
Map<String, List<TicketSolution>> groupedSolutions = solutions.stream().collect(Collectors.groupingBy(TicketSolution::getDictionaryItemName, LinkedHashMap::new, Collectors.toList()));
SolutionMeasuresVO vo=new SolutionMeasuresVO();
if (SaTokenAdminUtil.isLogin()) {
TicketSolutionAudit audit = ticketSolutionAuditService.getByTicketAndUser(Math.toIntExact(ticketId), AdminUserUtil.getUserId());
if (Objects.nonNull(audit)) {
vo.setInAudit(true);
vo.setApproved(Objects.isNull(audit.getState()) ? null : Objects.equals(audit.getState(), 1));
SolutionMeasuresVO vo = new SolutionMeasuresVO();
if (ticket.getType() == 0) {
if (SaTokenAdminUtil.isLogin()) {
TicketSolutionAudit audit = ticketSolutionAuditService.getByTicketAndUser(Math.toIntExact(ticketId), AdminUserUtil.getUserId());
if (Objects.nonNull(audit)) {
vo.setInAudit(true);
vo.setApproved(Objects.isNull(audit.getState()) ? null : Objects.equals(audit.getState(), 1));
}
}
}
List<SolutionMeasuresItemVO> items = new ArrayList<>();
if (CollectionUtil.isEmpty(groupedSolutions)) {
items= initial.stream().map(it -> new SolutionMeasuresItemVO()
items = initial.stream().map(it -> new SolutionMeasuresItemVO()
.setId(it.getId())
.setName(it.getName())
.setItems(Collections.emptyList()))
.collect(Collectors.toList());
} else if (CollectionUtil.isEmpty(initial)) {
items= groupedSolutions.entrySet().stream().map(ks -> new SolutionMeasuresItemVO()
items = groupedSolutions.entrySet().stream().map(ks -> new SolutionMeasuresItemVO()
.setName(ks.getKey())
.setItems(ks.getValue().stream().map(v -> new SolutionMeasuresDataItemVO()
.setId(Long.valueOf(v.getId()))
@ -91,7 +93,7 @@ public class TicketSolutionServiceImpl extends ServiceImpl<TicketSolutionMapper,
.setCreateUserId(v.getCreateUserId())).collect(Collectors.toList())
)).collect(Collectors.toList());
} else {
for (DictionaryItem it : initial){
for (DictionaryItem it : initial) {
List<TicketSolution> values = groupedSolutions.get(it.getName());
if (CollectionUtil.isEmpty(values)) {
items.add(new SolutionMeasuresItemVO().setId(it.getId()).setName(it.getName()).setItems(Collections.emptyList()));
@ -119,7 +121,7 @@ public class TicketSolutionServiceImpl extends ServiceImpl<TicketSolutionMapper,
@Transactional
@Override
public Ticket saveSolutionMeasures(SolutionMeasuresSaveRequest request) {
Ticket ticket=ticketService.getById(request.getTicketId());
Ticket ticket = ticketService.getById(request.getTicketId());
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在");
VUtils.trueThrowBusinessError(!Objects.equals(ticket.getState(), TicketState.Processing.getState())
&& !Objects.equals(ticket.getState(), TicketState.ProcessingCompleted.getState()))
@ -128,16 +130,16 @@ public class TicketSolutionServiceImpl extends ServiceImpl<TicketSolutionMapper,
&& !ticketSolutionAuditService.canUpdate(Math.toIntExact(request.getTicketId())))
.throwMessage("部门主管审核中,不允许修改解决方案");
Integer userId = AdminUserUtil.getUserId();
List<Integer> cqmIds=adminUserService.getCQMIds();
List<Integer> handleIds= StrUtil.split(ticket.getHandle(),",").stream().map(Integer::parseInt).collect(Collectors.toList());
List<Integer> cqmIds = adminUserService.getCQMIds();
List<Integer> handleIds = StrUtil.split(ticket.getHandle(), ",").stream().map(Integer::parseInt).collect(Collectors.toList());
VUtils.trueThrowBusinessError(cqmIds.stream().noneMatch(uid -> Objects.equals(uid, userId))
&& handleIds.stream().noneMatch(uid -> Objects.equals(uid, userId)))
.throwMessage("无权修改解决方案");
List<TicketSolution> forAdd=new ArrayList<>();
List<TicketSolution> forUpdate=new ArrayList<>();
&& handleIds.stream().noneMatch(uid -> Objects.equals(uid, userId)))
.throwMessage("无权修改解决方案");
List<TicketSolution> forAdd = new ArrayList<>();
List<TicketSolution> forUpdate = new ArrayList<>();
for (SolutionMeasuresItemVO solutionMeasuresItemVO : request.getSolutionMeasures()) {
for (SolutionMeasuresDataItemVO solutionMeasuresDataItemVO : solutionMeasuresItemVO.getItems()){
TicketSolution solution=new TicketSolution()
for (SolutionMeasuresDataItemVO solutionMeasuresDataItemVO : solutionMeasuresItemVO.getItems()) {
TicketSolution solution = new TicketSolution()
.setTicketId(request.getTicketId())
.setDictionaryItemId(solutionMeasuresItemVO.getId())
.setDictionaryItemName(solutionMeasuresItemVO.getName())
@ -170,6 +172,7 @@ public class TicketSolutionServiceImpl extends ServiceImpl<TicketSolutionMapper,
}
ticketService.lambdaUpdate()
.set(Ticket::getReason, request.getReason())
.set(StrUtil.isNotBlank(request.getQuestion()), Ticket::getQuestion, request.getQuestion())
.set(Ticket::getAccidentLevel, request.getAccidentLevel())
.eq(Ticket::getId, request.getTicketId())
.update();
@ -215,26 +218,26 @@ public class TicketSolutionServiceImpl extends ServiceImpl<TicketSolutionMapper,
.setScheduleDate(solutionMeasuresDataItemVO.getScheduleDate())
.setConfirmedDate(solutionMeasuresDataItemVO.getConfirmedDate())
.setRemark(solutionMeasuresDataItemVO.getRemark());
if (Objects.isNull(solutionMeasuresDataItemVO.getId())){
if (Objects.isNull(solutionMeasuresDataItemVO.getId())) {
solution.setCreateUserId(userId)
.setCreateTime(LocalDateTime.now());
forAdd.add(solution);
}else {
} else {
solution.setId(Math.toIntExact(solutionMeasuresDataItemVO.getId()));
solution.setCreateUserId(solutionMeasuresDataItemVO.getCreateUserId());
forUpdate.add(solution);
}
}
}
List<Integer> idForReserve=forUpdate.stream().map(TicketSolution::getId).collect(Collectors.toList());
List<TicketSolution> solutions=lambdaQuery().eq(TicketSolution::getTicketId, request.getTicketId()).orderByAsc(TicketSolution::getId).list();
if (!cqmIds.contains(userId)){
List<TicketSolution> solutions1=solutions.stream().filter(s->idForReserve.contains(s.getId())).collect(Collectors.toList());
List<Integer> idForReserve = forUpdate.stream().map(TicketSolution::getId).collect(Collectors.toList());
List<TicketSolution> solutions = lambdaQuery().eq(TicketSolution::getTicketId, request.getTicketId()).orderByAsc(TicketSolution::getId).list();
if (!cqmIds.contains(userId)) {
List<TicketSolution> solutions1 = solutions.stream().filter(s -> idForReserve.contains(s.getId())).collect(Collectors.toList());
solutions.removeAll(solutions1);
VUtils.trueThrowBusinessError(solutions.stream().anyMatch(s->!Objects.equals(s.getCreateUserId(), userId)))
VUtils.trueThrowBusinessError(solutions.stream().anyMatch(s -> !Objects.equals(s.getCreateUserId(), userId)))
.throwMessage("不能删除他人创建的措施");
solutions1.removeIf(s->Objects.equals(s.getCreateUserId(), userId));
List<TicketSolution> ts=forUpdate.stream().filter(s->!Objects.equals(s.getCreateUserId(), userId)).sorted(Comparator.comparing(TicketSolution::getId)).collect(Collectors.toList());
solutions1.removeIf(s -> Objects.equals(s.getCreateUserId(), userId));
List<TicketSolution> ts = forUpdate.stream().filter(s -> !Objects.equals(s.getCreateUserId(), userId)).sorted(Comparator.comparing(TicketSolution::getId)).collect(Collectors.toList());
VUtils.trueThrowBusinessError(!ts.equals(solutions1)).throwMessage("不能修改他人创建的措施");
}
ticketService.lambdaUpdate()
@ -244,16 +247,16 @@ public class TicketSolutionServiceImpl extends ServiceImpl<TicketSolutionMapper,
.set(Ticket::getSolveTime, LocalDateTime.now())
.eq(Ticket::getId, request.getTicketId())
.update();
if(CollectionUtil.isNotEmpty(idForReserve)) {
if (CollectionUtil.isNotEmpty(idForReserve)) {
baseMapper.delete(new LambdaQueryWrapper<TicketSolution>()
.eq(TicketSolution::getTicketId, request.getTicketId())
.notIn(TicketSolution::getId, idForReserve)
);
}
if (CollectionUtil.isNotEmpty(forAdd)){
if (CollectionUtil.isNotEmpty(forAdd)) {
saveBatch(forAdd);
}
if (CollectionUtil.isNotEmpty(forUpdate)){
if (CollectionUtil.isNotEmpty(forUpdate)) {
updateBatchById(forUpdate);
}
return ticket;

View File

@ -121,7 +121,7 @@
,au.expire_time,IF(aua.id IS NOT NULL,0
,IF(CONVERT_TZ(NOW(), @@session.time_zone, '+00:00') &lt; au.expire_time,1,2)) AS 'state',au.create_by
,au.create_time,au.update_by,au.update_time,au.last_login_time,au.is_primary,au.company_id,au.phone,au.area_id
,au.language_code,p.position_name AS 'title',au.title_id,au.type
,au.language_code,p.position_name AS 'title',au.title_id,au.type,au.customer_name
FROM app_user au
LEFT JOIN app_area aa ON au.area_id=aa.id
LEFT JOIN app_user_applyfor aua ON aua.user_id=au.id AND aua.state=0

View File

@ -41,13 +41,15 @@
)
</if>
</where>
ORDER BY da.state,da.id DESC
</select>
<select id="getInfo" resultType="com.nflg.mobilebroken.common.pojo.vo.DispatchVO">
SELECT da.*,dv.customer_name,bc.agency_company_name as agent_name
SELECT da.*,dv.customer_name,bc.agency_company_name as agent_name,af.reason as "delayReason"
FROM gongfu_dispatch da
LEFT JOIN v_gongfu_device dv ON da.device_no=dv.device_no
LEFT JOIN t_base_customer bc ON dv.agent_code=bc.agency_company_code
left join v_dispatch_applyfor af on da.id=af.ticket_id
where da.id = #{id}
</select>
</mapper>

View File

@ -132,8 +132,8 @@
LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN admin_user au ON t.user_id=au.id
LEFT JOIN app_area a2 ON u.area_id=a2.id
LEFT JOIN gongfu_ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=IF(#{from}='app',0,1)
LEFT JOIN gongfu_ticket_evaluate te ON t.id=te.ticket_id AND t.state=2
LEFT JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=IF(#{from}='app',0,1)
LEFT JOIN ticket_evaluate te ON t.id=te.ticket_id AND t.state=2
LEFT JOIN gongfu_device_part p ON t.component_id=p.id
LEFT JOIN gongfu_device_part_language_data l ON p.id=l.source_id AND l.language_code=#{language}
LEFT JOIN v_device vd ON t.device_no=vd.device_no
@ -153,20 +153,20 @@
<select id="searchFromAdmin" resultType="com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO">
SELECT t.id,t.`no`,t.title,t.state,t.urgency,p.part_name AS 'component',t.question,t.reason
,IF(u.is_primary,fun_getPrimaryUserArea(u.company_id),'') AS 'areaName',IF(u.is_primary,'',a2.`name`) AS 'agentAreaName'
,d.customer_name AS 'customerName',d.agent_name AS 'agentName',IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,a1.area_name AS 'areaName','' AS 'agentAreaName',d.customer_name AS 'customerName',d.agent_name AS 'agentName'
,IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,t.create_time AS 'createTime',t.update_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType'
,d.model_no AS 'equipmentModel',d.shipment_date AS 'shipmentDate',IF(tf.id IS NULL, false, true) AS 'followed',auc.user_name AS 'cqm'
,t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms'
,d.model_no AS 'equipmentModel',d.shipment_date AS 'shipmentDate',IF(tf.id IS NULL, false, true) AS 'followed'
,auc.user_name AS 'cqm',t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms'
,t.handle_name AS 'handle',t.description
FROM gongfu_ticket t
LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN admin_user au ON t.user_id=au.id
LEFT JOIN app_area a2 ON u.area_id=a2.id
LEFT JOIN t_base_area a1 ON u.area_id=a1.id
LEFT JOIN gongfu_device d ON t.device_no=d.device_no and d.data_valid_state=1
LEFT JOIN gongfu_device_type dt ON d.device_type=dt.device_type
LEFT JOIN dictionary_item di ON d.warranty_state=di.id
LEFT JOIN gongfu_ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=1
LEFT JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=1
LEFT JOIN admin_user auc ON t.cqm=auc.id
LEFT JOIN admin_user auh ON t.current_handle=auh.id
LEFT JOIN gongfu_device_part p ON t.component_id=p.id
@ -176,20 +176,20 @@
<select id="searchAllFromAdmin" resultType="com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO">
SELECT t.id,t.`no`,t.title,t.state,t.urgency,p.part_name AS 'component',t.question,t.reason
,IF(u.is_primary,fun_getPrimaryUserArea(u.company_id),'') AS 'areaName',IF(u.is_primary,'',a2.`name`) AS 'agentAreaName'
,d.customer_name AS 'customerName',d.agent_name AS 'agentName',IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,a1.area_name AS 'areaName','' AS 'agentAreaName',d.customer_name AS 'customerName',d.agent_name AS 'agentName'
,IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,t.create_time AS 'createTime',t.update_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType'
,d.model_no AS 'equipmentModel',d.shipment_date AS 'shipmentDate',IF(tf.id IS NULL, false, true) AS 'followed',auc.user_name AS 'cqm'
,t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms'
,d.model_no AS 'equipmentModel',d.shipment_date AS 'shipmentDate',IF(tf.id IS NULL, false, true) AS 'followed'
,auc.user_name AS 'cqm',t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms'
,t.handle_name AS 'handle',t.description
FROM gongfu_ticket t
LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN admin_user au ON t.user_id=au.id
LEFT JOIN app_area a2 ON u.area_id=a2.id
LEFT JOIN t_base_area a1 ON u.area_id=a1.id
LEFT JOIN gongfu_device d ON t.device_no=d.device_no and d.data_valid_state=1
LEFT JOIN gongfu_device_type dt ON d.device_type=dt.device_type
LEFT JOIN dictionary_item di ON d.warranty_state=di.id
LEFT JOIN gongfu_ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=1
LEFT JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=1
LEFT JOIN admin_user auc ON t.cqm=auc.id
LEFT JOIN admin_user auh ON t.current_handle=auh.id
LEFT JOIN gongfu_device_part p ON t.component_id=p.id
@ -199,8 +199,8 @@
<select id="searchFromAdminAndFollow" resultType="com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO">
SELECT t.id,t.`no`,t.title,t.state,t.urgency,p.part_name AS 'component',t.question,t.reason
,IF(u.is_primary,fun_getPrimaryUserArea(u.company_id),'') AS 'areaName',IF(u.is_primary,'',a2.`name`) AS 'agentAreaName'
,d.customer_name AS 'customerName',d.agent_name AS 'agentName',IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,a1.area_name AS 'areaName','' AS 'agentAreaName',d.customer_name AS 'customerName',d.agent_name AS 'agentName'
,IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,t.create_time AS 'createTime',t.update_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType'
,d.model_no AS 'equipmentModel',d.shipment_date AS 'shipmentDate',true AS 'followed',auc.user_name AS 'cqm'
,t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms'
@ -208,8 +208,8 @@
FROM gongfu_ticket t
LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN admin_user au ON t.user_id=au.id
LEFT JOIN app_area a2 ON u.area_id=a2.id
INNER JOIN gongfu_ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=1
LEFT JOIN t_base_area a1 ON u.area_id=a1.id
INNER JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=1
LEFT JOIN gongfu_device d ON t.device_no=d.device_no and d.data_valid_state=1
LEFT JOIN gongfu_device_type dt ON d.device_type=dt.device_type
LEFT JOIN dictionary_item di ON d.warranty_state=di.id
@ -222,16 +222,16 @@
<select id="searchAllFromAdminAndFollow" resultType="com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO">
SELECT t.id,t.`no`,t.title,t.state,t.urgency,p.part_name AS 'component',t.question,t.reason
,IF(u.is_primary,fun_getPrimaryUserArea(u.company_id),'') AS 'areaName',IF(u.is_primary,'',a2.`name`) AS 'agentAreaName'
,d.customer_name AS 'customerName',d.agent_name AS 'agentName',IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,a1.area_name AS 'areaName','' AS 'agentAreaName',d.customer_name AS 'customerName',d.agent_name AS 'agentName'
,IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,t.create_time AS 'createTime',t.update_time AS 'completeTime',di.name AS 'warrantyStatusDesc',true AS 'followed'
,auc.user_name AS 'cqm',t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle'
,dt.cqm_person_name AS 'cqms',t.handle_name AS 'handle',t.description
FROM gongfu_ticket t
LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN admin_user au ON t.user_id=au.id
LEFT JOIN app_area a2 ON u.area_id=a2.id
INNER JOIN gongfu_ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=1
LEFT JOIN t_base_area a1 ON u.area_id=a1.id
INNER JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=1
LEFT JOIN gongfu_device d ON t.device_no=d.device_no and d.data_valid_state=1
LEFT JOIN gongfu_device_type dt ON d.device_type=dt.device_type
LEFT JOIN dictionary_item di ON d.warranty_state=di.id
@ -244,7 +244,7 @@
<select id="getAdminFavorites" resultType="com.nflg.mobilebroken.common.pojo.vo.TicketVO">
SELECT t.id, t.no, t.title
FROM gongfu_ticket_follow tf
FROM ticket_follow tf
INNER JOIN gongfu_ticket t ON tf.ticket_id = t.id
WHERE tf.`from` = 1
AND tf.user_id = #{userId} AND tf.from=IF(#{from}='app',0,1)
@ -254,8 +254,8 @@
<select id="searchByFavouritesId" resultType="com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO">
SELECT t.id,t.`no`,t.title,t.state,t.urgency,p.part_name AS 'component',t.question,t.reason
,IF(u.is_primary,fun_getPrimaryUserArea(u.company_id),'') AS 'areaName',IF(u.is_primary,'',a2.`name`) AS 'agentAreaName'
,d.customer_name AS 'customerName',d.agent_name AS 'agentName',IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,a1.area_name AS 'areaName','' AS 'agentAreaName',d.customer_name AS 'customerName',d.agent_name AS 'agentName'
,IF(t.user_platform='admin',au.user_name,u.`name`) AS 'createBy',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,t.create_time AS 'createTime',t.update_time AS 'completeTime',di.name AS 'warrantyStatusDesc',d.device_type AS 'deviceType'
,d.model_no AS 'equipmentModel',d.shipment_date AS 'shipmentDate',true AS 'followed',auc.user_name AS 'cqm'
,t.solve_time AS 'closeTime',auh.user_name AS 'currentHandle',dt.cqm_person_name AS 'cqms'
@ -263,8 +263,8 @@
FROM gongfu_ticket t
LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN admin_user au ON t.user_id=au.id
LEFT JOIN app_area a2 ON u.area_id=a2.id
INNER JOIN gongfu_ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=1
LEFT JOIN t_base_area a1 ON u.area_id=a1.id
INNER JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=1
<if test="favouritesId>0">
AND tf.favorites_id=#{favouritesId}
</if>

View File

@ -285,4 +285,8 @@
from v_all_ticket
where id = #{id}
</select>
<select id="getById" resultType="com.nflg.mobilebroken.common.pojo.vo.TicketVO">
select * from v_all_ticket where id = #{id}
</select>
</mapper>