diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaAttendanceController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaAttendanceController.java index 60347af..0b92e22 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaAttendanceController.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaAttendanceController.java @@ -5,6 +5,7 @@ import java.util.Date; import java.util.List; import java.util.Arrays; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.oa.domain.LaborCostData; import com.ruoyi.oa.domain.vo.SysUserVo; @@ -82,9 +83,9 @@ public class SysOaAttendanceController extends BaseController { * 查询人员考勤列表 */ @GetMapping("/worker/list") - public R> workerList(SysOaAttendanceBo bo) { + public TableDataInfo workerList(SysOaAttendanceBo bo, PageQuery pageQuery) { - return R.ok(iSysOaAttendanceService.workerList(bo)); + return iSysOaAttendanceService.workerList(bo); } @@ -144,7 +145,7 @@ public class SysOaAttendanceController extends BaseController { /** * 删除人员考勤 * - * @param ids 主键串 + * @param day 主键串 */ @Log(title = "人员考勤", businessType = BusinessType.DELETE) @DeleteMapping("/all/{day}") diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaFileController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaFileController.java new file mode 100644 index 0000000..e44b2d7 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaFileController.java @@ -0,0 +1,108 @@ +package com.ruoyi.oa.controller; + +import java.util.List; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.core.validate.QueryGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.oa.domain.vo.SysOaFileVo; +import com.ruoyi.oa.domain.bo.SysOaFileBo; +import com.ruoyi.oa.service.ISysOaFileService; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 文件存储 + * + * @author hdka + * @date 2024-12-15 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/oaFile") +public class SysOaFileController extends BaseController { + + private final ISysOaFileService iSysOaFileService; + + /** + * 查询文件存储列表 + */ + @SaCheckPermission("system:oaFile:list") + @GetMapping("/list") + public TableDataInfo list(SysOaFileBo bo, PageQuery pageQuery) { + return iSysOaFileService.queryPageList(bo, pageQuery); + } + + /** + * 导出文件存储列表 + */ + @SaCheckPermission("system:oaFile:export") + @Log(title = "文件存储", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysOaFileBo bo, HttpServletResponse response) { + List list = iSysOaFileService.queryList(bo); + ExcelUtil.exportExcel(list, "文件存储", SysOaFileVo.class, response); + } + + /** + * 获取文件存储详细信息 + * + * @param fileId 主键 + */ + @SaCheckPermission("system:oaFile:query") + @GetMapping("/{fileId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long fileId) { + return R.ok(iSysOaFileService.queryById(fileId)); + } + + /** + * 新增文件存储 + */ + @SaCheckPermission("system:oaFile:add") + @Log(title = "文件存储", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysOaFileBo bo) { + return toAjax(iSysOaFileService.insertByBo(bo)); + } + + /** + * 修改文件存储 + */ + @SaCheckPermission("system:oaFile:edit") + @Log(title = "文件存储", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysOaFileBo bo) { + return toAjax(iSysOaFileService.updateByBo(bo)); + } + + /** + * 删除文件存储 + * + * @param fileIds 主键串 + */ + @SaCheckPermission("system:oaFile:remove") + @Log(title = "文件存储", businessType = BusinessType.DELETE) + @DeleteMapping("/{fileIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] fileIds) { + return toAjax(iSysOaFileService.deleteWithValidByIds(Arrays.asList(fileIds), true)); + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaFile.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaFile.java new file mode 100644 index 0000000..029e87d --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaFile.java @@ -0,0 +1,48 @@ +package com.ruoyi.oa.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 文件存储对象 sys_oa_file + * + * @author hdka + * @date 2024-12-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_oa_file") +public class SysOaFile extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 主键id + */ + @TableId(value = "file_id") + private Long fileId; + /** + * 文件存储路径 + */ + private String fileUrl; + /** + * 文件类型0打卡1出入库 + */ + private Long status; + /** + * 删除标志 + */ + @TableLogic + private Long delFlag; + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaWarehouse.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaWarehouse.java index a08567f..31172ad 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaWarehouse.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaWarehouse.java @@ -35,6 +35,13 @@ public class SysOaWarehouse extends BaseEntity { * 型号 */ private String model; + + /** + * 单价 + */ + private Double price; + + /** * 单位 */ diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaAttendanceBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaAttendanceBo.java index e9e5a8f..c602f16 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaAttendanceBo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaAttendanceBo.java @@ -1,5 +1,6 @@ package com.ruoyi.oa.domain.bo; +import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.validate.AddGroup; import com.ruoyi.common.core.validate.EditGroup; import lombok.Data; @@ -7,6 +8,9 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.*; import com.ruoyi.common.core.domain.BaseEntity; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; /** * 人员考勤业务对象 sys_oa_attendance @@ -56,5 +60,12 @@ public class SysOaAttendanceBo extends BaseEntity { */ private String remark; + /** + * 查询月份 + */ + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date selectTime; + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaFileBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaFileBo.java new file mode 100644 index 0000000..7446a1d --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaFileBo.java @@ -0,0 +1,49 @@ +package com.ruoyi.oa.domain.bo; + +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 文件存储业务对象 sys_oa_file + * + * @author hdka + * @date 2024-12-15 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SysOaFileBo extends BaseEntity { + + /** + * 主键id + */ + @NotNull(message = "主键id不能为空", groups = { EditGroup.class }) + private Long fileId; + + /** + * 文件存储路径 + */ + @NotBlank(message = "文件存储路径不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fileUrl; + + /** + * 文件类型0打卡1出入库 + */ + @NotNull(message = "文件类型0打卡1出入库不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long status; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaWarehouseBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaWarehouseBo.java index b484584..1c71f8a 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaWarehouseBo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaWarehouseBo.java @@ -40,6 +40,11 @@ public class SysOaWarehouseBo extends BaseEntity { */ private String model; + /** + * 单价 + */ + private Double price; + /** * 单位 */ diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaFileVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaFileVo.java new file mode 100644 index 0000000..b8f72ea --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaFileVo.java @@ -0,0 +1,50 @@ +package com.ruoyi.oa.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.convert.ExcelDictConvert; +import lombok.Data; +import java.util.Date; + + + +/** + * 文件存储视图对象 sys_oa_file + * + * @author hdka + * @date 2024-12-15 + */ +@Data +@ExcelIgnoreUnannotated +public class SysOaFileVo { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @ExcelProperty(value = "主键id") + private Long fileId; + + /** + * 文件存储路径 + */ + @ExcelProperty(value = "文件存储路径") + private String fileUrl; + + /** + * 文件类型0打卡1出入库 + */ + @ExcelProperty(value = "文件类型0打卡1出入库", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "file_status") + private Long status; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaWarehouseVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaWarehouseVo.java index 84a4e7e..1843f64 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaWarehouseVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaWarehouseVo.java @@ -47,6 +47,12 @@ public class SysOaWarehouseVo extends SysOaWarehouse { @ExcelProperty(value = "型号") private String model; + /** + * 单价 + */ + @ExcelProperty(value = "单价") + private Double price; + /** * 库存数量 diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaAttendanceMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaAttendanceMapper.java index aa16273..3262786 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaAttendanceMapper.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaAttendanceMapper.java @@ -3,6 +3,7 @@ package com.ruoyi.oa.mapper; import com.ruoyi.oa.domain.SysOaAttendance; import com.ruoyi.oa.domain.vo.SysOaAttendanceVo; import com.ruoyi.common.core.mapper.BaseMapperPlus; +import com.ruoyi.oa.domain.vo.SysUserVo; import org.apache.ibatis.annotations.Param; import java.util.Date; @@ -19,4 +20,6 @@ public interface SysOaAttendanceMapper extends BaseMapperPlus selectVoListAndTime(@Param("userId") Long userId, @Param("firstDay") Date firstDay, @Param("lastDay") Date lastDay); int delOaAttendanceAll(@Param("firstDay") Date firstDay, @Param("lastDay")Date lastDay,@Param("day")Long day); + + List selectUserListAndAttendanceListAndProjectListByUserIds(@Param("userIds") List userIds, @Param("firstDay") Date firstDay,@Param("lastDay") Date lastDay); } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaFileMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaFileMapper.java new file mode 100644 index 0000000..f7bc103 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaFileMapper.java @@ -0,0 +1,15 @@ +package com.ruoyi.oa.mapper; + +import com.ruoyi.oa.domain.SysOaFile; +import com.ruoyi.oa.domain.vo.SysOaFileVo; +import com.ruoyi.common.core.mapper.BaseMapperPlus; + +/** + * 文件存储Mapper接口 + * + * @author hdka + * @date 2024-12-15 + */ +public interface SysOaFileMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaAttendanceService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaAttendanceService.java index ac4f623..9b98880 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaAttendanceService.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaAttendanceService.java @@ -51,10 +51,11 @@ public interface ISysOaAttendanceService { /** * 工人列表 + * * @param bo * @return */ - List workerList(SysOaAttendanceBo bo); + TableDataInfo workerList(SysOaAttendanceBo bo); /** * 批量插入 diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaFileService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaFileService.java new file mode 100644 index 0000000..c2f6af5 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaFileService.java @@ -0,0 +1,49 @@ +package com.ruoyi.oa.service; + +import com.ruoyi.oa.domain.SysOaFile; +import com.ruoyi.oa.domain.vo.SysOaFileVo; +import com.ruoyi.oa.domain.bo.SysOaFileBo; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 文件存储Service接口 + * + * @author hdka + * @date 2024-12-15 + */ +public interface ISysOaFileService { + + /** + * 查询文件存储 + */ + SysOaFileVo queryById(Long fileId); + + /** + * 查询文件存储列表 + */ + TableDataInfo queryPageList(SysOaFileBo bo, PageQuery pageQuery); + + /** + * 查询文件存储列表 + */ + List queryList(SysOaFileBo bo); + + /** + * 新增文件存储 + */ + Boolean insertByBo(SysOaFileBo bo); + + /** + * 修改文件存储 + */ + Boolean updateByBo(SysOaFileBo bo); + + /** + * 校验并批量删除文件存储信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaAttendanceServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaAttendanceServiceImpl.java index 8634d06..2191c9b 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaAttendanceServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaAttendanceServiceImpl.java @@ -23,7 +23,6 @@ import com.ruoyi.oa.domain.SysOaAttendance; import com.ruoyi.oa.mapper.SysOaAttendanceMapper; import com.ruoyi.oa.service.ISysOaAttendanceService; -import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; @@ -146,38 +145,52 @@ public class SysOaAttendanceServiceImpl implements ISysOaAttendanceService { } @Override - public List workerList(SysOaAttendanceBo bo) { + public TableDataInfo workerList(SysOaAttendanceBo bo) { List userIds = sysUserRoleMapper.selectUserIdsByRoleId(1852970465740505090L); - LocalDate localDate = LocalDate.now(); - int year = localDate.getYear(); - int month = localDate.getMonthValue(); - List sysUserVos = new ArrayList<>(); - for (Long userId : userIds) { - SysUserVo sysUser = BeanUtil.toBean(sysUserService.selectUserById(userId), SysUserVo.class); - SysOaAttendanceVo sysOaAttendanceVo = new SysOaAttendanceVo(); - sysOaAttendanceVo.setUserId(sysUser.getUserId()); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + // 如果这个时间为空,则默认查询当月记录 + Date firstDay; + Date lastDay; + if (Objects.isNull(bo.getSelectTime())){ + firstDay = getFirstDay(new Date()); - // 查询当月记录 - lqw.eq(SysOaAttendance::getUserId, userId) - .ge(SysOaAttendance::getCreateTime,LocalDate.of(year,month,1)) - .le(SysOaAttendance::getCreateTime,LocalDate.of(year,month,localDate.lengthOfMonth())); - List sysOaAttendanceVos = baseMapper.selectVoList(lqw); - - List projectVos = new ArrayList<>(); - for (SysOaAttendanceVo oaAttendanceVo : sysOaAttendanceVos) { - // 当projectId等于0时代表 当前为出差状态 - if(oaAttendanceVo.getProjectId()!=0){ - SysOaProjectVo sysOaProjectVo = projectService.queryById(oaAttendanceVo.getProjectId()); - oaAttendanceVo.setColor(sysOaProjectVo.getColor()); - projectVos.add(sysOaProjectVo); - } - } - sysUser.setProjects(projectVos); - sysUser.setAttendances(sysOaAttendanceVos); - sysUserVos.add(sysUser); + }else{ + firstDay = getFirstDay(bo.getSelectTime()); } - return sysUserVos; + lastDay = getLastDay(firstDay); + Page result = new Page<>(); + result.setRecords(baseMapper.selectUserListAndAttendanceListAndProjectListByUserIds(userIds,firstDay,lastDay)); + + // 这个total写当月有多长时间 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(firstDay); + result.setTotal(calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); +// for (Long userId : userIds) { +// SysUserVo sysUser = BeanUtil.toBean(sysUserService.selectUserById(userId), SysUserVo.class); +// SysOaAttendanceVo sysOaAttendanceVo = new SysOaAttendanceVo(); +// sysOaAttendanceVo.setUserId(sysUser.getUserId()); +// LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); +// +// // 查询当月记录 +// lqw.eq(SysOaAttendance::getUserId, userId) +// .ge(SysOaAttendance::getCreateTime,) +// .le(SysOaAttendance::getCreateTime,LocalDate.of(year,month,localDate.lengthOfMonth())); +// List sysOaAttendanceVos = baseMapper.selectVoList(lqw); +// +// List projectVos = new ArrayList<>(); +// for (SysOaAttendanceVo oaAttendanceVo : sysOaAttendanceVos) { +// // 当projectId等于0时代表 当前为出差状态 +// if(oaAttendanceVo.getProjectId()!=0){ +// SysOaProjectVo sysOaProjectVo = projectService.queryById(oaAttendanceVo.getProjectId()); +// oaAttendanceVo.setColor(sysOaProjectVo.getColor()); +// projectVos.add(sysOaProjectVo); +// } +// } +// sysUser.setProjects(projectVos); +// sysUser.setAttendances(sysOaAttendanceVos); +// sysUserVos.add(sysUser); +// } + // 优化查询 + return TableDataInfo.build(result); } @Override diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaFileServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaFileServiceImpl.java new file mode 100644 index 0000000..46add5c --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaFileServiceImpl.java @@ -0,0 +1,110 @@ +package com.ruoyi.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.ruoyi.oa.domain.bo.SysOaFileBo; +import com.ruoyi.oa.domain.vo.SysOaFileVo; +import com.ruoyi.oa.domain.SysOaFile; +import com.ruoyi.oa.mapper.SysOaFileMapper; +import com.ruoyi.oa.service.ISysOaFileService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 文件存储Service业务层处理 + * + * @author hdka + * @date 2024-12-15 + */ +@RequiredArgsConstructor +@Service +public class SysOaFileServiceImpl implements ISysOaFileService { + + private final SysOaFileMapper baseMapper; + + /** + * 查询文件存储 + */ + @Override + public SysOaFileVo queryById(Long fileId){ + return baseMapper.selectVoById(fileId); + } + + /** + * 查询文件存储列表 + */ + @Override + public TableDataInfo queryPageList(SysOaFileBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询文件存储列表 + */ + @Override + public List queryList(SysOaFileBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysOaFileBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getFileUrl()), SysOaFile::getFileUrl, bo.getFileUrl()); + lqw.eq(bo.getStatus() != null, SysOaFile::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增文件存储 + */ + @Override + public Boolean insertByBo(SysOaFileBo bo) { + SysOaFile add = BeanUtil.toBean(bo, SysOaFile.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setFileId(add.getFileId()); + } + return flag; + } + + /** + * 修改文件存储 + */ + @Override + public Boolean updateByBo(SysOaFileBo bo) { + SysOaFile update = BeanUtil.toBean(bo, SysOaFile.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysOaFile entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除文件存储 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-oa/src/main/resources/mapper/oa/SysOaAttendanceMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/SysOaAttendanceMapper.xml index ab77bb2..ac0a755 100644 --- a/ruoyi-oa/src/main/resources/mapper/oa/SysOaAttendanceMapper.xml +++ b/ruoyi-oa/src/main/resources/mapper/oa/SysOaAttendanceMapper.xml @@ -20,6 +20,62 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -48,6 +104,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" group by soa.project_id + + delete from sys_oa_attendance where attendance_day = #{day} diff --git a/ruoyi-oa/src/main/resources/mapper/oa/SysOaWarehouseMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/SysOaWarehouseMapper.xml index f70a888..e804890 100644 --- a/ruoyi-oa/src/main/resources/mapper/oa/SysOaWarehouseMapper.xml +++ b/ruoyi-oa/src/main/resources/mapper/oa/SysOaWarehouseMapper.xml @@ -8,6 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index 588f879..a4bc9ff 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -4,6 +4,7 @@ import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.page.TableDataInfo; +import java.util.Date; import java.util.List; /** diff --git a/ruoyi-system/src/main/resources/mapper/system/SysOaFileMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysOaFileMapper.xml new file mode 100644 index 0000000..97bef92 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysOaFileMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-ui/src/api/oa/oaFile.js b/ruoyi-ui/src/api/oa/oaFile.js new file mode 100644 index 0000000..0494525 --- /dev/null +++ b/ruoyi-ui/src/api/oa/oaFile.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询文件存储列表 +export function listOaFile(query) { + return request({ + url: '/system/oaFile/list', + method: 'get', + params: query + }) +} + +// 查询文件存储详细 +export function getOaFile(fileId) { + return request({ + url: '/system/oaFile/' + fileId, + method: 'get' + }) +} + +// 新增文件存储 +export function addOaFile(data) { + return request({ + url: '/system/oaFile', + method: 'post', + data: data + }) +} + +// 修改文件存储 +export function updateOaFile(data) { + return request({ + url: '/system/oaFile', + method: 'put', + data: data + }) +} + +// 删除文件存储 +export function delOaFile(fileId) { + return request({ + url: '/system/oaFile/' + fileId, + method: 'delete' + }) +} diff --git a/ruoyi-ui/src/components/FileUpload/index.vue b/ruoyi-ui/src/components/FileUpload/index.vue index 4893657..6693e03 100644 --- a/ruoyi-ui/src/components/FileUpload/index.vue +++ b/ruoyi-ui/src/components/FileUpload/index.vue @@ -61,7 +61,7 @@ export default { // 文件类型, 例如['png', 'jpg', 'jpeg'] fileType: { type: Array, - default: () => ["doc", "docx", "xls", "ppt", "txt", "pdf"], + default: () => ["doc", "docx", "xls","pdf","xlsx"], }, // 是否显示提示 isShowTip: { diff --git a/ruoyi-ui/src/utils/currencyFormatter.js b/ruoyi-ui/src/utils/currencyFormatter.js new file mode 100644 index 0000000..14ff4ee --- /dev/null +++ b/ruoyi-ui/src/utils/currencyFormatter.js @@ -0,0 +1,58 @@ +// currencyFormatter.js + +export function numberToCNY(amount) { + if (amount === 0) return '零元整'; + const CN_NUMS = ['', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']; + const CN_INT_UNITS = ['', '拾', '佰', '仟']; + const CN_INT_BASE = ['元', '萬', '億', '兆']; + const CN_DEC_UNITS = ['角', '分']; + const INT_MAX = Math.pow(10, 16) - 1; + + if (amount >= INT_MAX || amount <= -INT_MAX) { + throw new Error('超出支持的金额范围'); + } + + let parts = amount.toString().split('.'); + let integerPart = parts[0]; + let decimalPart = parts[1] || ''; + + // 处理整数部分 + function convertInteger(numStr) { + let result = ''; + let zeros = 0; + let unitPos = 0; + for (let i = numStr.length - 1; i >= 0; i--) { + let num = parseInt(numStr.charAt(i)); + if (num === 0) { + zeros++; + } else { + if (zeros > 0) { + result = '零' + result; + } + zeros = 0; + result = CN_NUMS[num] + CN_INT_UNITS[unitPos % 4] + result; + } + unitPos++; + if (unitPos % 4 === 0 && i > 0) { + result = CN_INT_BASE[Math.floor(unitPos / 4) - 1] + result; + } + } + return result.trim(); + } + + // 处理小数部分 + function convertDecimal(numStr) { + return numStr.split('').map((digit, index) => { + return digit !== '0' ? CN_NUMS[digit] + CN_DEC_UNITS[index] : ''; + }).join(''); + } + + let integerResult = convertInteger(integerPart); + let decimalResult = decimalPart.length > 0 ? convertDecimal(decimalPart) : '整'; + + // 连接整数和小数部分,并确保格式正确 + let finalResult = integerResult.replace(/零+$/, '') + '元' + decimalResult; + finalResult = finalResult.replace(/零+/g, '零'); + + return finalResult; +} diff --git a/ruoyi-ui/src/views/oa/attendance/index.vue b/ruoyi-ui/src/views/oa/attendance/index.vue index 59bcb3e..af0c0b3 100644 --- a/ruoyi-ui/src/views/oa/attendance/index.vue +++ b/ruoyi-ui/src/views/oa/attendance/index.vue @@ -3,7 +3,20 @@ - 签到表 + +
+ 签到表 + + + + +
+
@@ -35,18 +48,20 @@ 取消操作出差 - +
项目列表
-
+
+
{{ item.projectName }}
+
@@ -288,13 +303,14 @@ export default { queryParams: { pageNum: 1, pageSize: 50, + selectTime: new Date(), }, selectArrayIndex: new Date().getDate(), timeFlag: 0, // 项目查询参数 projectQueryParams: { pageNum: 1, - pageSize: 10, + pageSize: 99, projectStatus: 0, projectName: undefined, projectNum: undefined, @@ -310,6 +326,7 @@ export default { calcResultUser: {}, calcResultAttendances: [], calcResultProject: {}, + } }, mounted() { @@ -319,6 +336,17 @@ export default { this.getDate(); this.getList(); }, + computed:{ + sortedProjects() { + let projectList = [...this.projectList]; + projectList.sort((a, b) => { + if (a.color && !b.color) return -1; + if (!a.color && b.color) return 1; + return 0; + }); + return projectList; + } + }, methods: { @@ -403,14 +431,14 @@ export default { getList() { this.loading = true; listOaAttendance(this.queryParams).then(res => { - this.userList = res.data; - this.total = res.total; + this.userList = res.rows; + console.log(this.userList); + this.dateLength = res.total; this.loading = false; }); listProject(this.projectQueryParams).then(response => { this.projectList = response.rows; this.total = response.total; - }) }, diff --git a/ruoyi-ui/src/views/oa/costing/list.vue b/ruoyi-ui/src/views/oa/costing/list.vue index bcb4c21..f71342b 100644 --- a/ruoyi-ui/src/views/oa/costing/list.vue +++ b/ruoyi-ui/src/views/oa/costing/list.vue @@ -259,7 +259,7 @@ @@ -619,6 +619,7 @@ import { listFinancePro, updateFinance, listFinance } from "@/api/oa/finance"; +import {numberToCNY} from "../../../utils/currencyFormatter"; export default { name: "list", @@ -709,6 +710,15 @@ export default { this.getList(); }, methods: { + + updateBigPrice(index, row) { + console.log(index, row); + if (row.price !== '') { + row.bigPrice = numberToCNY(parseFloat(row.price) || 0); + } else { + row.bigPrice = ''; // 如果价格为空,则大写金额也清空 + } + }, /** 查询项目管理列表 */ getList() { this.loading = true; diff --git a/ruoyi-ui/src/views/oa/finance/index.vue b/ruoyi-ui/src/views/oa/finance/index.vue index 49cfd6f..3ba7b39 100644 --- a/ruoyi-ui/src/views/oa/finance/index.vue +++ b/ruoyi-ui/src/views/oa/finance/index.vue @@ -28,12 +28,12 @@ @node-click="handleNodeClick" > - {{ node.label }} + {{ node.label }} + v-model="newChildNode" + v-if="data.isAdd" + ref="addRef" + class="add-new-child-node"> + @click="() => remove(node, data)" v-if="data.parentId===-1"> 删除 @@ -579,7 +579,8 @@ @@ -619,6 +620,7 @@ import { listOaReceiveAccount, updateOaReceiveAccount } from "../../../api/oa/oaReceiveAccount"; +import {numberToCNY} from "../../../utils/currencyFormatter"; export default { name: "Finance", @@ -656,7 +658,7 @@ export default { lableBg: "background: #f0f9eb; width:150px; text-align: center;", //弹出层出入账类型 type: '', - nowTab:"0", + nowTab: "0", // 查询参数 queryParams: { pageNum: 1, @@ -676,8 +678,8 @@ export default { //明细总价 priceSum: 0, //全新节点 - newChildNode:"", - receiveAccountName:"", + newChildNode: "", + receiveAccountName: "", //选项卡标签 activeName: 'first', @@ -729,6 +731,7 @@ export default { } }; }, + created() { /*this.getListOut();*/ // this.getListEnter(); @@ -741,14 +744,29 @@ export default { }, methods: { + updateBigPrice(index, row) { + + if (row.price !== '') { + row.bigPrice = numberToCNY(parseFloat(row.price) || 0); + } else { + row.bigPrice = ''; // 如果价格为空,则大写金额也清空 + } + }, + append(data) { - let newChild = { id: this.receiveAccountList[this.receiveAccountList.length-1].id++, label: '输入名称', children: [],receiveAccountName:"",isAdd:true }; + let newChild = { + id: this.receiveAccountList[this.receiveAccountList.length - 1].id++, + label: '输入名称', + children: [], + receiveAccountName: "", + isAdd: true + }; if (!data.children) { this.$set(data, 'children', []); } newChild.receiveAccountName = newChild.label; newChild.parentId = -1; - addOaReceiveAccount(newChild).then(res=>{ + addOaReceiveAccount(newChild).then(res => { console.log(res) newChild.receiveAccountId = res.data.receiveAccountId }) @@ -773,10 +791,10 @@ export default { handleNodeClick(data) { this.queryParams.receiveAccountId = data.receiveAccountId; - if (this.nowTab==="2"){ + if (this.nowTab === "2") { return; } - let type = this.nowTab=="1"?'0':'1' + let type = this.nowTab == "1" ? '0' : '1' this.handleQuery(type); }, @@ -1412,11 +1430,18 @@ export default { } .custom-tree-node { + flex: 1; + display: flex; align-items: center; justify-content: space-between; font-size: 14px; padding-right: 8px; } +.node-label{ + width: 130px; + overflow: hidden; + text-overflow: ellipsis; +} diff --git a/ruoyi-ui/src/views/oa/oaFile/index.vue b/ruoyi-ui/src/views/oa/oaFile/index.vue new file mode 100644 index 0000000..444b76f --- /dev/null +++ b/ruoyi-ui/src/views/oa/oaFile/index.vue @@ -0,0 +1,299 @@ + + + diff --git a/ruoyi-ui/src/views/oa/oaWarehouse/index.vue b/ruoyi-ui/src/views/oa/oaWarehouse/index.vue index 7ada83c..2d33429 100644 --- a/ruoyi-ui/src/views/oa/oaWarehouse/index.vue +++ b/ruoyi-ui/src/views/oa/oaWarehouse/index.vue @@ -101,6 +101,7 @@ + @@ -143,6 +144,10 @@ + + + +