package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.constants.ApprovalApplicationCodePrefix;
import com.ruoyi.system.dto.AddAssetRepairRequestDTO;
import com.ruoyi.system.model.AssetMain;
import com.ruoyi.system.model.AssetRepairRequest;
import com.ruoyi.system.model.AssetRepairRequestItem;
import com.ruoyi.system.model.AssetType;
import com.ruoyi.system.query.AssetRepairRequestListQuery;
import com.ruoyi.system.service.AssetMainService;
import com.ruoyi.system.service.AssetRepairRecordService;
import com.ruoyi.system.service.AssetRepairRequestItemService;
import com.ruoyi.system.service.AssetRepairRequestService;
import com.ruoyi.system.service.AssetTypeService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.OaApprovalApplicationAssetItemService;
import com.ruoyi.system.service.TDeptService;
import com.ruoyi.system.vo.AssetRepairListVO;
import com.ruoyi.system.vo.AssetRepairRequestVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
*
* 资产报修主表 前端控制器
*
*
* @author WuGuanFengYue
* @since 2025-09-15
*/
@RestController
@RequestMapping("/asset-repair-request")
@Api(tags = {"资产报修"})
public class AssetRepairRequestController {
@Resource
private AssetRepairRecordService assetRepairRecordService;
@Resource
private AssetRepairRequestService assetRepairRequestService;
@Resource
private OaApprovalApplicationAssetItemService approvalApplicationAssetItemService;
@Resource
private AssetRepairRequestItemService assetRepairRequestItemService;
@Autowired
private TokenService tokenService;
@Autowired
private TDeptService deptService;
@Autowired
private ISysUserService sysUserService;
@Resource
private AssetMainService assetMainService;
@Autowired
private AssetTypeService assetTypeService;
@ApiOperation("资产报修分页列表")
@PostMapping("/pageList")
public R> pageList(@RequestBody AssetRepairRequestListQuery query) {
String deptId = tokenService.getLoginUser().getDeptId();
List deptIds = deptService.getAllSubDeptIds(deptId);
if (deptIds.isEmpty()) {
return R.ok(new PageInfo<>());
} else {
query.setDeptIds(deptIds);
List userIds = sysUserService.selectAllList().stream().filter(e -> deptIds.contains(Integer.valueOf(e.getDeptId())))
.map(SysUser::getUserId).collect(Collectors.toList());
if (userIds.isEmpty()){
return R.ok(new PageInfo<>());
}
}
return R.ok(assetRepairRecordService.pageList(query));
}
@ApiOperation("资产报修不分页列表")
@PostMapping("/listAll")
public R> listAll(@RequestBody AssetRepairRequestListQuery query) {
String deptId = tokenService.getLoginUser().getDeptId();
List deptIds = deptService.getAllSubDeptIds(deptId);
if (deptIds.isEmpty()) {
return R.ok(new ArrayList<>());
} else {
query.setDeptIds(deptIds);
List userIds = sysUserService.selectAllList().stream().filter(e -> deptIds.contains(Integer.valueOf(e.getDeptId())))
.map(SysUser::getUserId).collect(Collectors.toList());
if (userIds.isEmpty()){
return R.ok(new ArrayList<>());
}
}
List assetMainIds = assetMainService.lambdaQuery().in(AssetMain::getOwnershipDeptId, deptIds).list()
.stream().map(AssetMain::getId).collect(Collectors.toList());
if (assetMainIds.isEmpty()){
return R.ok(new ArrayList<>());
}
query.setAssetMainIds(assetMainIds);
return R.ok(assetRepairRecordService.listAll(query));
}
@Log(title = "资产报修-新增", businessType = BusinessType.INSERT)
@ApiOperation(value = "资产报修新增")
@PostMapping(value = "/add")
public R add(@RequestBody AddAssetRepairRequestDTO dto) {
dto.setRepairNo(generateRepairNo());
Long userId = tokenService.getLoginUser().getUserId();
dto.setReporterId(userId.intValue());
assetRepairRequestService.save(dto);
for (AssetRepairRequestItem assetRepairRequestItem : dto.getList()) {
assetRepairRequestItem.setRepairRequestId(dto.getId());
}
assetRepairRequestItemService.saveBatch(dto.getList());
return R.ok();
}
/**
* 生成维修单号
* 格式:WX + 日期 + 4位序号
*/
private String generateRepairNo() {
String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
// 查询当天已生成的维修单号数量
Long count = assetRepairRequestService.lambdaQuery()
.likeRight(AssetRepairRequest::getRepairNo, ApprovalApplicationCodePrefix.ASSET_REPAIR_REQUEST)
.ge(AssetRepairRequest::getCreateTime, LocalDate.now().atStartOfDay())
.lt(AssetRepairRequest::getCreateTime, LocalDate.now().plusDays(1).atStartOfDay())
.count();
// 生成4位序号,从0001开始
int sequence = (count != null ? count.intValue() : 0) + 1;
String sequenceStr = String.format("%04d", sequence);
return ApprovalApplicationCodePrefix.ASSET_REPAIR_REQUEST + dateStr + sequenceStr;
}
@Log(title = "资产报修-编辑", businessType = BusinessType.UPDATE)
@ApiOperation(value = "资产报修编辑")
@PostMapping(value = "/update")
public R update(@RequestBody AddAssetRepairRequestDTO dto) {
assetRepairRequestService.updateById(dto);
assetRepairRequestItemService.remove(new LambdaQueryWrapper()
.eq(AssetRepairRequestItem::getRepairRequestId, dto.getId()));
assetRepairRequestItemService.saveBatch(dto.getList());
return R.ok();
}
@ApiOperation(value = "资产报修详情")
@GetMapping(value = "/detail")
public R detail(Integer id) {
AddAssetRepairRequestDTO res = new AddAssetRepairRequestDTO();
AssetRepairRequest assetRepairRequest = assetRepairRequestService.getById(id);
BeanUtils.copyProperties(assetRepairRequest, res);
//查询类型名称
AssetType assetType = assetTypeService.getById(assetRepairRequest.getAssetTypeId());
if (Objects.nonNull(assetType)) {
res.setAssetTypeName(assetType.getTypeName());
}
List items = assetRepairRequestItemService.listDetail(id);
res.setListDetail(items);
SysUser sysUser = sysUserService.selectUserById(Long.valueOf(assetRepairRequest.getReporterId()));
if (sysUser!=null){
res.setReporterName(sysUser.getNickName());
}
return R.ok(res);
}
@Log(title = "资产报修-删除", businessType = BusinessType.DELETE)
@ApiOperation(value = "资产报修-删除")
@DeleteMapping(value = "/delete")
public R delete(@RequestParam String ids) {
assetRepairRequestItemService.remove(new LambdaQueryWrapper()
.in(AssetRepairRequestItem::getRepairRequestId, Arrays.asList(ids.split(","))));
assetRepairRequestService.removeBatchByIds(Arrays.asList(ids.split(",")));
return R.ok();
}
}