Compare commits

...

16 Commits

Author SHA1 Message Date
xiaofajia
9bb6c0b201 修改工单完成位置 2024-11-16 15:56:23 +08:00
xiaofajia
5da4a45e7d 服务顾问通知客户取车前,判断项目价格、配件价格是否已填写 2024-11-16 15:37:58 +08:00
xiaofajia
01c781478e 代码补正 2024-11-16 12:04:32 +08:00
xiaofajia
01f5aa9017 Merge branch 'repair' of http://122.51.230.86:3000/dianliang/lanan-system into repair 2024-11-15 16:22:40 +08:00
xiaofajia
f61004114d 一些BUG的修改 2024-11-15 16:22:26 +08:00
Vinjor
28ebcfc6dc 1 2024-11-15 15:36:17 +08:00
Vinjor
0147ee5b7c 仓管修改配件价格 2024-11-15 14:46:31 +08:00
xiaofajia
c4da06e591 新增单个配件申请表查看 2024-11-14 18:30:15 +08:00
xiaofajia
6c396bfbbd 服务顾问不做数据权限控制 2024-11-14 10:44:24 +08:00
xiaofajia
bc79d9df53 更新代码 2024-11-14 09:26:26 +08:00
xiaofajia
32f55301df Merge branch 'repair' of http://122.51.230.86:3000/dianliang/lanan-system into repair 2024-11-13 20:00:03 +08:00
xiaofajia
eaf06a2d77 配件申请单加上图片和一些其他修改 2024-11-13 19:58:46 +08:00
PQZ
fecc6bb4da Merge branch 'repair' of http://122.51.230.86:3000/dianliang/lanan-system into repair 2024-11-13 17:48:00 +08:00
PQZ
1b6a1dab5b 2 2024-11-13 17:47:57 +08:00
Vinjor
1151c2dbe5 Merge branch 'master' into repair 2024-11-13 17:13:08 +08:00
Vinjor
4920ad7b25 1 2024-11-13 17:12:28 +08:00
23 changed files with 426 additions and 76 deletions

View File

@ -2,38 +2,32 @@ package cn.iocoder.yudao.module.company.controller.admin;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.common.CommonErrorCodeConstants;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
import cn.iocoder.yudao.module.company.entity.Company;
import cn.iocoder.yudao.module.company.service.CompanyService;
import cn.iocoder.yudao.module.company.vo.CompanyReqVO;
import cn.iocoder.yudao.module.company.vo.CompanyRespVO;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import cn.iocoder.yudao.module.company.vo.CompanyReqVO;
import io.swagger.v3.oas.annotations.Parameter;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import cn.iocoder.yudao.module.company.service.CompanyService;
import org.springframework.context.annotation.Lazy;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
@ -43,6 +37,10 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
/**
* 企业信息表每个租户的下属企业信息;(dl_company)表控制层
*
@ -198,4 +196,23 @@ public class CompanyController {
}
return success(companyService.getById(dept.getCorpId()));
}
/**
* 查某租户下某个业务系统的企业信息
* @author vinjor-M
* @date 15:08 2024/11/15
* @param tenantId 租户ID
* @param systemCode 系统标识
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<?>
**/
@GetMapping("/getCompanyByTenantId")
@Operation(summary = "查某租户下某个业务系统的企业信息")
public CommonResult<?> getCompanyByTenantId(String tenantId,String systemCode){
LambdaQueryWrapper<Company> queryWrapper = new LambdaQueryWrapper<Company>()
.eq(TenantBaseDO::getTenantId,tenantId)
.like(Company::getServiceCodes,systemCode)
.orderByDesc(BaseDO::getCreateTime);
List<Company> list = this.companyService.list(queryWrapper);
return success(list.isEmpty()?null:list.get(0));
}
}

View File

@ -30,6 +30,9 @@ public class Company extends TenantBaseDO {
/** 企业名称 */
@ExcelProperty("企业名称")
private String corpName ;
/** 企业简称 */
@ExcelProperty("企业简称")
private String simpleName ;
/** 统一社会信用代码 */
@ExcelProperty("统一社会信用代码")
private String orgCard ;

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.custom.controller.admin;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.module.custom.entity.CarMain;
import cn.iocoder.yudao.module.custom.service.CarMainService;
import cn.iocoder.yudao.module.custom.service.UserCarService;
@ -215,8 +216,10 @@ public class CarMainController {
@PostMapping("/getByLicenseNumber")
@Operation(summary = "根据车牌查单条记录")
public CommonResult<?> getByLicenseNumber(@RequestBody CarMain carMain) {
CarMain one = carMainService.getOne(new LambdaQueryWrapper<CarMain>().eq(CarMain::getLicenseNumber, carMain.getLicenseNumber()));
return success(one);
// 可能查到多条只用一条就是理论上讲是不会有多条的
// CarMain one = carMainService.list(new LambdaQueryWrapper<CarMain>().eq(CarMain::getLicenseNumber, carMain.getLicenseNumber()));
List<CarMain> list = carMainService.list(new LambdaQueryWrapper<CarMain>().eq(CarMain::getLicenseNumber, carMain.getLicenseNumber()).last("limit 1"));
return success(CollectionUtil.isNotEmpty(list) ? list.get(0) : null);
}
/**

View File

@ -29,7 +29,8 @@ public class TicketsServiceImpl extends ServiceImpl<TicketsMapper, Tickets> impl
baseMapper.update(new LambdaUpdateWrapper<Tickets>()
.in(Tickets::getId, ticketIds)
.set(Tickets::getTicketsStatus, "02")
.set(Tickets::getIsFinish, "1")
// 不在这儿结束
// .set(Tickets::getIsFinish, "1")
);
}
}

View File

@ -76,6 +76,9 @@ public enum RecordTypeEnum {
/** 删除工单 */
SCGG("scgg", "删除工单"),
/** 删除工单 */
JC("jc", "交车"),
/** 内返派工 */
NFPG("nfpg", "内返派工");

View File

@ -27,6 +27,10 @@ public enum TicketsStatusEnum {
* 待通知客户取车
*/
WAITING_NOTICE("07","待通知客户取车"),
/**
* 已交车
*/
OVER("08","已交车"),
/**
* 挂单/记账
*/

View File

@ -123,6 +123,12 @@ public class RepairWorkerController {
return success(workerService.listByLeads());
}
@GetMapping("/listLeadsAll")
@Operation(summary = "通过班组长的id查该班组的员工不去掉班组长")
public CommonResult<?> listLeadsAll() {
return success(workerService.listLeadsAll());
}
/**
* 查当前登录用户是否维修班组长
* @author vinjor-M

View File

@ -106,6 +106,14 @@ public interface RepairWorkerService extends IService<RepairWorker> {
**/
List<RepairWorker> listByLeads();
/**
* 通过班组长的id查该班组的员工不去掉班组长
* @author PQZ
* @date 15:20 2024/11/13
* @return java.util.List<cn.iocoder.yudao.module.base.entity.RepairWorker>
**/
List<RepairWorker> listLeadsAll();
/**
* 查当前登录用户是否维修班组长
* @author vinjor-M

View File

@ -272,6 +272,21 @@ public class RepairWorkerServiceImpl extends ServiceImpl<RepairWorkerMapper, Rep
return workerList.stream().filter(item -> !Objects.equals(item.getUserId(), worker.getUserId())).collect(Collectors.toList());
}
/**
* 通过班组长的id查该班组的员工不去掉班组长
*
* @return java.util.List<cn.iocoder.yudao.module.base.entity.RepairWorker>
* @author PQZ
* @date 15:20 2024/11/13
**/
@Override
public List<RepairWorker> listLeadsAll() {
// 取班组长的记录
RepairWorker worker = baseMapper.selectOne(new LambdaQueryWrapper<RepairWorker>().eq(RepairWorker::getUserId, SecurityFrameworkUtils.getLoginUserId()));
// 根据班组长的工种查所有该工程的工人
return baseMapper.selectList(new LambdaQueryWrapper<RepairWorker>().eq(RepairWorker::getWorkType, worker.getWorkType()));
}
/**
* 查当前登录用户是否维修班组长
*

View File

@ -242,7 +242,8 @@ public class DlRepairSoServiceImpl extends ServiceImpl<DlRepairSoMapper, DlRepai
sois.stream().filter(i -> i.getGoodsId().equals(item.getWaresId())).findFirst().ifPresent(repairSoiByTwItem -> {
if (so.getSoType().equals("02")){
dlTwItem.setWaresAlreadyCount(item.getWaresAlreadyCount() - repairSoiByTwItem.getGoodsCount());
dlTwItem.setWaresStatus("02");
// 不操作配件申请表子表的状态
// dlTwItem.setWaresStatus("02");
}else {
dlTwItem.setWaresAlreadyCount(item.getWaresAlreadyCount() + repairSoiByTwItem.getGoodsCount());
}
@ -325,13 +326,13 @@ public class DlRepairSoServiceImpl extends ServiceImpl<DlRepairSoMapper, DlRepai
// 查最新的子表信息
DlRepairSo so = baseMapper.selectById(id);
List<DlTwItem> list = twItemService.list(new LambdaQueryWrapper<DlTwItem>().eq(DlTwItem::getTwId, so.getTwId()));
// 判断是部分完成还是全部完成
DlTicketWares dlTicketWares = new DlTicketWares();
dlTicketWares.setId(so.getTwId());
List<DlTwItem> flag = list.stream().filter(item -> !item.getWaresStatus().equals("01")).collect(Collectors.toList());
dlTicketWares.setStatus(CollectionUtil.isEmpty(flag) ? "03" : "04");
// 判断是部分完成还是全部完成----不需要判断了
// DlTicketWares dlTicketWares = new DlTicketWares();
// dlTicketWares.setId(so.getTwId());
// List<DlTwItem> flag = list.stream().filter(item -> !item.getWaresStatus().equals("01")).collect(Collectors.toList());
// dlTicketWares.setStatus(CollectionUtil.isEmpty(flag) ? "03" : "04");
// 更新主表的状态
ticketWaresService.updateById(dlTicketWares);
// ticketWaresService.updateById(dlTicketWares);
// 通知仓库
repairWorkerService.sentMessage(Long.valueOf(so.getCreator()), so.getUserName() + "已确认领料单:" + so.getSoNo());
@ -447,8 +448,8 @@ public class DlRepairSoServiceImpl extends ServiceImpl<DlRepairSoMapper, DlRepai
//入库数量
inWares.setInCount(filterSoi.getInCount());
inWares.setId(null);
//采购品中入库数量字段累加
item.setInCount(item.getInCount() == null ? 0 : item.getInCount() + filterSoi.getInCount());
//采购品中入库数量字段累加---这里item.getInCount 是null的时候应该是filterSoi的inCount而不是0
item.setInCount(item.getInCount() == null ? filterSoi.getInCount() : item.getInCount() + filterSoi.getInCount());
inWaresList.add(inWares);
});
//更新采购品

View File

@ -297,6 +297,19 @@ public class DlRepairTicketsController {
return CommonResult.ok();
}
/**
* 服务顾问交车
* @author vinjor-M
* @date 16:51 2024/11/13
* @param respVO
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<?>
**/
@PostMapping("/overOrder")
@Operation(summary = "服务顾问交车")
public CommonResult<?> overOrder(@RequestBody DlRepairTicketsRespVO respVO) {
dlRepairTicketsService.overOrder(respVO);
return CommonResult.ok();
}
/**
* 从总检的角度差维修中已完成的工单数量
* @author vinjor-M
@ -323,6 +336,19 @@ public class DlRepairTicketsController {
return CommonResult.ok();
}
/**
* 判断是否工单子表的任何一个类目没有价格或价格为0
*
* @param id 工单ID
* @author 小李
* @date 15:00 2024/11/16
**/
@GetMapping("/hasPrice")
@Operation(summary = "判断是否工单子表的任何一个类目没有价格或价格为0")
public CommonResult<?> hasPrice(@RequestParam("id")String id){
return success(dlRepairTicketsService.hasPrice(id));
}
/**
* 新增工单子项
*

View File

@ -168,5 +168,18 @@ public class DlTicketWaresController {
public CommonResult<?> getWorkerTodo(){
return success(dlTicketWaresService.getWorkerTodo());
}
/**
* 查单个配件申请单的信息
*
* @author 小李
* @date 15:55 2024/11/14
* @param id id
**/
@GetMapping("/getById")
@Operation(summary = "查单个配件申请单的信息")
public CommonResult<?> getById(@RequestParam("id") String id){
return success(dlTicketWaresService.getById(id));
}
}

View File

@ -3,12 +3,10 @@ package cn.iocoder.yudao.module.tickets.controller.admin;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.tickets.entity.DlTwItem;
import cn.iocoder.yudao.module.tickets.service.DlTwItemService;
import cn.iocoder.yudao.module.tickets.vo.AddTwiVO;
import cn.iocoder.yudao.module.tickets.vo.DlTwItemReqVO;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@ -41,5 +39,19 @@ public class DlTwItemController {
public CommonResult<?> listTwItem(DlTwItemReqVO reqVO){
return success(dlTwItemService.listTwItem(reqVO));
}
/**
* 给配件申请表子表添加数据
*
* @author 小李
* @date 17:47 2024/11/13
* @param addTwiVO 对象
**/
@PostMapping("/addTwi")
@Operation(summary = "给配件申请表子表添加数据")
public CommonResult<?> addTwi(@RequestBody AddTwiVO addTwiVO){
dlTwItemService.addTwi(addTwiVO);
return CommonResult.ok();
}
}

View File

@ -65,4 +65,7 @@ public class DlTicketWares extends TenantBaseDO {
/** 备注 */
private String remark;
/** 多个图片地址,英文逗号分隔(拍照上传配件申请单时用) */
private String images;
}

View File

@ -235,4 +235,21 @@ public interface DlRepairTicketsService extends IService<DlRepairTickets> {
* @param id 工单ID
**/
void removeTicketById(String id);
/**
* 服务顾问交车
* @author vinjor-M
* @date 16:51 2024/11/13
* @param respVO
**/
void overOrder(DlRepairTicketsRespVO respVO);
/**
* 判断是否工单子表的任何一个类目没有价格或价格为0
*
* @param id 工单ID
* @author 小李
* @date 15:00 2024/11/16
**/
Boolean hasPrice(String id);
}

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.tickets.service;
import cn.iocoder.yudao.module.tickets.entity.DlTwItem;
import cn.iocoder.yudao.module.tickets.vo.AddTwiVO;
import cn.iocoder.yudao.module.tickets.vo.DlTwItemReqVO;
import cn.iocoder.yudao.module.tickets.vo.DlTwItemRespVO;
import com.baomidou.mybatisplus.extension.service.IService;
@ -23,4 +24,13 @@ public interface DlTwItemService extends IService<DlTwItem> {
* @param reqVO 请求对象
**/
List<DlTwItemRespVO> listTwItem(DlTwItemReqVO reqVO);
/**
* 给配件申请表子表添加数据
*
* @author 小李
* @date 17:47 2024/11/13
* @param addTwiVO 对象
**/
void addTwi(AddTwiVO addTwiVO);
}

View File

@ -5,8 +5,10 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.common.*;
import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.base.entity.RepairWorker;
import cn.iocoder.yudao.module.base.service.RepairRecordsService;
import cn.iocoder.yudao.module.base.service.RepairWorkerService;
@ -220,7 +222,6 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
// });
// 门店信息
Long deptId = SecurityFrameworkUtils.getLoginUserDeptId();
DeptRespDTO dept = deptApi.getDept(deptId);
@ -446,7 +447,8 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
// 更新工单
// 在这里把工单的状态更新为已完成---需要判断如果是线上支付需要在支付回调更新
if (!repairTicketsRespVO.getPayType().equals("01")) {
repairTicketsRespVO.setIsFinish("1");
// 不在这儿结束
// repairTicketsRespVO.setIsFinish("1");
baseMapper.updateById(repairTicketsRespVO);
} else {
// 线下结账和签单挂账直接算已支付
@ -850,6 +852,8 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
String userRoleCode = getUserRole();
if (userRoleCode.equals(RepairRoleEnum.ADMIN.getCode())) {
//维修管理员看所有数据
} else if (userRoleCode.equals(RepairRoleEnum.WAREHOUSE.getCode())) {
//仓管看到所有数据
} else if (userRoleCode.equals(RepairRoleEnum.INSPECTION.getCode())) {
//总检
if (RepairCons.TICKETS_WAITING.equals(repairTicketsReqVO.getSelectType())) {
@ -876,7 +880,7 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
if ("".equals(userIdsStr)) {
userIdsStr = String.valueOf(worker.getUserId());
} else {
userIdsStr = "," + worker.getUserId();
userIdsStr = userIdsStr + "," + worker.getUserId();
}
}
repairTicketsReqVO.setUserIds(userIds);
@ -999,11 +1003,16 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
}
repairWorkerService.sentMessage(reqVO.getNowRepairId(), "您有新的工单要处理");
// 获取当前操作人的身份----小李新加的逻辑
String userRole = getUserRole();
if (userRole.equals(RepairRoleEnum.REPAIR_STAFF.getCode())) {
//指派施工施工项目中不包含选中人员处理
setTicketItem(reqVO.getId(), reqVO.getNowRepairId(), reqVO.getNowRepairName());
}
//最后记录操作日志--指派施工--pull下来的逻辑
String code = RecordTypeEnum.ZPSG.getCode();
String remark = "指派施工";
// 获取当前操作人的身份----小李新加的逻辑
String userRole = getUserRole();
// 总检
if (userRole.equals(RepairRoleEnum.INSPECTION.getCode())) {
repairRecordsService.saveRepairRecord(reqVO.getId(), null, RecordTypeEnum.NFPG.getCode(), reqVO.getRemark(), reqVO.getImage());
@ -1014,6 +1023,55 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
}
}
/**
* 指派施工施工项目中不包含选中人员处理
*
* @param ticketId 工单id
* @param nowRepairId 当前处理人id
* @param nowRepairName 当前处理人名称
* @author PQZ
* @date 16:30 2024/11/13
**/
private void setTicketItem(String ticketId, Long nowRepairId, String nowRepairName) {
//查询所有维修工
List<RepairWorker> list = repairWorkerService.list();
//查询当前工单下所有项目
LambdaQueryWrapper<DlRepairTitem> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(DlRepairTitem::getTicketId, ticketId);
List<DlRepairTitem> itemList = titemService.list(lambdaQueryWrapper);
//过滤出不包括当前指派人的值
List<DlRepairTitem> filterList = itemList.stream().filter(item -> !item.getRepairNames().contains(nowRepairName)).collect(Collectors.toList());
List<DlRepairTitem> saveList = new ArrayList<>();
//当前处理人工作组
Map<Long, RepairWorker> workerMap = list.stream().collect(Collectors.toMap(RepairWorker::getUserId, worker -> worker));
String workType = workerMap.get(nowRepairId).getWorkType();
filterList.forEach(item -> {
//深拷贝
DlRepairTitem saveItem = BeanUtils.toBean(item, DlRepairTitem.class);
if (StringUtils.isNotEmpty(saveItem.getRepairIds())) {
//取出用户id
List<Long> repairIds = Arrays.stream(saveItem.getRepairIds().split(",")).map(Long::parseLong).collect(Collectors.toList());
repairIds.forEach(idItem -> {
// 获取对应的 worker
RepairWorker worker = workerMap.get(idItem);
// 检查 worker 是否存在并比较 workType
if (worker != null && workType.equals(worker.getWorkType())) {
saveList.add(saveItem);
return;
}
});
}
});
saveList.forEach(item -> {
String newRepairId = item.getRepairIds() + "," + nowRepairId;
String newRepairName = item.getRepairNames() + "," + nowRepairName;
item.setRepairIds(newRepairId);
item.setRepairNames(newRepairName);
});
titemService.updateBatchById(saveList);
}
/**
* 更新工单状态(针对开始施工施工中记录施工完成)
*
@ -1192,7 +1250,11 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
repairTicketsReqVO.setSelectType("special");
// 维修服务顾问
if (userRoleCode.equals(RepairRoleEnum.ADVISOR.getCode())) {
repairTicketsReqVO.setNowRepairId(loginUserId);
// 查所有的服务顾问
List<UserDTO> userDTOS = roleApi.selectUserListByRoleCode(TenantContextHolder.getRequiredTenantId(), RepairRoleEnum.ADVISOR.getCode());
List<Long> ids = userDTOS.stream().map(UserDTO::getId).collect(Collectors.toList());
repairTicketsReqVO.setNowRepairIds(ids);
// repairTicketsReqVO.setNowRepairId(loginUserId);
// 因为完成状态需要在交车之后所以注掉这个
// repairTicketsReqVO.setIsFinish("1");
} else if (userRoleCode.equals(RepairRoleEnum.INSPECTION.getCode())) {
@ -1407,6 +1469,29 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
repairRecordsService.saveRepairRecord(noticeCusVO.getId(), null, RecordTypeEnum.TZQC.getCode(), recordStr, null);
}
/**
* 判断是否工单子表的任何一个类目没有价格或价格为0
*
* @param id 工单ID
* @author 小李
* @date 15:00 2024/11/16
**/
@Override
public Boolean hasPrice(String id) {
List<DlRepairTitem> titems = titemService.list(new LambdaQueryWrapper<DlRepairTitem>().in(DlRepairTitem::getTicketId, id));
for (DlRepairTitem item : titems) {
// 如果有为空的直接报错
if (ObjectUtil.isEmpty(item.getItemPrice())) {
throw exception0(500, "工单中有项目或配件没有设置价格,请服务顾问填写项目价格,仓库填写配件价格");
}
// 如果有为0的那就提示让操作人选择
if (item.getItemPrice().equals(new BigDecimal("0.00"))){
return false;
}
}
return true;
}
/**
* 重新计算工单的一些数值子表也要重新计算
*
@ -1428,7 +1513,8 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
titem.setId(item.getId());
// 取出折扣
BigDecimal discount = item.getItemDiscount() == null ? new BigDecimal("1") : item.getItemDiscount();
titem.setItemMoney(item.getItemPrice().multiply(BigDecimal.valueOf(item.getItemCount())).multiply(discount));
BigDecimal itemPrice = item.getItemPrice() == null ? BigDecimal.ZERO : item.getItemPrice();
titem.setItemMoney(itemPrice.multiply(BigDecimal.valueOf(item.getItemCount())).multiply(discount));
return titem;
}).collect(Collectors.toList());
// 更新
@ -1637,6 +1723,28 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
// 记录操作日志
repairRecordsService.saveRepairRecord(id, null, RecordTypeEnum.SCGG.getCode(), null, null);
}
/**
* 服务顾问交车
*
* @param respVO
* @author vinjor-M
* @date 16:51 2024/11/13
**/
@Override
public void overOrder(DlRepairTicketsRespVO respVO) {
// 更新工单状态
baseMapper.update(new LambdaUpdateWrapper<DlRepairTickets>()
.set(DlRepairTickets::getTicketsWorkStatus, TicketsWorkStatusEnum.END.getCode())
.set(DlRepairTickets::getTicketsStatus, TicketsStatusEnum.OVER.getCode())
//交车时才能把工单置为完成
.set(DlRepairTickets::getIsFinish, "1")
.eq(DlRepairTickets::getId, respVO.getId())
);
// 记录日志
repairRecordsService.saveRepairRecord(respVO.getId(), null, RecordTypeEnum.JC.getCode(), respVO.getRemark(), respVO.getImage());
}
}

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.util.ObjectUtil;
import cn.iocoder.yudao.common.RecordTypeEnum;
import cn.iocoder.yudao.common.RepairRoleEnum;
import cn.iocoder.yudao.common.SoStatusEnum;
@ -201,9 +202,14 @@ public class DlTicketWaresServiceImpl extends ServiceImpl<DlTicketWaresMapper, D
ticketWares.setAdviserId(Long.valueOf(tickets.getAdviserId()));
ticketWares.setAdviserName(tickets.getAdviserName());
// 图片
if (ObjectUtil.isNotEmpty(respVO.getImages())){
ticketWares.setImages(respVO.getImages());
}
baseMapper.insertOrUpdate(ticketWares);
// 新增修改子表
if (CollectionUtil.isNotEmpty(respVO.getItems())){
List<DlTwItem> list = respVO.getItems().stream()
.map(item -> {
DlTwItem twItem = BeanUtil.toBean(item, DlTwItem.class);
@ -216,6 +222,7 @@ public class DlTicketWaresServiceImpl extends ServiceImpl<DlTicketWaresMapper, D
throw exception0(500, "配件列表为空");
}
twItemService.saveOrUpdateBatch(list);
}
// 通知对应的维修服务顾问和总检
// 维修服务顾问即创建工单时选的是谁
@ -319,7 +326,7 @@ public class DlTicketWaresServiceImpl extends ServiceImpl<DlTicketWaresMapper, D
DlTwItem twItem = allTwitems.stream().filter(i -> i.getWaresId().equals(item.getId())).findFirst().orElse(null);
titem.setItemCount(twItem != null ? twItem.getWaresCount() : 0);
titem.setItemUnit(item.getUnit());
titem.setItemPrice(item.getPrice() != null ? item.getPrice() : BigDecimal.ZERO);
titem.setItemPrice((item.getPrice() != null) ? item.getPrice() : BigDecimal.ZERO);
titem.setItemDiscount(BigDecimal.ONE);
titem.setItemMoney(titem.getItemPrice().multiply(BigDecimal.valueOf(titem.getItemCount())).multiply(titem.getItemDiscount()));
titem.setRepairIds(String.valueOf(ticketWares.getRepairId()));

View File

@ -6,9 +6,12 @@ import cn.iocoder.yudao.module.project.entity.RepairWares;
import cn.iocoder.yudao.module.project.service.RepairWaresService;
import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO;
import cn.iocoder.yudao.module.tickets.entity.DlTicketWares;
import cn.iocoder.yudao.module.tickets.entity.DlTwItem;
import cn.iocoder.yudao.module.tickets.mapper.DlTwItemMapper;
import cn.iocoder.yudao.module.tickets.service.DlTicketWaresService;
import cn.iocoder.yudao.module.tickets.service.DlTwItemService;
import cn.iocoder.yudao.module.tickets.vo.AddTwiVO;
import cn.iocoder.yudao.module.tickets.vo.DlTwItemReqVO;
import cn.iocoder.yudao.module.tickets.vo.DlTwItemRespVO;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -22,6 +25,7 @@ import java.util.Map;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.common.RepairCons.DICT_REPAIR_UNIT;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0;
/**
* 针对表dl_tw_item(工单配件申请/退回子表)的数据库操作Service实现
@ -40,6 +44,9 @@ public class DlTwItemServiceImpl extends ServiceImpl<DlTwItemMapper, DlTwItem>
@Resource
@Lazy
private RepairWaresService waresService;
@Resource
@Lazy
private DlTicketWaresService ticketWaresService;
/**
* 根据主表查看全部
@ -78,6 +85,34 @@ public class DlTwItemServiceImpl extends ServiceImpl<DlTwItemMapper, DlTwItem>
}
return null;
}
/**
* 给配件申请表子表添加数据
*
* @author 小李
* @date 17:47 2024/11/13
* @param addTwiVO 对象
**/
@Override
public void addTwi(AddTwiVO addTwiVO){
// 构建子表数据
if (CollectionUtil.isEmpty(addTwiVO.getItems())){
throw exception0(500, "请选择配件");
}
List<DlTwItem> twItems = addTwiVO.getItems().stream().map(item -> {
DlTwItem twItem = new DlTwItem();
twItem.setTwId(addTwiVO.getId());
twItem.setWaresId(item.getId());
twItem.setWaresName(item.getName());
twItem.setWaresCount(item.getCount());
twItem.setWaresAlreadyCount(0);
twItem.setWaresStatus("");
twItem.setRemark(item.getRemark());
return twItem;
}).collect(Collectors.toList());
// 新增
baseMapper.insert(twItems);
}
}

View File

@ -0,0 +1,42 @@
package cn.iocoder.yudao.module.tickets.vo;
import lombok.Data;
import java.util.List;
/**
* 给配件申请表子表添加数据
*
* @author 小李
* @date 17:41 2024/11/13
**/
@Data
public class AddTwiVO {
private String id;
private List<AddTwiVoItem> items;
/**
* 配件的信息
*
* @author 小李
* @date 17:45 2024/11/13
**/
@Data
public static class AddTwiVoItem {
/** 配件ID */
private String id;
/** 配件名称 */
private String name;
/** 配件数量 */
private Integer count;
/** 备注 */
private String remark;
}
}

View File

@ -36,4 +36,7 @@ public class DlRepairTicketsReqVO extends DlRepairTickets {
/** 图片路径 */
private String image;
/** 当前操作人包含集合,主要用在服务顾问那儿 */
private List<Long> nowRepairIds;
}

View File

@ -216,7 +216,7 @@
from dl_repair_tickets drt
left join dl_repair_titem drti
on drt.id = drti.ticket_id AND drti.deleted = '0'
where (drt.deleted = '0') AND drt.tickets_status IN ('04','05','01','07')
where (drt.deleted = '0') AND drt.tickets_status IN ('04','05','01','07','06','02')
<if test="map.ticketNo != null and map.ticketNo != ''">
and (
drt.ticket_no like concat('%', #{map.ticketNo}, '%')
@ -235,13 +235,23 @@
</if>
<choose>
<when test="map.selectType=='special'">
-- 小李用的逻辑 --
<if test="map.isFinish != null and map.isFinish != ''">
-- 小李用的逻辑--isFinish不需要了 --
<!-- <if test="map.isFinish != null and map.isFinish != ''">
AND ( drt.is_finish = #{map.isFinish})
</if>
</if> -->
-- 总检查待处理还是用这个 --
<if test="map.nowRepairId != null and map.nowRepairId != ''">
AND ( drt.now_repair_id = #{map.nowRepairId})
</if>
-- 服务顾问查待处理(服务顾问之间可以相互查) --
<if test="map.nowRepairIds != null and map.nowRepairIds.size > 0">
AND (
drt.now_repair_id in
<foreach collection="map.nowRepairIds" item="id" open="(" separator="," close=")">
#{id}
</foreach>
)
</if>
</when>
<otherwise>
-- 正常查询用的逻辑 --
@ -255,10 +265,11 @@
)
</when>
<otherwise>
-- 服务顾问和仓管查待办都是查未结束的工单 --
AND drt.is_finish = '0'
<if test="map.adviserId != null and map.adviserId != ''">
-- 查服务顾问 待处理的 工单未完成并且服务顾问是自己的 工单已完成且当前处理人是自己的--
AND ( drt.is_finish = '0' AND drt.adviser_id = #{map.adviserId} )
OR (drt.is_finish = '1' AND drt.now_repair_id = #{map.adviserId})
-- 查服务顾问 当前处理人或服务顾问是自己的--
AND ( drt.adviser_id = #{map.adviserId} OR drt.now_repair_id = #{map.adviserId})
</if>
<if test="map.userIds != null and map.userIds.size > 0">
-- 查总检待处理的 --

View File

@ -21,6 +21,7 @@
<result property="status" column="status" jdbcType="VARCHAR"/>
<result property="remark" column="remark" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" />
<result property="images" column="images" />
</resultMap>
<sql id="Base_SQL">
@ -40,7 +41,8 @@
dtw.adviser_name,
dtw.status,
dtw.remark,
dtw.create_time
dtw.create_time,
dtw.images
from dl_ticket_wares dtw
left join dl_repair_tickets drt
on dtw.ticket_id = drt.id