# Conflicts:
#	dl-module-base/src/main/java/cn/iocoder/yudao/module/custom/service/impl/UserCarServiceImpl.java
This commit is contained in:
lzttt 2024-10-12 17:58:24 +08:00
commit dbc65a28a7
28 changed files with 501 additions and 293 deletions

View File

@ -23,6 +23,8 @@ public class BaseConstants {
public static final String TABLE_BASE_CAR_MAIN = "base_car_main";
/**新增标识*/
public static final String SIGN_CREATE = "create";
/**邀请注册/授权给某个租户*/
public static final String INVITE_CREATE = "invite_create";
/**编辑标识*/
public static final String SIGN_UPDATE = "update";
/**默认密码*/

View File

@ -0,0 +1,32 @@
package cn.iocoder.yudao.common;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 邀请者类型枚举
*
* @author vinjor
*/
@AllArgsConstructor
@Getter
public enum InviterTypeEnum {
/**
* 员工邀请
*/
STAFF("1","员工邀请"),
/**
* 客户邀请
*/
CUSTOMER("2","客户邀请");
/**
* code
*/
private String code;
/**
* 名称
*/
private String name;
}

View File

@ -0,0 +1,28 @@
package cn.iocoder.yudao.common;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 推广渠道枚举
*
* @author vinjor
*/
@AllArgsConstructor
@Getter
public enum PromotionEnum {
/**
* 微信小程序
*/
WeChat("WeChat","微信小程序");
/**
* code
*/
private String code;
/**
* 名称
*/
private String name;
}

View File

@ -4,9 +4,9 @@ import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* Bpm 消息的枚举
* 系统枚举
*
* @author 芋道源码
* @author vinjor-m
*/
@AllArgsConstructor
@Getter

View File

@ -22,12 +22,4 @@ public interface BasePromotionService extends IService<BasePromotion> {
* @param page 分页规则
**/
IPage<BasePromotionRespVO> queryListPage(BasePromotionReqVO pageReqVO, Page<BasePromotion> page);
/**
* 新增推广记录
* @author 小李
* @date 12:26 2024/8/14
* @param promotionRespVO 新增对象
**/
Boolean createPromotion(BasePromotionRespVO promotionRespVO);
}

View File

@ -1,6 +1,5 @@
package cn.iocoder.yudao.module.custom.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.iocoder.yudao.module.custom.entity.BasePromotion;
import cn.iocoder.yudao.module.custom.mapper.BasePromotionMapper;
import cn.iocoder.yudao.module.custom.service.BasePromotionService;
@ -18,7 +17,6 @@ import org.springframework.stereotype.Service;
**/
@Service
public class BasePromotionServiceImpl extends ServiceImpl<BasePromotionMapper, BasePromotion> implements BasePromotionService {
/**
* 分页查询推广记录
*
@ -30,17 +28,4 @@ public class BasePromotionServiceImpl extends ServiceImpl<BasePromotionMapper, B
public IPage<BasePromotionRespVO> queryListPage(BasePromotionReqVO pageReqVO, Page<BasePromotion> page) {
return baseMapper.queryListPage(pageReqVO, page);
}
/**
* 新增推广记录
* @author 小李
* @date 12:26 2024/8/14
* @param promotionRespVO 新增对象
**/
@Override
public Boolean createPromotion(BasePromotionRespVO promotionRespVO){
BasePromotion basePromotion = new BasePromotion();
BeanUtil.copyProperties(promotionRespVO, basePromotion);
return baseMapper.insert(basePromotion) > 0;
}
}

View File

@ -34,14 +34,15 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static cn.iocoder.yudao.common.BaseConstants.*;
import static cn.iocoder.yudao.common.DictBaseConstants.DICT_CUS_TYPE;
@ -113,6 +114,8 @@ public class CustomerMainServiceImpl extends ServiceImpl<CustomerMainMapper, Cus
if (SIGN_CREATE.equals(sign)){
//查询数据字典根据客户类型匹配出预设角色code
DictDataRespDTO dict = dictDataApi.getDictData(DICT_CUS_TYPE, main.getTypeCode());
//查客户调用租户为null的查询---未来启用多租户的时候放开 TODO
// AdminUserRespDTO userDTO = adminUserApi.getUserByUsernameNoTenantId(saveReqVO.getPhoneNumber());
AdminUserRespDTO userDTO = adminUserApi.getUserByUsername(saveReqVO.getPhoneNumber());
user = BeanUtils.toBean(userDTO, UserDTO.class);
//存在两种情况一是该用户已经注册二是该用户未注册
@ -150,6 +153,7 @@ public class CustomerMainServiceImpl extends ServiceImpl<CustomerMainMapper, Cus
}
DeptRespDTO parentDept = deptApi.getDeptByName(deptName);
user.setDeptId(parentDept.getId());
main.setDeptCode(parentDept.getId());
}
//创建客户
userId = adminUserApi.createUser(user);
@ -163,8 +167,38 @@ public class CustomerMainServiceImpl extends ServiceImpl<CustomerMainMapper, Cus
Set<String> roleCodes = new HashSet<>();
roleCodes.add(dict.getRemark());
permissionApi.assignUserRole(userId, roleCodes);
}else if(INVITE_CREATE.equals(sign)){
//邀请注册/授权给某个租户
//查询数据字典根据客户类型匹配出预设角色code
DictDataRespDTO dict = dictDataApi.getDictData(DICT_CUS_TYPE, main.getTypeCode());
if (CUS_TYPE_CORP.equals(main.getTypeCode())) {
//查询当前登录用户所属租户的政企客户部门id父级部门
DeptRespDTO parentDept = deptApi.getDeptByName(DEPT_NAME_CORP_NAME);
//在部门表下新增一个部门
DeptRespDTO deptRespDTO = new DeptRespDTO();
deptRespDTO.setName(main.getCusName());
deptRespDTO.setStatus(CommonStatusEnum.ENABLE.getStatus());
//上级部门为本租户顶级部门
deptRespDTO.setParentId(parentDept.getId());
Long deptId = deptApi.saveDept(deptRespDTO);
//客户信息表绑定deptCode
main.setDeptCode(deptId);
}else{
//私人客户和代办客户归属到默认的部门中
String deptName = "";
if(CUS_TYPE_PRIVATE.equals(main.getTypeCode())){
deptName =DEPT_NAME_PRIVATE_NAME;
}else if(CUS_TYPE_AGENT.equals(main.getTypeCode())){
deptName = DEPT_NAME_AGENT_NAME;
}
DeptRespDTO parentDept = deptApi.getDeptByName(deptName);
main.setDeptCode(parentDept.getId());
}
//绑定角色
Set<String> roleCodes = new HashSet<>();
roleCodes.add(dict.getRemark());
permissionApi.assignUserRole(main.getUserId(), roleCodes);
}
/*3、保存客户主表信息*/
//暂时写死会员id TODO
main.setMemberLevelId("9d4567b7e68803933f4917a4aab6b745");

View File

@ -1,15 +1,17 @@
package cn.iocoder.yudao.module.staff.service;
import cn.iocoder.yudao.module.staff.entity.CompanyStaff;
import cn.iocoder.yudao.module.label.entity.Label;
import cn.iocoder.yudao.module.staff.entity.CompanyStaff;
import cn.iocoder.yudao.module.staff.vo.CompanyStaffReqVO;
import cn.iocoder.yudao.module.staff.vo.CompanyStaffRespVO;
import cn.iocoder.yudao.module.system.api.permission.dto.RoleReqDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.validation.Valid;
import java.util.Date;
import java.util.List;
/**
@ -110,4 +112,15 @@ public interface CompanyStaffService extends IService<CompanyStaff> {
* @date 14:53 2024/8/14
**/
List<RoleReqDTO> getRoleList();
/**
* 新增推广记录
* @author vinjor-m
* @date 12:26 2024/8/14
* @param uniqueCode 推广码
* @param user 被推广用户
* @param promotionChannel 推广渠道
* @param registerTime 被推广用户注册的时间
**/
Boolean createPromotion(String uniqueCode, AdminUserDO user, String promotionChannel, Date registerTime);
}

View File

@ -4,7 +4,14 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.common.BaseConstants;
import cn.iocoder.yudao.common.CommonErrorCodeConstants;
import cn.iocoder.yudao.common.InviterTypeEnum;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
import cn.iocoder.yudao.module.custom.entity.BasePromotion;
import cn.iocoder.yudao.module.custom.service.BasePromotionService;
import cn.iocoder.yudao.module.custom.service.CustomerMainService;
import cn.iocoder.yudao.module.custom.vo.CustomerMainSaveReqVO;
import cn.iocoder.yudao.module.label.entity.BusiLabel;
import cn.iocoder.yudao.module.label.entity.Label;
import cn.iocoder.yudao.module.label.service.BusiLabelService;
@ -24,13 +31,14 @@ import cn.iocoder.yudao.module.system.api.permission.dto.RoleReqDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.system.api.user.dto.UserDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.context.annotation.Lazy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@ -38,10 +46,12 @@ import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.Period;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.common.BaseConstants.INVITE_CREATE;
import static cn.iocoder.yudao.framework.common.config.CommonStr.USER_TYPE_STAFF;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -80,6 +90,10 @@ public class CompanyStaffServiceImpl extends ServiceImpl<CompanyStaffMapper, Com
@Resource
private PermissionApi permissionApi;
@Autowired
private BasePromotionService basePromotionService;
@Resource
private CustomerMainService customerMainService;
/**
* 获得企业管理-员工信息表分页
@ -512,4 +526,60 @@ public class CompanyStaffServiceImpl extends ServiceImpl<CompanyStaffMapper, Com
public List<RoleReqDTO> getRoleList() {
return roleApi.getRoleList();
}
/**
* 新增推广记录---忽略租户
*
* @param uniqueCode 推广码
* @param user 被推广用户
* @param promotionChannel 推广渠道
* @param registerTime 被推广用户注册的时间
* @author vinjor-m
* @date 12:26 2024/8/14
**/
@Override
@TenantIgnore
public Boolean createPromotion(String uniqueCode, AdminUserDO user, String promotionChannel, Date registerTime) {
/*1.先查是否是员工推广 */
LambdaQueryWrapper<CompanyStaff> queryWrapper = new LambdaQueryWrapper<CompanyStaff>()
.eq(CompanyStaff::getUniqueCode,uniqueCode);
List<CompanyStaff> staffList = this.list(queryWrapper);
if(!staffList.isEmpty()){
//员工推广
CompanyStaff staff = staffList.get(0);
// 插入推广记录
BasePromotion basePromotion = new BasePromotion();
basePromotion.setOldUserId(staff.getUserId());
basePromotion.setOldUserName(staff.getName());
basePromotion.setPromotionChannel(promotionChannel);
basePromotion.setNewUserId(user.getId());
basePromotion.setNewUserName(user.getNickname());
basePromotion.setRegisterTime(registerTime);
basePromotion.setUniqueCode(uniqueCode);
basePromotionService.save(basePromotion);
//取到该员工的租户以该租户的角度去保存客户数据
TenantUtils.execute(staff.getTenantId(), () -> {
CustomerMainSaveReqVO saveReqVO = new CustomerMainSaveReqVO();
saveReqVO.setUserId(user.getId());
saveReqVO.setPhoneNumber(user.getMobile());
saveReqVO.setSex(user.getSex().toString());
saveReqVO.setCusName(user.getNickname());
//客户类型统一为私人客户
saveReqVO.setTypeCode("01");
//客户来源统一为04-维修
saveReqVO.setDataFrom("04");
//注册方式统一为自主创建
saveReqVO.setInviterType("01");
//邀请者id
saveReqVO.setInviter(staff.getUserId().toString());
//邀请者类型
saveReqVO.setInviterType(InviterTypeEnum.STAFF.getCode());
//邀请注册添加客户
customerMainService.saveCustomer(saveReqVO,INVITE_CREATE);
});
}else{
/*2.不是员工推广,再查是否是客户推广*/
}
return true;
}
}

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.app.wechat.controller;
package cn.iocoder.yudao.module.wechat.controller;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.app.wechat.service.WechatService;
import cn.iocoder.yudao.module.wechat.service.WechatService;
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthLoginReqVO;
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthLoginRespVO;
import cn.iocoder.yudao.module.system.service.auth.AdminAuthService;

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.module.app.wechat.service;
package cn.iocoder.yudao.module.wechat.service;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;

View File

@ -1,10 +1,12 @@
package cn.iocoder.yudao.module.app.wechat.service.impl;
package cn.iocoder.yudao.module.wechat.service.impl;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.common.PromotionEnum;
import cn.iocoder.yudao.common.SystemEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.app.wechat.service.WechatService;
import cn.iocoder.yudao.module.staff.service.CompanyStaffService;
import cn.iocoder.yudao.module.wechat.service.WechatService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO;
@ -18,6 +20,7 @@ import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@ -40,6 +43,8 @@ public class WechatServiceImpl implements WechatService {
private AdminUserService userService;
@Resource
private PasswordEncoder passwordEncoder;
@Autowired
private CompanyStaffService companyStaffService;
/**
* 微信自动登录
*
@ -159,8 +164,10 @@ public class WechatServiceImpl implements WechatService {
wxUser.setUsername(user.getUsername());
wxUser.setNickname(user.getNickname());
}
/*如果携带了邀请码,需要插入邀请记录并自动复制用户信息到邀请者的租户下 */
if(!StringUtils.isEmpty(inviteId)){
//那邀请者的码查邀请者的信息
//邀请注册自动注册客户信息
companyStaffService.createPromotion(inviteId,wxUser, PromotionEnum.WeChat.getCode(), new Date());
}
return wxUser;
}

View File

@ -29,30 +29,8 @@
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.2</version>
<version>1.10.0</version>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.4.0</version>
</dependency>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>dl-module-knowledge</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-module-infra-biz</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>

View File

@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.security.config.SecurityProperties;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.app.vo.WxLoginBody;
import cn.iocoder.yudao.module.app.wechat.service.WechatService;
import cn.iocoder.yudao.module.wechat.service.WechatService;
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthLoginRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.service.auth.AdminAuthService;

View File

@ -1,41 +1,27 @@
package cn.iocoder.yudao.module.tickets.controller.admin;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO;
import cn.iocoder.yudao.module.infra.framework.file.core.client.FileClient;
import cn.iocoder.yudao.module.infra.service.file.FileConfigService;
import cn.iocoder.yudao.module.infra.service.file.FileService;
import cn.iocoder.yudao.module.knowledge.constants.Result;
import cn.iocoder.yudao.module.knowledge.controller.requestdto.TOperationDocRequest;
import cn.iocoder.yudao.module.tickets.entity.DlRepairTickets;
import cn.iocoder.yudao.module.tickets.service.DlRepairTicketsService;
import cn.iocoder.yudao.module.tickets.tools.TOperaDocRequestUtil;
import cn.iocoder.yudao.module.tickets.vo.CustomerAndCarVO;
import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsReqVO;
import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsRespVO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tencentcloudapi.ess.v20201111.models.FileInfo;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
/**
* 维修工单表(DlRepairTickets)表控制层
*
* @author 小李
* @date 18:21 2024/9/13
**/
**/
@RestController
@RequestMapping("/repair/tickets")
public class DlRepairTicketsController {
@ -44,26 +30,19 @@ public class DlRepairTicketsController {
*/
@Resource
private DlRepairTicketsService dlRepairTicketsService;
@Autowired
private TOperaDocRequestUtil tOperaDocRequestUtil;
@Autowired
private FileService fileService;
@Resource
private FileConfigService fileConfigService;
/**
* 维修工单表 新增
*
* @param ticketsRespVO 新增对象
* @author 小李
* @date 11:33 2024/9/20
* @param ticketsRespVO 新增对象
**/
**/
@PostMapping("/create")
@Operation(summary = "维修工单表 新增")
public CommonResult<?> createTicket(@RequestBody DlRepairTicketsRespVO ticketsRespVO){
public CommonResult<?> createTicket(@RequestBody DlRepairTicketsRespVO ticketsRespVO) {
dlRepairTicketsService.createTickets(ticketsRespVO);
return CommonResult.ok();
}
@ -71,17 +50,17 @@ public class DlRepairTicketsController {
/**
* 维修工单表 分页
*
* @param repairTicketsReqVO 查询对象
* @param pageNo 页码
* @param pageSize 条数
* @author 小李
* @date 20:51 2024/9/20
* @param repairTicketsReqVO 查询对象
* @param pageNo 页码
* @param pageSize 条数
**/
**/
@GetMapping("/page")
@Operation(summary = "维修工单表 分页")
public CommonResult<?> getTicketsPage(DlRepairTicketsReqVO repairTicketsReqVO,
@RequestParam(value = "pageNo", defaultValue = "1")Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10")Integer pageSize){
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
Page<DlRepairTickets> page = new Page<>(pageNo, pageSize);
return success(dlRepairTicketsService.getTicketsPage(repairTicketsReqVO, page));
}
@ -89,26 +68,26 @@ public class DlRepairTicketsController {
/**
* 获得一个工单的详细信息
*
* @param id 工单ID
* @author 小李
* @date 16:05 2024/9/21
* @param id 工单ID
**/
**/
@GetMapping("/get")
@Operation(summary = "查看一个工单的详细信息")
public CommonResult<?> getTicketsById(@RequestParam("id") String id){
public CommonResult<?> getTicketsById(@RequestParam("id") String id) {
return success(dlRepairTicketsService.getTicketsById(id));
}
/**
* 维修工单表 作废
*
* @param repairTicketsReqVO 工单对象
* @author 小李
* @date 19:46 2024/9/22
* @param repairTicketsReqVO 工单对象
**/
**/
@PostMapping("/void")
@Operation(summary = "维修工单表 作废")
public CommonResult<?> setTicketsVoid(@RequestBody DlRepairTicketsReqVO repairTicketsReqVO){
public CommonResult<?> setTicketsVoid(@RequestBody DlRepairTicketsReqVO repairTicketsReqVO) {
dlRepairTicketsService.setTicketsVoid(repairTicketsReqVO);
return CommonResult.ok();
}
@ -116,49 +95,63 @@ public class DlRepairTicketsController {
/**
* 维修工单表 结算
*
* @param repairTicketsRespVO 工单
* @author 小李
* @date 8:50 2024/9/23
* @param repairTicketsRespVO 工单
**/
**/
@PostMapping("/paid")
@Operation(summary = "维修工单表 结算")
public CommonResult<?> setTicketsPaid(@RequestBody DlRepairTicketsRespVO repairTicketsRespVO){
public CommonResult<?> setTicketsPaid(@RequestBody DlRepairTicketsRespVO repairTicketsRespVO) {
dlRepairTicketsService.setTicketsPaid(repairTicketsRespVO);
return CommonResult.ok();
}
/**
* 维修工单表 导出
*
* @author lzt
* @date 2024年10月11日
* @param file 导出文件
*/
@PostMapping("/print")
@Operation(summary = "维修工单表 导出")
public ResponseEntity<Result<FileInfo>> printDocument(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return ResponseEntity.badRequest().body(new Result<>(null, "文件不能为空"));
}
// /**
// * 维修工单表 导出
// *
// * @param file 导出文件
// * @author lzt
// * @date 2024年10月11日
// */
// @PostMapping("/print")
// @Operation(summary = "维修工单表 导出")
// public ResponseEntity<Result<FileInfo>> printDocument(@RequestParam("file") MultipartFile file) {
// if (file.isEmpty()) {
// return ResponseEntity.badRequest().body(new Result<>(null, "文件不能为空"));
// }
//
// try {
// FileDO fileInfo = fileService.createFileDetail(file.getOriginalFilename(), "/ticket", IoUtil.readBytes(file.getInputStream()));
// return ResponseEntity.ok(new Result<>(fileInfo, "文件上传成功"));
// } catch (Exception e) {
// return ResponseEntity.status(500).body(new Result<>(null, "文件上传失败: " + e.getMessage()));
// }
// }
try {
FileDO fileInfo = fileService.createFileDetail(file.getOriginalFilename(), "/ticket", IoUtil.readBytes(file.getInputStream()));
return ResponseEntity.ok(new Result<>(fileInfo, "文件上传成功"));
} catch (Exception e) {
return ResponseEntity.status(500).body(new Result<>(null, "文件上传失败: " + e.getMessage()));
}
/**
* 维修工单打印
*
* @param response HttpServletResponse
* @param id 维修工单id
* @author PQZ
* @date 13:48 2024/10/12
**/
@GetMapping("/print/{id}")
@Operation(summary = "维修工单打印")
public void printDocument(HttpServletResponse response, @PathVariable String id) {
dlRepairTicketsService.print(response,id);
}
/**
* 客户信息和车辆信息 新增修改
*
* @param customerAndCarVO 用户信息和车辆信息
* @author 小李
* @date 9:25 2024/10/8
* @param customerAndCarVO 用户信息和车辆信息
**/
**/
@PostMapping("/updateUserAndCar")
@Operation(summary = "客户信息和车辆信息 新增、修改")
public CommonResult<?> updateCustomerAndCar(@RequestBody CustomerAndCarVO customerAndCarVO){
public CommonResult<?> updateCustomerAndCar(@RequestBody CustomerAndCarVO customerAndCarVO) {
dlRepairTicketsService.updateCustomerAndCar(customerAndCarVO);
return CommonResult.ok();
}

View File

@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.servlet.http.HttpServletResponse;
/**
* 针对表dl_repair_tickets(维修工单表)的数据库操作Service
*
@ -19,54 +21,64 @@ public interface DlRepairTicketsService extends IService<DlRepairTickets> {
/**
* 维修工单表 新增
*
* @param ticketsRespVO 新增对象
* @author 小李
* @date 11:33 2024/9/20
* @param ticketsRespVO 新增对象
**/
void createTickets(DlRepairTicketsRespVO ticketsRespVO);
/**
* 维修工单表 分页
*
* @param repairTicketsReqVO 查询对象
* @author 小李
* @date 20:51 2024/9/20
* @param repairTicketsReqVO 查询对象
**/
IPage<DlRepairTickets> getTicketsPage(DlRepairTicketsReqVO repairTicketsReqVO, Page<DlRepairTickets> page);
/**
* 获得一个工单的详细信息
*
* @param id 工单ID
* @author 小李
* @date 16:05 2024/9/21
* @param id 工单ID
**/
DlRepairTicketsRespVO getTicketsById(String id);
/**
* 维修工单表 作废
*
* @param repairTicketsReqVO 工单对象
* @author 小李
* @date 19:46 2024/9/22
* @param repairTicketsReqVO 工单对象
**/
void setTicketsVoid(DlRepairTicketsReqVO repairTicketsReqVO);
/**
* 维修工单表 结算
*
* @param repairTicketsRespVO 工单
* @author 小李
* @date 8:50 2024/9/23
* @param repairTicketsRespVO 工单
**/
void setTicketsPaid(DlRepairTicketsRespVO repairTicketsRespVO);
/**
* 客户信息和车辆信息 新增修改
*
* @param customerAndCarVO 用户信息和车辆信息
* @author 小李
* @date 9:25 2024/10/8
* @param customerAndCarVO 用户信息和车辆信息
**/
void updateCustomerAndCar(CustomerAndCarVO customerAndCarVO);
/**
* 打印工单
*
* @param response HttpServletResponse
* @param id String
* @author PQZ
* @date 14:00 2024/10/12
**/
void print(HttpServletResponse response, String id);
}

View File

@ -32,6 +32,7 @@ import cn.iocoder.yudao.module.tickets.entity.DlRepairTitem;
import cn.iocoder.yudao.module.tickets.mapper.DlRepairTicketsMapper;
import cn.iocoder.yudao.module.tickets.service.DlRepairTicketsService;
import cn.iocoder.yudao.module.tickets.service.DlRepairTitemService;
import cn.iocoder.yudao.module.tickets.tools.WordUtil;
import cn.iocoder.yudao.module.tickets.vo.CustomerAndCarVO;
import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsReqVO;
import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsRespVO;
@ -41,13 +42,18 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@ -325,6 +331,34 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
}
}
}
/**
* 打印工单
*
* @param response HttpServletResponse
* @param id String
* @author PQZ
* @date 14:00 2024/10/12
**/
@Override
public void print(HttpServletResponse response, String id) {
Map<String,Object> params = new HashMap<>();
params.put("jobNumber","123456789");
String fileName = "结算单.docx";
String tmpPath = "D:\\"+fileName;
try{
InputStream inputStream = XWPFTemplate.class.getResourceAsStream("/templates/gdmb.docx");
XWPFTemplate template = XWPFTemplate.compile(inputStream);
template.render(params);
FileOutputStream fos = new FileOutputStream(tmpPath);
template.write(fos);
fos.flush();
template.close();
WordUtil.down(response,tmpPath,fileName);
}catch (Exception e){
e.printStackTrace();
}
}
}

View File

@ -1,96 +1,94 @@
package cn.iocoder.yudao.module.tickets.tools;
import cn.iocoder.yudao.module.infra.service.file.FileService;
import cn.iocoder.yudao.module.knowledge.constants.Result;
import cn.iocoder.yudao.module.tickets.controller.admin.DlRepairTicketsController;
import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsReqVO;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.tencentcloudapi.ess.v20201111.models.FileInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import static com.fhs.core.trans.util.ConvertUtil.convert;
/**
* 工单导出工具类
* @author lzt
* @date 9:27 2024年10月11日
*/
@Component(value = "TOperaDocRequestUtil" )
public class TOperaDocRequestUtil {
@Resource
private FileService fileService;
@Value("${minio.bucketName:dev}")
private String bucketName;
public TOperaDocRequestUtil() throws FileNotFoundException {
}
private static String TEMPLATE_PATH = "/templates/gdmb.docx";
@Autowired
private DlRepairTicketsController dlRepairTicketsController;
public FileInfo export(DlRepairTicketsReqVO request) throws IOException {
String fileStr = TEMPLATE_PATH;
if (fileStr != null) {
byte[] inputStream = fileService.downloadFile(bucketName, fileStr);
// 数据循环填充
LoopRowTableRenderPolicy loopRowTableRenderPolicy = new LoopRowTableRenderPolicy();
Configure configure = Configure.builder().bind("czTable", loopRowTableRenderPolicy).build();
// word导出到本地
MultipartFile convert = null;
if (fileStr.contains("gdmb.docx")) {
// 操作模板文件-数据填充
XWPFTemplate template = XWPFTemplate.compile(String.valueOf(inputStream), configure).render(
new HashMap<String, Object>() {{
// 填充数据 TODO
//put("requestData", request);
}}
);
ByteArrayOutputStream outputStreamWord = new ByteArrayOutputStream();;
template.writeAndClose(outputStreamWord);
//IConverter converter = LocalConverter.builder().build();
byte[] bytes = outputStreamWord.toByteArray();
ByteArrayInputStream inputStreamWord = new ByteArrayInputStream(bytes);
ByteArrayOutputStream outputStreamPdf = new ByteArrayOutputStream();
//converter.convert(inputStreamWord).as(DocumentType.DOCX).to(outputStreamPdf).as(DocumentType.PDF).execute();
byte[] bytesPdf = outputStreamPdf.toByteArray();
ByteArrayInputStream inputStreamPdf = new ByteArrayInputStream(bytesPdf);
// convert = new MultipartFile(fileStr.replace(".docx", ".pdf"), "application/pdf", inputStreamPdf.readAllBytes());
convert = new MockMultipartFile("gdmb.pdf", bytes);
}
ResponseEntity<Result<FileInfo>> responseEntity = dlRepairTicketsController.printDocument(convert);
// 获取 Result<FileInfo> 对象
Result<FileInfo> fileupload = responseEntity.getBody();
if (fileupload != null) {
return fileupload.getData();
}
}
return null;
}
}
//package cn.iocoder.yudao.module.tickets.tools;
//
//import cn.iocoder.yudao.module.infra.service.file.FileService;
//import cn.iocoder.yudao.module.knowledge.constants.Result;
//import cn.iocoder.yudao.module.tickets.controller.admin.DlRepairTicketsController;
//import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsReqVO;
//import com.deepoove.poi.XWPFTemplate;
//import com.deepoove.poi.config.Configure;
//import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
//import com.tencentcloudapi.ess.v20201111.models.FileInfo;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.http.ResponseEntity;
//import org.springframework.mock.web.MockMultipartFile;
//import org.springframework.stereotype.Component;
//import org.springframework.web.multipart.MultipartFile;
//
//import javax.annotation.Resource;
//import java.io.ByteArrayInputStream;
//import java.io.ByteArrayOutputStream;
//import java.io.FileNotFoundException;
//import java.io.IOException;
//import java.util.HashMap;
//
//
///**
// * 工单导出工具类
// * @author lzt
// * @date 9:27 2024年10月11日
// */
//@Component(value = "TOperaDocRequestUtil" )
//public class TOperaDocRequestUtil {
//
// @Resource
// private FileService fileService;
// @Value("${minio.bucketName:dev}")
// private String bucketName;
//
// public TOperaDocRequestUtil() throws FileNotFoundException {
// }
//
//
// private static String TEMPLATE_PATH = "/templates/gdmb.docx";
//
// @Autowired
// private DlRepairTicketsController dlRepairTicketsController;
//
// public FileInfo export(DlRepairTicketsReqVO request) throws IOException {
// String fileStr = TEMPLATE_PATH;
//
// if (fileStr != null) {
// byte[] inputStream = fileService.downloadFile(bucketName, fileStr);
//
// // 数据循环填充
// LoopRowTableRenderPolicy loopRowTableRenderPolicy = new LoopRowTableRenderPolicy();
// Configure configure = Configure.builder().bind("czTable", loopRowTableRenderPolicy).build();
//
// // word导出到本地
// MultipartFile convert = null;
// if (fileStr.contains("gdmb.docx")) {
// // 操作模板文件-数据填充
// XWPFTemplate template = XWPFTemplate.compile(String.valueOf(inputStream), configure).render(
// new HashMap<String, Object>() {{
// // 填充数据 TODO
// //put("requestData", request);
//
// }}
// );
// ByteArrayOutputStream outputStreamWord = new ByteArrayOutputStream();;
// template.writeAndClose(outputStreamWord);
// //IConverter converter = LocalConverter.builder().build();
// byte[] bytes = outputStreamWord.toByteArray();
// ByteArrayInputStream inputStreamWord = new ByteArrayInputStream(bytes);
//
// ByteArrayOutputStream outputStreamPdf = new ByteArrayOutputStream();
//
// //converter.convert(inputStreamWord).as(DocumentType.DOCX).to(outputStreamPdf).as(DocumentType.PDF).execute();
// byte[] bytesPdf = outputStreamPdf.toByteArray();
// ByteArrayInputStream inputStreamPdf = new ByteArrayInputStream(bytesPdf);
//
// // convert = new MultipartFile(fileStr.replace(".docx", ".pdf"), "application/pdf", inputStreamPdf.readAllBytes());
// convert = new MockMultipartFile("gdmb.pdf", bytes);
// }
// ResponseEntity<Result<FileInfo>> responseEntity = dlRepairTicketsController.printDocument(convert);
//
// // 获取 Result<FileInfo> 对象
// Result<FileInfo> fileupload = responseEntity.getBody();
// if (fileupload != null) {
// return fileupload.getData();
// }
// }
// return null;
// }
//}

View File

@ -0,0 +1,50 @@
package cn.iocoder.yudao.module.tickets.tools;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
/**
* POI-TL工具类
* @author PQZ
* @date 13:49 2024/10/12
**/
public class WordUtil {
/**模版路径*/
public static String TEMPLATE_PATH = "/templates/gdmb.docx";
public static void down(HttpServletResponse response, String filePath, String fileName) {
String encodeName = null;
try {
encodeName = encodeStr(fileName);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");
response.setHeader("Content-disposition", "attachment; filename=" + encodeName + ";" + "filename*=" + "utf-8''" + encodeName);
response.setHeader("download-filename", encodeName);
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
// 输出流
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());) {
byte[] buff = new byte[1024];
int len = 0;
while ((len = bis.read(buff)) > 0) {
bos.write(buff, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 编码工具方法
*/
public static String encodeStr(String fileName) throws UnsupportedEncodingException {
return URLEncoder.encode(fileName,"UTF-8");
}
}

View File

@ -124,12 +124,6 @@
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId> <!-- 文件客户端:文件类型的识别 -->
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.11.2</version>
<scope>compile</scope>
</dependency>
</dependencies>

View File

@ -5,10 +5,6 @@ import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FileCreateReq
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePageReqVO;
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePresignedUrlRespVO;
import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO;
import org.apache.tomcat.jni.FileInfo;
import org.springframework.web.multipart.MultipartFile;
import javax.xml.ws.Response;
/**
* 文件 Service 接口
@ -67,16 +63,4 @@ public interface FileService {
*/
FilePresignedUrlRespVO getFilePresignedUrl(String path) throws Exception;
/**
* 下载文件
*
* @author lzt
* @date 2024年10月11日
* @param bucketName 存储桶名称
* @param fileName 文件名称
* @return 文件下载响应
*/
byte[] downloadFile(String bucketName, String fileName);
// FileInfo uploadFile(MultipartFile file);
}

View File

@ -144,44 +144,4 @@ public class FileServiceImpl implements FileService {
return BeanUtils.toBean(presignedObjectUrl, FilePresignedUrlRespVO.class,
object -> object.setConfigId(fileClient.getId()));
}
@Override
@SneakyThrows
public byte[] downloadFile(String bucketName, String fileStr) {
// 获取文件存储客户端
FileClient client = fileConfigService.getFileClient(Long.valueOf(bucketName));
Assert.notNull(client, "客户端({}) 不能为空", bucketName);
// 获取文件内容
return client.getContent(fileStr);
}
// @Override
// public FileInfo uploadFile(MultipartFile file) {
// String bucketName = "xxxxx"; // 存储桶名称
// String fileName = file.getOriginalFilename();
//
// try {
// // 上传文件到 OSS
// PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, file.getInputStream());
// ossClient.putObject(putObjectRequest);
//
// // 创建并返回 FileInfo 对象
// FileInfo fileInfo = new FileInfo();
// fileInfo.setFileName(fileName);
// fileInfo.setBucketName(bucketName);
// return fileInfo;
//
// } catch (IOException e) {
// e.printStackTrace();
// throw new RuntimeException("文件上传到 OSS 失败: " + e.getMessage());
// } finally {
// // 关闭 OSS 客户端
// ossClient.shutdown();
// }
// }
}

View File

@ -4,7 +4,6 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.system.api.user.dto.UserDTO;
import javax.validation.Valid;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@ -52,12 +51,19 @@ public interface AdminUserApi {
AdminUserRespDTO getUserByOpenId(String openId,String tenantId);
/**
* 通过用户 登录账户 查询用户
* 通过用户 登录账户 查询用户---自动拼租户
*
* @param username 用户登录账户
* @return 用户对象信息
*/
AdminUserRespDTO getUserByUsername(String username);
/**
* 通过用户 登录账户 查询用户---不带租户
*
* @param username 用户登录账户
* @return 用户对象信息
*/
AdminUserRespDTO getUserByUsernameNoTenantId(String username);
/**
* 通过用户 ID 查询用户下属

View File

@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.system.api.user.dto.UserDTO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO;
@ -80,7 +81,7 @@ public class AdminUserApiImpl implements AdminUserApi {
}
/**
* 通过用户 登录账户 查询用户
* 通过用户 登录账户 查询用户---自动拼租户
*
* @param username 用户登录账户
* @return 用户对象信息
@ -90,6 +91,18 @@ public class AdminUserApiImpl implements AdminUserApi {
AdminUserDO user = userService.getUserByUsername(username);
return BeanUtils.toBean(user, AdminUserRespDTO.class);
}
/**
* 通过用户 登录账户 查询用户---不带租户
*
* @param username 用户登录账户
* @return 用户对象信息
*/
@Override
@TenantIgnore
public AdminUserRespDTO getUserByUsernameNoTenantId(String username) {
AdminUserDO user = userService.getUserByUsernameNoTenantId(username);
return BeanUtils.toBean(user, AdminUserRespDTO.class);
}
@Override
public List<AdminUserRespDTO> getUserListBySubordinate(Long id) {

View File

@ -120,6 +120,13 @@ public interface AdminUserService {
* @return 用户对象信息
*/
AdminUserDO getUserByUsername(String username);
/**
* 通过用户名查询用户---不带租户ID
*
* @param username 用户名
* @return 用户对象信息
*/
AdminUserDO getUserByUsernameNoTenantId(String username);
/**
* 通过手机号获取用户

View File

@ -10,6 +10,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
import cn.iocoder.yudao.module.infra.api.file.FileApi;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
@ -278,6 +280,15 @@ public class AdminUserServiceImpl implements AdminUserService {
return userMapper.selectByUsername(username);
}
@Override
@TenantIgnore
public AdminUserDO getUserByUsernameNoTenantId(String username) {
LambdaQueryWrapper<AdminUserDO> queryWrapper = new LambdaQueryWrapper<AdminUserDO>()
.eq(AdminUserDO::getUsername,username)
.isNull(TenantBaseDO::getTenantId);
return userMapper.selectOne(queryWrapper);
}
@Override
public AdminUserDO getUserByMobile(String mobile) {
return userMapper.selectByMobile(mobile);

View File

@ -237,6 +237,8 @@ yudao:
- /admin-api/rescue/driverLogin
- /admin-api/rescuePayApi/payNotify
- /admin-api/payApi/payNotify
- /repair/tickets/print/**
- /admin-api/repair/tickets/print/**
websocket:
enable: true # websocket的开关
path: /infra/ws # 路径
@ -298,6 +300,8 @@ yudao:
- /admin-api/payApi/payNotify
- /admin-api/base/notice/**
- /app-api/** #小程序端接口,不区分租户
- /repair/tickets/print/**
- /admin-api/repair/tickets/print/**
ignore-tables:
- system_tenant
- system_tenant_package
@ -345,6 +349,7 @@ yudao:
- system_users
- dl_base_notice
- base_user_car
- base_car_brand
ignore-caches:
- permission_menu_ids
- oauth_client

Binary file not shown.