This commit is contained in:
xiaofajia 2024-11-18 19:33:30 +08:00
commit 7975ac9f46
11 changed files with 276 additions and 17 deletions

View File

@ -0,0 +1,53 @@
package cn.iocoder.yudao.module.tickets.entity;
import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* 维修记录 DO
*
* @author lzt
*/
@TableName("dl_repair_records")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BaseRepairRecords extends TenantBaseDO {
/**
* 主键标识
*/
@TableId(type = IdType.ASSIGN_UUID)
private String id;
/**
* 工单id
*/
private String ticketId;
/**
* 工单子表id
*/
private String repairItemId;
/**
* 记录类型repair_records_type
*/
private String type;
/**
* 记录描述
*/
private String remark;
/**
* 处理人
*/
private String dealUserName;
/**
* 处理人员工表id
*/
private Long dealUserId;
}

View File

@ -0,0 +1,14 @@
package cn.iocoder.yudao.module.tickets.mapper;
import cn.iocoder.yudao.module.tickets.entity.BaseRepairRecords;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 维修记录 Mapper
*
* @author lzt
*/
@Mapper
public interface BaseRepairRecordsMapper extends BaseMapper<BaseRepairRecords> {
}

View File

@ -0,0 +1,26 @@
package cn.iocoder.yudao.module.tickets.service;
import cn.iocoder.yudao.module.tickets.entity.BaseRepairRecords;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* 维修记录 Service 接口
*
* @author lzt
*/
public interface BaseRepairRecordsService extends IService<BaseRepairRecords> {
/**
* 保存维修记录
*
* @param ticketId 工单id
// * @param repairItemId 工单子表id
* @param type 工作类型数据字典repair_records_type;后端对应 RecordTypeEnum 枚举
* @param remark 备注
* @param images 图片(相对路径按照,分隔)
* @author PQZ
* @date 14:51 2024/10/11
**/
void saveRepairRecord(String ticketId, String repairItemId, String type, String remark, String images);
}

View File

@ -0,0 +1,55 @@
package cn.iocoder.yudao.module.tickets.service.impl;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.tickets.entity.BaseRepairRecords;
import cn.iocoder.yudao.module.tickets.mapper.BaseRepairRecordsMapper;
import cn.iocoder.yudao.module.tickets.service.BaseRepairRecordsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
/**
* 维修记录 Service 实现类
*
* @author lzt
*/
@Service
@Validated
public class BaseRepairRecordsServiceImpl extends ServiceImpl<BaseRepairRecordsMapper, BaseRepairRecords> implements BaseRepairRecordsService {
@Resource
private AdminUserApi userApi;
/**
* 保存维修记录
*
* @param ticketId 工单id
* @param repairItemId 工单子表id
* @param type 工作类型数据字典repair_records_type;后端对应 RecordTypeEnum 枚举
* @param remark 备注
* @param images 图片(相对路径按照分隔)
* @author PQZ
* @date 14:51 2024/10/11
**/
@Override
public void saveRepairRecord(String ticketId, String repairItemId, String type, String remark, String images) {
//获取当前登录用户
Long userId = SecurityFrameworkUtils.getLoginUserId();
AdminUserRespDTO loginUser = userApi.getUser(userId);
//初始化维修记录
BaseRepairRecords repairRecords = new BaseRepairRecords();
repairRecords.setTicketId(ticketId);
repairRecords.setRepairItemId(repairItemId);
repairRecords.setType(type);
repairRecords.setRemark(remark);
repairRecords.setDealUserId(loginUser.getId());
repairRecords.setDealUserName(loginUser.getNickname());
//保存维修记录
save(repairRecords);
}
}

View File

@ -2,9 +2,11 @@ package cn.iocoder.yudao.module.tickets.service.impl;
import cn.iocoder.yudao.module.tickets.entity.Tickets;
import cn.iocoder.yudao.module.tickets.mapper.TicketsMapper;
import cn.iocoder.yudao.module.tickets.service.BaseRepairRecordsService;
import cn.iocoder.yudao.module.tickets.service.TicketsService;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@ -15,6 +17,8 @@ import java.util.List;
**/
@Service
public class TicketsServiceImpl extends ServiceImpl<TicketsMapper, Tickets> implements TicketsService {
@Autowired
private BaseRepairRecordsService baseRepairRecordsService;
/**
* 更新工单状态为已结账
@ -32,5 +36,9 @@ public class TicketsServiceImpl extends ServiceImpl<TicketsMapper, Tickets> impl
// 不在这儿结束
// .set(Tickets::getIsFinish, "1")
);
// 记录日志
if(!ticketIds.isEmpty()){
baseRepairRecordsService.saveRepairRecord(ticketIds.get(0), null, "js", "线上支付结算", null);
}
}
}

View File

@ -35,6 +35,10 @@ public enum RecordTypeEnum {
* 总检
*/
ZJ("zj","总检"),
/**
* 结算
*/
JS("js","结算"),
/**
* 结束工单
*/

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.tickets.controller.admin;
import cn.hutool.core.date.DateUtil;
import cn.iocoder.yudao.common.RepairCons;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.tickets.entity.DlRepairTickets;
@ -16,6 +17,9 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@ -311,15 +315,45 @@ public class DlRepairTicketsController {
return CommonResult.ok();
}
/**
* 从总检的角度差维修中已完成的工单数量
* 从总检的角度查进场数维修中已完成已交车在厂的工单数量
* @author vinjor-M
* @date 11:29 2024/10/24
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<?>
**/
@GetMapping("/getBossNum")
@Operation(summary = "从总检的角度查维修中、已完成的工单数量")
public CommonResult<?> getBossNum(String selectType) {
return success(dlRepairTicketsService.getBossNum(selectType));
@Operation(summary = "从总检的角度查进场数、维修中、已完成、已交车、在厂的工单数量")
public CommonResult<?> getBossNum(String selectType,String startDate,String endDate) {
return success(dlRepairTicketsService.getBossNum(selectType, startDate, endDate));
}
/**
* 获取日期范围
* @author vinjor-M
* @date 11:29 2024/10/24
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<?>
**/
@GetMapping("/getDateRange")
@Operation(summary = "获取日期范围")
public CommonResult<?> getDateRange(String selectType) {
Map<String,String> rtnMap = new HashMap<>();
// 获取当前日期
Date currentDate = new Date();
String nowDay = DateUtil.formatDate(new Date());
rtnMap.put("endDate",nowDay);
if("threeMonth".equals(selectType)){
//近3个月
// 使用Hutool的DateUtil推移3个月
Date threeMonthsAgo = DateUtil.offsetMonth(currentDate, -3);
String startDay = DateUtil.formatDate(threeMonthsAgo);
rtnMap.put("startDate",startDay);
}else {
//近6个月
// 使用Hutool的DateUtil推移6个月
Date threeMonthsAgo = DateUtil.offsetMonth(currentDate, -6);
String startDay = DateUtil.formatDate(threeMonthsAgo);
rtnMap.put("startDate",startDay);
}
return success(rtnMap);
}
/**

View File

@ -42,6 +42,16 @@ public interface DlRepairTicketsMapper extends BaseMapper<DlRepairTickets> {
* @param repairTicketsReqVO 查询对象
**/
IPage<DlRepairTickets> getPageTypeAll(@Param("map") DlRepairTicketsReqVO repairTicketsReqVO, Page<DlRepairTickets> page);
/**
* 根据条件查询指定工单数量
* @author vinjor-M
* @date 15:46 2024/11/18
* @param dayDate 某一天日期
* @param recordCode 操作记录code
* @return java.lang.Long
**/
Long selectCountByParams(@Param("nowDate")String dayDate, @Param("recordCode")String recordCode, @Param("startTime")String startTime, @Param("endTime")String endTime);
}

View File

@ -172,7 +172,7 @@ public interface DlRepairTicketsService extends IService<DlRepairTickets> {
* @date 11:30 2024/10/24
* @return java.util.Map<java.lang.String,java.lang.Integer>
**/
Map<String,Integer> getBossNum(String selectType);
Map<String,Long> getBossNum(String selectType,String startDate,String endDate);
/**
* 服务顾问通知客户取车

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.tickets.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.common.*;
import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
@ -103,6 +104,8 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
@Resource
private DlRepairTitemService titemService;
@Resource
private DlRepairTicketsMapper repairTicketsMapper;
@Resource
private DeptApi deptApi;
@ -457,6 +460,8 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
repairOrderInfo.setOrderStatus("1");
}
repairOrderInfoService.updateById(repairOrderInfo);
// 记录日志
repairRecordsService.saveRepairRecord(one.getGoodsId(), null, RecordTypeEnum.JS.getCode(), "线下支付结算", null);
}
/**
@ -1406,23 +1411,54 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
* @date 11:30 2024/10/24
**/
@Override
public Map<String, Integer> getBossNum(String selectType) {
Map<String, Integer> rtnMap = new HashMap<>();
int workingNum = 0;
int doneNum = 0;
public Map<String, Long> getBossNum(String selectType,String startDate,String endDate) {
Map<String, Long> rtnMap = new HashMap<>();
//维修中---当前这一时刻
long workingNum = 0;
//在厂数--当前这一时刻
long inCompanyNum = 0;
//进场数
long newOrderNum=0;
//已完成
long overNum=0;
//已交车
long giveCusNum=0;
List<DlRepairTickets> repairTickets = this.list();
if (!repairTickets.isEmpty()) {
Map<String, List<DlRepairTickets>> ifFinishMap = repairTickets.stream().collect(Collectors.groupingBy(DlRepairTickets::getIsFinish));
if (ifFinishMap.containsKey("0")) {
workingNum = ifFinishMap.get("0").size();
}
if (ifFinishMap.containsKey("1")) {
doneNum = ifFinishMap.get("1").size();
workingNum = repairTickets.stream().filter(item -> TicketsStatusEnum.WORKING.getCode().equals(item.getTicketsStatus())).count();
inCompanyNum = repairTickets.stream().filter(item -> TicketsStatusEnum.NO_PAY.getCode().equals(item.getTicketsStatus())).count();
LocalDateTime currentTime = LocalDateTime.now();
if("today".equals(selectType)){
String nowDayStr = DateUtil.formatDate(new Date());
//查当日进厂数已完成已交车
newOrderNum = repairTickets.stream().filter(item -> item.getCreateTime().toLocalDate().equals(currentTime.toLocalDate())).count();
//查当日已完成的总检完成的
overNum = repairTicketsMapper.selectCountByParams(nowDayStr,RecordTypeEnum.ZJ.getCode(),null,null);
//查当日已交车的已结算的
giveCusNum = repairTicketsMapper.selectCountByParams(nowDayStr,RecordTypeEnum.JS.getCode(),null,null);
}else if("all".equals(selectType)){
//查累计进厂数已完成已交车
newOrderNum = repairTickets.size();
//查累计已完成的总检完成的
overNum = repairTicketsMapper.selectCountByParams(null,RecordTypeEnum.ZJ.getCode(),null,null);
//查累计已交车的已结算的
giveCusNum = repairTicketsMapper.selectCountByParams(null,RecordTypeEnum.JS.getCode(),null,null);
}else {
//查某个时间范围内进厂数已完成已交车
LocalDateTime startTime = LocalDateTime.parse(startDate+" 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDateTime endTime = LocalDateTime.parse(endDate+" 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
newOrderNum = repairTickets.stream().filter(item -> item.getCreateTime().isAfter(startTime) && item.getCreateTime().isBefore(endTime)).count();
//查某区间范围内已完成的总检完成的
overNum = repairTicketsMapper.selectCountByParams(null,RecordTypeEnum.ZJ.getCode(), startDate+" 00:00:00", endDate+" 23:59:59");
//查某区间范围内已交车的已结算的
giveCusNum = repairTicketsMapper.selectCountByParams(null,RecordTypeEnum.JS.getCode(), startDate+" 00:00:00", endDate+" 23:59:59");
}
}
rtnMap.put("workingNum", workingNum);
rtnMap.put("doneNum", doneNum);
rtnMap.put("inCompanyNum", inCompanyNum);
rtnMap.put("newOrderNum", newOrderNum);
rtnMap.put("overNum", overNum);
rtnMap.put("giveCusNum", giveCusNum);
return rtnMap;
}

View File

@ -349,4 +349,23 @@
GROUP BY drt.id
order by drt.update_time desc
</select>
<select id="selectCountByParams" resultType="java.lang.Long">
SELECT
COUNT(DISTINCT drt.id)
FROM
dl_repair_tickets drt
LEFT JOIN dl_repair_records drr ON drt.id = drr.ticket_id
AND drr.deleted = '0'
WHERE
drt.deleted = '0'
AND drt.tickets_status !='03'
AND drr.type = #{recordCode}
<if test="nowDate!=null and nowDate!=''">
AND drr.create_time LIKE CONCAT(#{nowDate},'%')
</if>
<if test="startTime!=null">
AND drr.create_time &gt;= #{startTime}
AND drr.create_time &lt;= #{endTime}
</if>
</select>
</mapper>